程序化创建LayerDrawable

12

由于我的应用程序颜色主题是动态的,因此我只能使用颜色和形状可绘制对象来创建背景可绘制对象。 我想使用颜色和形状构建下面显示的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);

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


如果您的应用主题是动态的,为什么不使用样式?http://developer.android.com/guide/topics/ui/themes.html - Rafael T
我不能在xml中保留像颜色这样的值...在我的情况下,颜色值无论如何都来自服务器,感谢您的时间... :) - zaaak
你有没有想过使用一些图片,并在这些图片上应用颜色滤镜来实现主题呢? - Alan
2个回答

35

我终于搞定了。不再使用 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);

8
更详细的解释会更好。 - jcaruso
你忽略了一件事。setLayerInset()方法接受的是px而不是dp - galcyurio

0

这也适用于渐变Drawable:

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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接