2013-08-02 2 views
4

У меня есть сценарий, где мне нужно иметь большое количество индикаторов выполнения. Я не могу создать xml-ресурсы для всех, потому что я хочу, чтобы пользователь выбирал цвет, который затем будет использоваться для динамического создания drawable. Ниже приведена одна такая возможность для рисования в xml, как я могу создать эту программу для точной тиражирования?Создайте прогресс, доступный программно

<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> 
+2

Этот http://stackoverflow.com/a/8019888/1321873 должен вам помочь. – Rajesh

+2

Возможный дубликат [Create Custom Seekbar Programatically (No XML)] (http://stackoverflow.com/questions/14510343/create-custom-seekbar-programatically-no-xml) – g00dy

ответ

13

Из ссылок, предоставленных 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; 
} 

Этот код создаст обратимое, которое визуально похоже на то, что создает xml в моем вопросе.

+0

Вы также должны установить идентификаторы 'android.R. id.background' и 'android.R.id.progress' (и' android.R.id.secondaryProgress', если необходимо) для слоев через 'layerDrawable.setId (...)'. – kuelye

Смежные вопросы