美文网首页
Glide根据控件长宽,以一边为基准等比例缩放图片,最后居中

Glide根据控件长宽,以一边为基准等比例缩放图片,最后居中

作者: 飞哥278999401 | 来源:发表于2022-12-01 21:10 被阅读0次

网上关于BitmapTransformation也没啥好的例子,我下了份源码,抄抄改改,不知道改的对不对,反正效果实现了,一开始我直接返回new Bitmap,看源码都不这么用,源码都是从BitmapPool去拿的Bitmap了,不知道是不是要复用,反正抄就完事了。最后效果实现了

import android.graphics.Bitmap
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool
import com.bumptech.glide.load.resource.bitmap.BitmapTransformation
import java.security.MessageDigest

class GlideBitmapTransformation : BitmapTransformation() {


    private val ID = "com.bumptech.glide.transformations.GlideBitmapTransformation"
    private val ID_BYTES: ByteArray = ID.toByteArray(charset(STRING_CHARSET_NAME))

    override fun updateDiskCacheKey(messageDigest: MessageDigest) {
        messageDigest.update(ID_BYTES)
    }

    override fun equals(o: Any?): Boolean {
        return o is GlideBitmapTransformation
    }

    override fun hashCode(): Int {
        return ID.hashCode()
    }

    override fun transform(
        pool: BitmapPool,
        toTransform: Bitmap,
        outWidth: Int,
        outHeight: Int
    ): Bitmap {

        return TransformationUtil.centerScale(pool, toTransform, outWidth, outHeight)

    }


}



import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Matrix
import android.graphics.Paint
import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool
import com.bumptech.glide.load.resource.bitmap.TransformationUtils
import java.util.concurrent.locks.ReentrantLock

object TransformationUtil {

    private val BITMAP_DRAWABLE_LOCK = ReentrantLock()

    private val DEFAULT_PAINT = Paint(TransformationUtils.PAINT_FLAGS)


    fun centerScale(
        pool: BitmapPool, toTransform: Bitmap, outWidth: Int, outHeight: Int
    ): Bitmap {
        if (toTransform.getWidth() == outWidth && toTransform.getHeight() == outHeight) {

            return toTransform
        }
        val config = getNonNullConfig(toTransform)

        val toReuse = pool[outWidth, outHeight, config]

        val width: Int = toTransform.getWidth()
        val height: Int = toTransform.getHeight()
        val scaleWidth: Float = outWidth.toFloat() / width
        val scaleHeight: Float = outHeight.toFloat() / height
        val matrix = Matrix()
        val dx: Float
        val dy: Float

        if (scaleWidth > scaleHeight) {


            dx = (outWidth - toTransform.getWidth() * scaleHeight) * 0.5f
            dy = 0f

            matrix.postScale(scaleHeight, scaleHeight)

        } else {

            dx = 0f
            dy = (outHeight - toTransform.getHeight() * scaleWidth) * 0.5f

            matrix.postScale(scaleWidth, scaleWidth)
        }

        matrix.postTranslate(dx, dy)

        applyMatrix(toTransform, toReuse, matrix)

        return toReuse
    }

    private fun getNonNullConfig(bitmap: Bitmap): Bitmap.Config? {
        return if (bitmap.config != null) bitmap.config else Bitmap.Config.ARGB_8888
    }

    private fun applyMatrix(
        inBitmap: Bitmap, targetBitmap: Bitmap, matrix: Matrix
    ) {
        BITMAP_DRAWABLE_LOCK.lock()
        try {
            val canvas = Canvas(targetBitmap)
            canvas.drawBitmap(inBitmap, matrix, DEFAULT_PAINT)
            clear(canvas)
        } finally {
            BITMAP_DRAWABLE_LOCK.unlock()
        }
    }

    private fun clear(canvas: Canvas) {
        canvas.setBitmap(null)
    }
}





        Glide.with(holder.itemView)
            .load(data.filePath)
            .transform(GlideBitmapTransformation())
            .into(holder.imageView)

相关文章

网友评论

      本文标题:Glide根据控件长宽,以一边为基准等比例缩放图片,最后居中

      本文链接:https://www.haomeiwen.com/subject/oilyfdtx.html