以编程方式创建可绘制的进度

kev*_*kev 4 android drawable

我有一个场景,我需要有大量的进度条抽屉.我无法为所有这些创建xml资源,因为我希望用户选择一种颜色,然后用它来动态创建drawable.下面是xml中的一个这样的drawable,我如何以编程方式创建这个精确的drawable?

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
    <shape>
        <solid android:color="@color/transparent" />
        <stroke android:width="2px" android:color="@color/category_blue_stroke"/>
    </shape>
</item>


<item android:id="@android:id/progress">
<clip>
    <shape>
        <solid android:color="@color/category_blue" />
        <stroke android:width="2px" android:color="@color/category_blue_stroke"/>
    </shape>
</clip>
</item>

</layer-list>
Run Code Online (Sandbox Code Playgroud)

kev*_*kev 15

通过Rajesh和g00dy提供的链接,我能够提出一个解决方案.

public static Drawable createDrawable(Context context) {

ShapeDrawable shape = new ShapeDrawable();
shape.getPaint().setStyle(Style.FILL);
shape.getPaint().setColor(
    context.getResources().getColor(R.color.transparent));

shape.getPaint().setStyle(Style.STROKE);
shape.getPaint().setStrokeWidth(4);
shape.getPaint().setColor(
    context.getResources().getColor(R.color.category_green_stroke));

ShapeDrawable shapeD = new ShapeDrawable();
shapeD.getPaint().setStyle(Style.FILL);
shapeD.getPaint().setColor(
    context.getResources().getColor(R.color.category_green));
ClipDrawable clipDrawable = new ClipDrawable(shapeD, Gravity.LEFT,
    ClipDrawable.HORIZONTAL);

LayerDrawable layerDrawable = new LayerDrawable(new Drawable[] {
    clipDrawable, shape });
return layerDrawable;
}
Run Code Online (Sandbox Code Playgroud)

这段代码将创建一个drawable,它在视觉上类似于我的问题中创建的xml.

  • 您还应该通过 `layerDrawable.setId(... )`。 (2认同)