是可绘制的单身人士

时间:2016-09-08 17:08:18

标签: android colors background-image android-drawable

有一种行为不确定它是否应该如此。 如果在视图背景中使用的drawable是与其他视图共享的一个实例,那么如何更改个人的颜色?

将R.drawable.circle_shape作为:

<shape xmlns:android="http://schemas.android.com/apk/res/android"
   android:shape="oval">
    <corners android:radius="10dip"/>
    <solid android:color="#cccccc"/>
</shape>

用作一个片段中的两个实例

    <ImageView
      android:id="@+id/circle_1”
      android:layout_width="22dp"
      android:layout_height="22dp"
      android:gravity="center"
      android:layout_gravity="center"
      android:background="@drawable/circle_shape"
      android:shadowRadius="10.0"
                        />

  <ImageView
      android:id="@+id/circle_2”
      android:layout_width="22dp"
      android:layout_height="22dp"
      android:gravity="center"
      android:layout_gravity="center"
      android:background="@drawable/circle_shape"
      android:shadowRadius="10.0"
                        />

另一个用途是用于其他片段

中列表项的模板
    <ImageView
      android:id="@+id/listItem_image”
      android:layout_width="22dp"
      android:layout_height="22dp"
      android:gravity="center"
      android:layout_gravity="center"
      android:background="@drawable/circle_shape"
      android:shadowRadius="10.0"
                        />

当我更改实例c1的圆形颜色时,我注意到c2和listItem_image也改变了颜色。

View c1 = (View) findViewById(R.id. circle_1);                                
c1.setBackgroundResource(R.drawable.circle_shape);  // with or without this it will still affect the other ImageView which also uses R.drawable.circle_shape as background

((GradientDrawable) c1.getBackground()).setColor(intColor);
((GradientDrawable) c1.getBackground()).setStroke(0, Color.TRANSPARENT);

1 个答案:

答案 0 :(得分:1)

不是真正的单身人士,但你的猜测正朝着正确的方向发展。当你得到一个drawable时,它与其他drawable共享状态。这就是为什么当你修改其中一个时,你修改所有与它共享状态的drawable。

您需要做的是mutate drawable,以便创建新状态。在你的情况下,它看起来像这样:

GradientDrawable drawable = ((GradientDrawable) c1.getBackground()).mutate();
drawable.setColor(intColor);
drawable.setStroke(0, Color.TRANSPARENT);

第一行创建一个新状态,允许接下来的两行仅更改此特定drawable的状态。