如何在运行时使用 StateListDrawable?
How to use a StateListDrawable at runtime?
我的一些代码有问题。我想创建一个 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
时它总是黑色的。
有人知道怎么做吗?
好的,我找到了解决办法。我使用了一个有两层的 LayerDrawable
,第一层包含我的形状,第二层包含 StateListDrawable
。此 StateListDrawable
包含一个用于默认状态的空形状和一个具有较低 alpha 值的灰色形状。所以现在,当我按下我的色圈时,灰色形状会覆盖我的颜色形状。
我的一些代码有问题。我想创建一个 ColorPicker DialogFragment
。目前我使用 GridView
和自定义 BaseAdapter
来显示一些颜色形状。对于每种颜色,我使用一个圆形 ShapeDrawable
。要设置默认状态的颜色,我使用以下代码:
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
时它总是黑色的。
好的,我找到了解决办法。我使用了一个有两层的 LayerDrawable
,第一层包含我的形状,第二层包含 StateListDrawable
。此 StateListDrawable
包含一个用于默认状态的空形状和一个具有较低 alpha 值的灰色形状。所以现在,当我按下我的色圈时,灰色形状会覆盖我的颜色形状。