Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android中带有渐变的着色图标_Android_Kotlin_View_Gradient_Programmatically - Fatal编程技术网

Android中带有渐变的着色图标

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

我有一个图标,必须按程序着色。我从后端收到两种颜色作为字符串(例如“#FFFFFF”和“#AAAAAA”),其中一种将用作startGradient值,另一种用作endGradient值

接下来的几行以编程方式创建渐变

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
    }