LayerDrawable 以编程方式

Posted

技术标签:

【中文标题】LayerDrawable 以编程方式【英文标题】:LayerDrawable programmatically 【发布时间】:2013-12-05 21:48:25 【问题描述】:

由于我的应用程序的颜色主题是动态的,我只能使用颜色和 shapedrawables 创建背景可绘制对象, 我想用颜色和形状构建一个可绘制的edittext背景,如下所示。 但我想以编程方式做到这一点

如何以编程方式构建相同的可绘制对象?

<item>
    <shape>
        <solid android:color="@android:color/yellow" />
    </shape>
</item>

<!-- main color -->
<item
    android:bottom="1dp"
    android:left="1dp"
    android:right="1dp">
    <shape>
        <solid android:color="@android:color/white" />
    </shape>
</item>

<!-- draw another block to cut-off the left and right bars -->
<item android:bottom="10dp">
    <shape>
        <solid android:color="@android:color/white" />
    </shape>
</item>

这是我尝试过的......

    GradientDrawable border = new GradientDrawable();
    border.setShape(GradientDrawable.RECTANGLE);
    border.setColor(Color.WHITE);

    GradientDrawable background = new GradientDrawable();
    background.setShape(GradientDrawable.RECTANGLE);
    background.setColor(Color.YELLOW);


    GradientDrawable clip = new GradientDrawable();
    clip.setShape(GradientDrawable.RECTANGLE);
    border.setColor(Color.WHITE);

    Drawable[] layers = background, border, clip;
    LayerDrawable layerDrawable = new LayerDrawable(layers);

    layerDrawable.setLayerInset(0, 0, 0, 0, 0);
    layerDrawable.setLayerInset(1, 1, 0, 1, 1);
    layerDrawable.setLayerInset(2, 0, 0, 0, 10);

但结果不同....请帮助....!

【问题讨论】:

如果您的 App-Theme 是动态的,为什么不使用样式? developer.android.com/guide/topics/ui/themes.html 我也无法在 xml 中保留颜色等值...在我的情况下,颜色值无论如何都来自服务器,感谢您的时间...:) 你有没有想过使用一些图像并在这些图像上应用颜色过滤器来实现主题。 【参考方案1】:

我终于让它工作了。我没有使用GradientDrawable,而是使用ShapeDrawable

通过将此LayerDrawable 设置为EditText 背景,您可以重新生成默认EditText 具有自定义颜色的样式。

ShapeDrawable border = new ShapeDrawable();
border.getPaint().setColor(Color.WHITE);

ShapeDrawable background = new ShapeDrawable();
background.getPaint().setColor(Color.BLACK);


ShapeDrawable clip = new ShapeDrawable();
clip.getPaint().setColor(Color.WHITE);

Drawable[] layers = background, border, clip;
LayerDrawable layerDrawable = new LayerDrawable(layers);

layerDrawable.setLayerInset(0, 0, 0, 0, 0);
layerDrawable.setLayerInset(1, 1, 0, 1, 1);
layerDrawable.setLayerInset(2, 0, 0, 0, 10);

【讨论】:

更多解释会更好。 您错过了一件事。 setLayerInset() 方法接受 px,而不是 dp【参考方案2】:

这也适用于渐变可绘制对象:

GradientDrawable border = new GradientDrawable();
border.setColor(Color.White);

GradientDrawable background = new GradientDrawable();
background.setColor(Color.Black);

GradientDrawable clip = new GradientDrawable();
clip.setColor(Color.White);

GradientDrawable[] layers = background, border, clip;
LayerDrawable layerDrawable = new LayerDrawable(layers);

layerDrawable.setLayerInset(0, 0, 0, 0, 0);
layerDrawable.setLayerInset(1, 1, 0, 1, 1);
layerDrawable.setLayerInset(2, 0, 0, 0, 10);

【讨论】:

以上是关于LayerDrawable 以编程方式的主要内容,如果未能解决你的问题,请参考以下文章

Android:以编程方式将颜色设置为 ProgressBar

以编程方式更改图层列表可绘制项的底部属性

Kotlin - 将 Kotlin 方法转换为 Java 以用于 LayerDrawable 的问题

LayerDrawable OutOfMemoryError

LayerDrawable 移除一个图层

LayerDrawable 一起变化