Android中带有渐变的着色图标
我有一个图标,必须按程序着色。我从后端收到两种颜色作为字符串(例如“#FFFFFF”和“#AAAAAA”),其中一种将用作startGradient值,另一种用作endGradient值 接下来的几行以编程方式创建渐变Android中带有渐变的着色图标,android,kotlin,view,gradient,programmatically,Android,Kotlin,View,Gradient,Programmatically,我有一个图标,必须按程序着色。我从后端收到两种颜色作为字符串(例如“#FFFFFF”和“#AAAAAA”),其中一种将用作startGradient值,另一种用作endGradient值 接下来的几行以编程方式创建渐变 val startGradientColor = Color.parseColor(it.gradientStart) val endGradientColor = Color.parseColor(it.gradientEnd) val grad = GradientDrawa
val startGradientColor = Color.parseColor(it.gradientStart)
val endGradientColor = Color.parseColor(it.gradientEnd)
val grad = GradientDrawable(TOP_BOTTOM, intArrayOf(startGradientColor, endGradientColor))
grad.cornerRadius = 0f
一旦梯度创建,我只需要着色图标。
我尝试将渐变设置为背景,但这种方法会给背景上色,但不会给图标上色。
下面是我尝试的代码
binding.leagueBadge.background = grad
我希望你们有解决办法。提前感谢各位,我找到了一个棘手的解决办法。 然而,我希望Android能很快实现一种干净直接的方式来实现这一点 让我们看看解决方案: 对于以编程方式为图像设置渐变的情况,我将图像重绘到imageview中。 下面的方法将imageview强制转换为位图,手动设置高度和宽度(这些值必须保持原始资源的纵横比,才能不修改原始资源)并传递渐变颜色。颜色是我创建的一个对象,它包含到字符串(gradientStart和gradientEnd) 上面的方法重新绘制接收到的位图,应用渐变(我上面提到的颜色对象)并返回位图(应用渐变的资源),然后您可以将此位图设置为返回到所需的imageview中
fun addGradient(originalBitmap: Bitmap, colors: Colors): Bitmap? {
val width = originalBitmap.width
val height = originalBitmap.height
val updatedBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
val canvas = Canvas(updatedBitmap)
canvas.drawBitmap(originalBitmap, 0.toFloat(), 0.toFloat(), null)
val paint = Paint()
val shader = LinearGradient(0.toFloat(), 0.toFloat(), 0.toFloat(), height.toFloat(), Color.parseColor(colors.gradientStart), Color.parseColor(colors.gradientEnd), Shader.TileMode.CLAMP)
paint.shader = shader
paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_IN)
canvas.drawRect(0.toFloat(), 0.toFloat(), width.toFloat(), height.toFloat(), paint)
return updatedBitmap
}
对于将渐变应用于CardView背景的情况,我没有找到不同的方法,只是在CardView中添加了一个RelativeLayout,其大小与父对象的大小匹配。然后,不将渐变应用于CardView的背景,而是应用于RelativeLayout的背景
下面的方法就是这样做的:
private fun setMedalRankingColor(gradientColors: Colors) {
val color = intArrayOf(Color.parseColor(gradientColors.gradientStart), Color.parseColor(gradientColors.gradientEnd))
val gradient = GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM, color)
gradient.cornerRadius = 0f
binding.medal.background = gradient
}
我希望能帮助一些人,如果比这更好的话,我会和大家分享你的解决方案
干杯 什么样的图标?启动图标,或者只是一个出现在应用程序中的某个活动中的可绘制图标?到一个可绘制图标。它是图像视图中的一个图标位置。我还需要将渐变颜色设置为CardView背景。因此,是否要重新着色您放置在ImageView中的绘图表?是的,将绘图表着色并将颜色设置为卡的背景。记住颜色是渐变色。
private fun setMedalRankingColor(gradientColors: Colors) {
val color = intArrayOf(Color.parseColor(gradientColors.gradientStart), Color.parseColor(gradientColors.gradientEnd))
val gradient = GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM, color)
gradient.cornerRadius = 0f
binding.medal.background = gradient
}