Android - как программно определить ShapeDrawables?

Я пытаюсь использовать Drawable с парой слоев внутри, но контролировать некоторые значения во время выполнения, например startColor для градиента. Вот что у меня в my_layered_shape.xml:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
  <item>
    <shape android:shape="rectangle">
      <stroke android:width="1dp" android:color="#FF000000" />
      <solid android:color="#FFFFFFFF" />
    </shape>
  </item>
  <item android:top="1dp" android:bottom="1dp"> 
    <shape android:shape="rectangle">
    <stroke android:width="1dp" android:color="#FF000000" />
    <gradient
      android:startColor="#FFFFFFFF"
      android:centerColor="#FFFFFF88"
      android:endColor="#FFFFFFFF"
      android:gradientRadius="250"
      android:centerX="1"
      android:centerY="0"
      android:angle="315"
    />            
    </shape>
  </item>
</layer-list>

И если я использую mMyImageView.setBackgroundResource (R.drawable.my_layered_shape), он работает. Я не против разбить xml, если нужно, или сделать все программно, если есть способ получить различные значения цвета. Концепция, которую я использую программно (т.е. мой лучший способ сделать то же самое в коде, что и этот xml):

Drawable[] layers = new Drawable[2];

ShapeDrawable sd1 = new ShapeDrawable(new RectShape());
sd1.getPaint().setColor(0xFFFFFFFF);
sd1.getPaint().setStyle(Style.STROKE);
sd1.getPaint().setStrokeWidth(1);
// sd1.getPaint().somehow_set_stroke_color?

ShapeDrawable sd2 = new ShapeDrawable(new RectShape());
sd2.getPaint().setColor(0xFF000000);
sd2.getPaint().setStyle(Style.STROKE);
// sd2.getPaint().somehow_set_stroke_color?
// sd2.getPaint().somehow_set_gradient_params?

layers[0] = sd1;
layers[1] = sd2;
LayerDrawable composite = new LayerDrawable(layers);
mMyImageView.setBackgroundDrawable(composite);

Спасибо.

27
задан Carl Whalley 22 August 2011 в 16:35
поделиться

1 ответ

Кажется, что это не работает с ShapeDrawable , но взгляните на мой пример GradientDrawable :

GradientDrawable gd = new GradientDrawable(Orientation.BOTTOM_TOP, new int[]{Color.RED, Color.GREEN});
gd.setStroke(10, Color.BLUE);

Вам также может понадобиться следующий метод:

gd.setGradientCenter(float x, float y);
gd.setGradientRadius(float gradientRadius);
25
ответ дан 28 November 2019 в 05:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: