web-dev-qa-db-ja.com

Android-プログラムでShapeDrawableを定義する方法は?

私が達成しようとしているのは、内部にいくつかのレイヤーを持つ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

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
marnaish

これをここに残すだけです...まだテストされていません

 /**
 * Created by Nedo on 09.04.2015.
 */
public class ShapeBuilder {

    public static Drawable generateSelectorFromDrawables(Drawable pressed, Drawable normal) {
        StateListDrawable states = new StateListDrawable();
        states.addState(new int[]{ -Android.R.attr.state_focused, -Android.R.attr.state_pressed, -Android.R.attr.state_selected}, normal);
        states.addState(new int[]{ Android.R.attr.state_pressed}, pressed);
        states.addState(new int[]{ Android.R.attr.state_focused}, pressed);
        states.addState(new int[]{ Android.R.attr.state_selected}, pressed);

        return states;
    }

    public static Drawable generateShape(String colorTop, String colorBot, String colorStroke, int stokeSize, float strokeRadius) {
        int top, bot, stroke;
        top = Color.parseColor(colorTop);
        bot = Color.parseColor(colorBot);
        stroke = Color.parseColor(colorStroke);

        GradientDrawable drawable = new GradientDrawable(GradientDrawable.Orientation.BOTTOM_TOP, new int[]{top, bot});
        drawable.setStroke(stokeSize, stroke);
        drawable.setCornerRadius(strokeRadius);

        return drawable;
    }

    public static Drawable buildSelectorShapeFromColors(String colorNormalStroke, String colorNormalBackTop, String colorNormalBackBot,
                                                        String colorPressedStroke, String colorPressedBackTop, String colorPressedBackBot,
                                                        int strokeSize, float strokeRadius) {

        Drawable pressed = generateShape(colorPressedBackTop, colorPressedBackBot, colorPressedStroke, strokeSize, strokeRadius);
        Drawable normal = generateShape(colorNormalBackTop, colorNormalBackBot, colorNormalStroke, strokeSize, strokeRadius);
        return generateSelectorFromDrawables(pressed, normal);
    }
}

編集:テスト済み今、1つの間違いがありました。実際には、すべての状態を説明する必要があります。グループ状態をグループ化すると、それらすべてが一度に獲得した場合にのみトリガーされます...

5
BooNonMooN