kotlin - Glide显示三角形图片

核心知识点:BitmapTransformationPathsetXfermode,跟自定义view一样,都是使用canvas

/**
 * Author : wn
 * Email : maoning20080808@163.com
 * Date : 2025/6/5 17:03
 * Description : 结合Glide,继承BitmapTransformation,使用canvas实现三角形
 * 原理:通过Path定义三角形路径,利用 PorterDuff.Mode.SRC_IN 保留路径内的像素。
 * BitmapTransformation 是一个抽象类,继承自 Transformation<Bitmap>,专门用于处理 Bitmap 的转换。Glide 内置的许多图片变换(如圆形裁剪、圆角处理等)都是基于它实现的。
 */
class TriangleTransformation : BitmapTransformation(){

    override fun transform(
        pool: BitmapPool,
        source: Bitmap,
        outWidth: Int,
        outHeight: Int
    ): Bitmap {
        //创建目标Bitmap(大小与原图相同) , Bitmap 复用:始终通过 BitmapPool 获取 Bitmap
        val result = pool.get(source.width, source.height, Bitmap.Config.ARGB_8888)
        val canvas = Canvas(result)

        //定义三角形路径
        val path = Path().apply {
            moveTo(source.width / 2f , 0f)  //顶点
            lineTo(0f, source.height.toFloat()) //左下角
            lineTo(source.width.toFloat(), source.height.toFloat()) //右下角
            close()
        }
        //定义三角形路径 - 看看效果
        /*val path = Path().apply {
            moveTo(source.width / 2f , source.height.toFloat())  //顶点
            lineTo(0f, 0f) //左上角
            lineTo(source.width.toFloat(), 0f) //右上角
            close()
        }*/

        //裁剪并绘制
        val paint = Paint(Paint.ANTI_ALIAS_FLAG)
        canvas.drawPath(path, paint)
        paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_IN)
        canvas.drawBitmap(source, 0f, 0f, paint)
        return result
    }

    //用于生成唯一的缓存键,必须正确实现以确保缓存正确工作。
    override fun updateDiskCacheKey(messageDigest: MessageDigest) {
        messageDigest.update("triangle_transform".toByteArray())
    }

}

使用:

private fun processShapeTriangleCustom(){
    var imageUrl = "http://gips0.baidu.com/it/u=1690853528,2506870245&fm=3028&app=3028&f=JPEG&fmt=auto?w=1024&h=1024"
    Glide.with(this)
        .load(imageUrl)
        .transform(TriangleTransformation())
        .into(binding.glideImageViewCustom)
}
Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。

更多推荐