如何在运行时使用StateListDrawable?

时间:2015-03-02 11:31:18

标签: android gridview android-resources statelistdrawable

我遇到一些代码问题。我想创建一个ColorPicker DialogFragment。目前,我使用GridView和自定义BaseAdapter来显示一些颜色形状。对于每种颜色,我使用圆形ShapeDrawable。要设置默认状态的颜色,我使用以下代码:

我的“ColorAdapter”的getView()

ImageView imageView;
if (convertView == null) {  
    imageView = new ImageView(ctx);
    imageView.setLayoutParams(new GridView.LayoutParams(85, 85));
    imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
    imageView.setPadding(8, 8, 8, 8);
} else {
    imageView = (ImageView) convertView;
}

Drawable drawable = ctx.getResources().getDrawable(R.drawable.color_item);
imageView.setBackground(drawable);

StateListDrawable states = (StateListDrawable) imageView.getBackground();

GradientDrawable shape = (GradientDrawable) states.getCurrent();
shape.setColor(colors[i]);

return imageView;

这对我来说很好。

但是我想在按下图标时更改图标的颜色。所以我使用StateListDrawable

<selector xmlns:android="http://schemas.android.com/apk/res/android" 
     android:constantSize="true" >

     <item 
          android:state_pressed="true"
          android:drawable="@drawable/circle" />
     <item
          android:drawable="@drawable/circle" />

</selector>

但是,因为GridView中的每个条目都有不同的颜色,所以我必须在运行时更改状态的颜色。

如您所见,我对两种状态使用相同的可绘制资源。也许我可以设置一个状态的颜色,就像我使用states.getCurrent()

一样

我还尝试使用ColorFilter来降低亮度级别。但是当我尝试这样做时,ImageView总是是黑色的,当它被按下时。

有人知道怎么做吗?

1 个答案:

答案 0 :(得分:0)

好的,我找到了解决方案。我使用带有两层的LayerDrawable,第一层包含我的形状,第二层包含StateListDrawable。此StateListDrawable包含一个用于默认状态的空形状和一个具有较低alpha值的灰色形状。所以现在,当我按下我的色圈时,灰色的形状会被放在我的颜色形状上。