Android形状XML旋转的可绘制对象如何在程序中动态更改颜色

3

这是一个三角形的 XML:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:id="@+id/shape_id">
        <rotate
            android:fromDegrees="45"
            android:toDegrees="45"
            android:pivotX="-40%"
            android:pivotY="87%" >
            <shape android:shape="rectangle" >
                <stroke android:width="10dp"/>
            </shape>
        </rotate>
    </item>
</layer-list>

这是一个TextView的背景

<TextView
    android:id="@+id/headlineSelect_TXT2"
    android:layout_width="50dp"
    android:layout_height="50dp"
    android:layout_weight="1"
    android:background="@drawable/category_triangle_shape1"
    android:visibility="invisible" />

我希望能够通过编程来改变形状的颜色。我尝试了这个方法,但是却遇到了空指针异常。

LayerDrawable bgDrawable = (LayerDrawable) getActivity()
    .getResources()
    .getDrawable(R.drawable.category_triangle_shape1);
final GradientDrawable shape = (GradientDrawable) bgDrawable
    .findDrawableByLayerId(R.id.shape_id);
shape.setStroke(10,Color.GREEN);

我应该如何做到这一点呢?感谢您的帮助。
3个回答

15

这有点棘手,需要进行许多类型转换:

TextView view = (TextView) findViewById( R.id.my_text_view );

// Get the drawable from the view, if you're using an imageview src
// element you'll go with view.getDrawable()
LayerDrawable layers = (LayerDrawable) view.getBackground();

// Now get your shape by selecting the id
RotateDrawable rotate = (RotateDrawable) layers.findDrawableByLayerId( R.id.shape_id );

// Finally you can access the underlying shape
GradientDrawable drawable = (GradientDrawable) rotate.getDrawable();

// ... and do you fancy things
drawable.setColor( ... );

感谢@Taig的宝贵帮助,这个东西运行得很好,非常棒,我能够在我的项目中使用它 https://github.com/harsh159357/InstaTag/commit/ded64bd112adb71aca0c1f7eb071a2d339c8059a - Harsh Sharma

0
如果您的res/drawable文件夹中的xml文件中有RotateDrawable,则可以尝试以下代码来更改旋转可绘制对象的颜色。
LayerDrawable layers = (LayerDrawable) getResources().getDrawable(R.drawable.triangle);
RotateDrawable rotateShape = (RotateDrawable) (layers.findDrawableByLayerId(R.id.user_color));
GradientDrawable shape = (GradientDrawable) rotateShape.getDrawable();
shape.setColor(Color.parseColor("#FF0000"));
TextView NotchTV = (TextView) view.findViewById(R.id.bubble_notch);
NotchTV.setBackgroundDrawable(layers);

`


0

忘掉XML,像这样通过代码实现:

   TextView txtView = (TextView)findViewById(R.id. headlineSelect_TXT2);
    ShapeDrawable.ShaderFactory sf = new ShapeDrawable.ShaderFactory() {
        @Override
        public Shader resize(int width, int height) {
            LinearGradient lg = new LinearGradient(0, 0, 0, txtView.getHeight(),
                new int[] { 
                    Color.LIGHT_GREEN, 
                    Color.WHITE, 
                    Color.MID_GREEN, 
                    Color.DARK_GREEN },  
                new float[] {
                    0, 0.45f, 0.55f, 1 },
                Shader.TileMode.REPEAT);
             return lg;
        }
    };
    PaintDrawable p = new PaintDrawable();
    p.setShape(new RectShape());
    p.setShaderFactory(sf);
    txtView.setBackgroundDrawable((Drawable)p);

谢谢您的回答,但这是一个矩形形状。我需要一个三角形。 - skhizein

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