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>
是否可以使用 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>