kotlin 如何创建一个两个彩色条纹绘图编程?

cwxwcias  于 2023-06-24  发布在  Kotlin
关注(0)|答案(1)|浏览(100)

类似于10年前问的这个问题:banded background with two colors?
我需要创建一个drawable作为一个通用视图的背景,它有两个不同的矩形条纹颜色,就像一面旗帜。奖金,如果我可以使其中一个矩形有弯曲的角落。不幸的是,我需要动态地设置颜色,所以我不能在xml中定义这个drawable。如何在Kotlin中实现这一点?
我最好的猜测是这样的,但它不起作用:

background = LayerDrawable(
    arrayOf(
        GradientDrawable().apply {
            shape = GradientDrawable.RECTANGLE
            layout(0, 0, 100, 20)
            background = styles.rootBackground
        },
        GradientDrawable().apply {
            shape = GradientDrawable.RECTANGLE
            cornerRadii = floatArrayOf(8f, 8f, 8f, 8f, 0f, 0f, 0f, 0f)
            layout(0, 20, 100, 40)
            color = styles.robotTextBackgroundColor //requires color state list ?!
        }
    )
)
tv6aics1

tv6aics11#

不幸的是,我需要动态地设置颜色,所以我不能在xml中定义这个drawable。
不,您可以将其作为XML可绘制的文件,将其扩展为代码,然后更改颜色。这比从头开始编写代码要容易得多。
但这需要将ID附加到图层列表项,您需要更改其颜色
下面是引用的post的演示:
R.drawable.test:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/redRect"
        android:bottom="20dp">
        <shape android:shape="rectangle">
            <size android:height="20dp" />
            <solid android:color="#ff0000" />
        </shape>
    </item>

    <item
        android:id="@+id/blueRect"
        android:top="20dp">
        <shape android:shape="rectangle">
            <size android:height="20dp" />
            <solid android:color="#0000ff" />
        </shape>
    </item>

</layer-list>

在这里,我们将redRect项的颜色从红色更改为绿色,然后将整个drawable设置为根视图背景:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val background = ResourcesCompat.getDrawable(resources, R.drawable.test, null)
    if (background is LayerDrawable) {
        val bgLayer =
            background.findDrawableByLayerId(R.id.redRect) as GradientDrawable

        bgLayer.setColor(Color.GREEN)

        findViewById<ConstraintLayout>(R.id.root).background = background
    }
}

奖金,如果我可以使其中一个矩形有弯曲的角落。
在形状中使用<corners>标记,并定义半径:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:id="@+id/redRect"
        android:bottom="20dp">
        <shape android:shape="rectangle">
            <size android:height="20dp" />
            <solid android:color="#ff0000" />
            <corners android:radius="30dp" />
        </shape>
    </item>

    <item
        android:id="@+id/blueRect"
        android:top="20dp">
        <shape android:shape="rectangle">
            <size android:height="20dp" />
            <solid android:color="#0000ff" />
            <corners
                android:bottomLeftRadius="30dp"
                android:bottomRightRadius="30dp" />
        </shape>
    </item>

</layer-list>

相关问题