【CustomView】Glide+BitmapTransformation 图片上下边框波浪处理(WaveTransformation)

这篇博客介绍了如何使用自定义的WaveTransformation类,该类继承于BitmapTransformation,来实现图片上下边框呈波浪状的效果。通过在Glide加载图片时应用这个转换,可以给图片添加独特的视觉样式。示例代码展示了如何在Glide请求中使用这个自定义转换,并提供了一个方便的一行代码调用来加载带波浪边框的图片。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

### 用到Glide来显示图片,就会需要添加Transformation来处理图片的圆形、圆角 以及其他样式,Transformation有各种各样的样式,这里我们需要实现下图效果:

*该篇封装的Transformation继承于BitmapTransformation来支持Glide。

如何实现:
 

/**
 * 使图片的上下边框呈波浪状
 *
 * @property waveCorners 波浪直径
 */
class WaveTransformation(private val waveCorners: Int) : BitmapTransformation() {

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

    override fun transform(
        pool: BitmapPool,
        toTransform: Bitmap,
        outWidth: Int,
        outHeight: Int
    ): Bitmap {
        val canvasBitmap = Bitmap.createBitmap(
            toTransform.width,
            toTransform.height,
            Bitmap.Config.ARGB_8888
        )
        val canvas = Canvas(canvasBitmap)  // 创建画板
        val paint = Paint().apply {
            isAntiAlias = true
            shader = BitmapShader(toTransform, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP)
        } // 创建画笔,画笔内容为该 Bitmap
        
        // 计算可以分成多少个小波浪
        val index = canvas.width / waveCorners
        var rectLeft = 0f
        try {
            TransformationUtils.getBitmapDrawableLock().lock()
            // 循环绘制
            for (i in 0 .. index) {
                val rect = RectF(
                    rectLeft,
                    0f,
                    (rectLeft + waveCorners).toInt().toFloat(),
                    canvas.height.toFloat()
                )
                canvas.drawRoundRect(rect, waveCorners / 2f, waveCorners / 2f, paint)
                rectLeft = (rectLeft + waveCorners).toInt().toFloat()
            }
            // 判断是否需要执行最后一次绘制
            if (rectLeft < canvas.width.toFloat()){
                val rect = RectF(
                    rectLeft,
                    0f,
                    canvas.width.toFloat(),
                    canvas.height.toFloat()
                )
                canvas.drawRoundRect(rect, waveCorners / 2f, waveCorners / 2f, paint)
            }
            canvas.setBitmap(null)
        } finally {
            TransformationUtils.getBitmapDrawableLock().unlock()
        }
        return canvasBitmap
    }

    companion object {
        private const val ID = "WaveTransformation"
        private val ID_BYTES = ID.toByteArray(CHARSET)
    }
}

在Glide中使用:

val requestOptions =
    RequestOptions().transform(CenterCrop(), WaveTransformation(25))
Glide.with(context)
.load(url)
.thumbnail(0.2f)
.apply(requestOptions)
.into(view)

继续封装:

fun <T>ImageView.loadWaveCorner(url: T, waveCorners: Int) {
    if (context != null) {
        val requestOptions =
            RequestOptions().transform(CenterCrop(), WaveTransformation(waveCorners))
        loadImage(context, this, url, requestOptions)
    }
}

private fun <T> loadImage(
    context: Context,
    view: ImageView,
    url: T,
    requestOptions: RequestOptions,
) {
    Glide.with(context)
        .load(url)
        .thumbnail(0.2f)
        .apply(requestOptions)
        .into(view)
}

一行代码调用: 

iv.loadWaveCorner(url, 25)


参考:

Glide: https://github.com/bumptech/glide

Transformations:https://github.com/wasabeef/glide-transformations


 

最后,欢迎讨论。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值