在Android中,我有一个包含图像和文本的按钮。禁用该按钮时,文本将自动显示为灰色,但图像保持不变。如果禁用按钮而没有两个单独的图像,是否可以使图像变暗?
答案 0 :(得分:6)
在您的代码中,您还可以使用ColorFilter,特别是PorterDuffColorFilter,其模式为DARKEN
。
对于Drawable
的不透明度,您还可以使用setAlpha()。
要获得问题button.getCompoundDrawables()
中的Drawable
s(位图,...),可以使用。
我不确定这是否可行,但也许您想调查是否可以通过状态列表配置按钮的位图,而状态列表又指两个可绘制的,其中一个引用过滤器。非常复杂,但是如果您不能/不会使用代码,那么以这种方式使用XML可能是可行的。
答案 1 :(得分:2)
终于搞定了!
我还没有找到通过在XML中设置图像来实现此目的的方法,因此必须在代码中设置它。这就是我的工作原理:
Button btnObjects = (Button)this.findViewById(R.id.button_objects);
Bitmap bm = BitmapFactory.decodeResource(context.getResources(), R.drawable.button_image_objects);
if( <button needs to be disabled> )
{
btnObjects.setEnabled(false);
bm = adjustOpacity(bm, 128);
}
else
{
btnObjects.setEnabled(true);
}
btnObjects.setCompoundDrawablesWithIntrinsicBounds(null, new BitmapDrawable(bm), null, null);
//and here's where the magic happens
private Bitmap adjustOpacity(Bitmap bitmap, int opacity)
{
//make sure bitmap is mutable (copy of needed)
Bitmap mutableBitmap = bitmap.isMutable()
? bitmap
: bitmap.copy(Bitmap.Config.ARGB_8888, true);
//draw the bitmap into a canvas
Canvas canvas = new Canvas(mutableBitmap);
//create a color with the specified opacity
int colour = (opacity & 0xFF) << 24;
//draw the colour over the bitmap using PorterDuff mode DST_IN
canvas.drawColor(colour, PorterDuff.Mode.DST_IN);
//now return the adjusted bitmap
return mutableBitmap;
}
答案 2 :(得分:1)
在上面的场景中,我猜你可以使用selector.xml作为按钮的背景。然后,您可以使用<item android:state_enabled="false" android:color="@color/testcolor3" />
相应地标记。