android: create circular image with picasso

后端 未结 10 803
天命终不由人
天命终不由人 2020-11-29 18:31

The question had been asked and there had been a promise made for the very version of Picasso that I am using: How do I send a circular bitmap to an ImageView using Picasso?

10条回答
  •  粉色の甜心
    2020-11-29 18:50

    This one is working with the current Picasso 3 snapshot:

    class CircleTransformation : Transformation {
    
      override fun transform(source: RequestHandler.Result): RequestHandler.Result {
        if (source.bitmap == null) {
          return source
        }
    
        var bitmap: Bitmap
    
        // since we cant transform hardware bitmaps create a software copy first
        if (VERSION.SDK_INT >= VERSION_CODES.O && source.bitmap!!.config == Config.HARDWARE) {
          val softwareCopy = source.bitmap!!.copy(Config.ARGB_8888, true)
          if (softwareCopy == null) {
            return source
          } else {
            bitmap = softwareCopy
            source.bitmap!!.recycle()
          }
        } else {
          bitmap = source.bitmap!!
        }
    
        var size = bitmap.width
        // if bitmap is non-square first create square one
        if (size != bitmap.height) {
          var sizeX = size
          var sizeY = bitmap.height
          size = Math.min(sizeY, sizeX)
          sizeX = (sizeX - size) / 2
          sizeY = (sizeY - size) / 2
    
          val squareSource = Bitmap.createBitmap(bitmap, sizeX, sizeY, size, size)
          bitmap.recycle()
          bitmap = squareSource
        }
    
        val circleBitmap = Bitmap.createBitmap(size, size, Config.ARGB_8888)
        val canvas = Canvas(circleBitmap)
        val paint = Paint()
        val shader = BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)
    
        paint.shader = shader
        paint.isAntiAlias = true
        val centerAndRadius = size / 2f
        canvas.drawCircle(centerAndRadius, centerAndRadius, centerAndRadius, paint)
    
        bitmap.recycle()
        return RequestHandler.Result(circleBitmap, source.loadedFrom, source.exifRotation)
      }
    
      override fun key(): String {
        return "circleTransformation()"
      }
    }
    

    Picasso3 gist: https://gist.github.com/G00fY2/f3fbc468570024930c1fd9eb4cec85a1

提交回复
热议问题