Glide v4 为图像添加圆形渐变前景

Glide v4 add rounded gradient foreground to image

是否可以使用 Glide v4 在位图上添加圆形渐变前景?

我试过了,但是我透支了 RoundedCorners() 转换的角

val requestOptions = RequestOptions().transforms(CenterCrop(), RoundedCorners(14.dp()))
Glide.with(context)
.asBitmap()
.load(item.image)
.apply(requestOptions)
.listener(object : RequestListener<Bitmap> {
    override fun onLoadFailed(@Nullable e: GlideException?, model: Any, target: Target<Bitmap>, isFirstResource: Boolean): Boolean {
        return false
    }

    override fun onResourceReady(resource: Bitmap, model: Any, target: Target<Bitmap>, dataSource: DataSource, isFirstResource: Boolean): Boolean {
        val canvas = Canvas(resource)
        val p = Paint()
        p.shader = LinearGradient(0f, 0f, 0f, resource.height.toFloat(), Color.parseColor("#4c000000"), Color.parseColor("#cc000000"), Shader.TileMode.MIRROR);
        canvas.drawPaint(p)
        return false
    }
})
.into(imageView)

有这样的gradient或smith的Transformation吗?

我知道我可以将 xml 前景设置为 ImageView,但我正在努力避免这种情况。

终于找到了解决方法

如果先下载图片(从网上,我在源位图上画了圆角渐变)

override fun onResourceReady(resource: Bitmap, model: Any, target: Target<Bitmap>, dataSource: DataSource, isFirstResource: Boolean): Boolean {
    if (dataSource == DataSource.REMOTE) {
        val canvas = Canvas(resource)
        canvas.drawBitmap(getBitmap(resource.width, resource.height), 0f,  0f, null)
    }
    return false
}

来自资源的圆角渐变

private fun getBitmap(width: Int, height: Int): Bitmap {
    val drawable = ContextCompat.getDrawable(view.context, R.drawable.image_rounded_foreground_gradient)
    val canvas = Canvas()
    val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
    canvas.setBitmap(bitmap)
    drawable.setBounds(0, 0, drawable.intrinsicWidth, drawable.intrinsicHeight)
    drawable.draw(canvas)

    return bitmap
}

这是image_rounded_foreground_gradient.xml

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient
        android:angle="90"
        android:endColor="#33000000"
        android:startColor="#99000000"
        android:type="linear" />

    <corners
        android:bottomLeftRadius="14dp"
        android:bottomRightRadius="14dp"
        android:topLeftRadius="14dp"
        android:topRightRadius="14dp" />

    <size
        android:width="276dp"
        android:height="340dp" />
</shape>