Android ImageButton禁用UI的感觉

我有一个ImageButton被禁用(不可点击或设置为禁用)。 我想给用户一个用户界面的感觉,它没有使用任何其他图像被禁用。

有没有办法做到这一点?

Solutions Collecting From Web of "Android ImageButton禁用UI的感觉"

与常规Button不同,具有图像背景的ImageButtonButton在禁用时不会变灰。 您实际上必须使用另一个图像或以显示为灰色的方式处理它。

如果使用其他图像,你可以通过使用<selector> (这里是关联到一个普通的Button但这个是相同的):

  • /drawable/my_selector.xml

     <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_enabled="false" android:drawable="@drawable/button_gray" /> ***button_gray is a Drawable image*** <item android:state_pressed="true" android:drawable="@drawable/button_gray" /> <item android:drawable="@drawable/button_red" /> ***button_red is a Drawable image*** </selector> 

请注意,在select器中,逻辑按顺序应用每个项目的项目。 在这里, button_red被一直使用,但是当button被禁用或被按下时。

  • 你的layout.xml

     <Button android:id="@+id/myButton" android:background="@drawable/my_selector" ***this is a reference to the selector above *** android:layout_width="wrap_content" android:layout_height="wrap_content" /> 

如果使用其他图像是一个问题,其他答案(例如@ Tronman's或@ southerton's)给了您以编程方式处理图像的方式。

@ Oleg Vaskevich在这里给出了一个不同的解决scheme: 禁用ImageButton

他的解决scheme允许您在不创build额外图像或使用<selector>情况下灰显ImageButton

 /** * Sets the image button to the given state and grays-out the icon. * * @param enabled The state of the button * @param item The button item to modify * @param iconResId The button's icon ID */ public static void setImageButtonEnabled(Context ctxt, boolean enabled, ImageButton item, int iconResId) { item.setEnabled(enabled); Drawable originalIcon = ctxt.getResources().getDrawable(iconResId); Drawable icon = enabled ? originalIcon : convertDrawableToGrayScale(originalIcon); item.setImageDrawable(icon); } /** * Mutates and applies a filter that converts the given drawable to a Gray * image. This method may be used to simulate the color of disable icons in * Honeycomb's ActionBar. * * @return a mutated version of the given drawable with a color filter applied. */ public static Drawable convertDrawableToGrayScale(Drawable drawable) { if (drawable == null) return null; Drawable res = drawable.mutate(); res.setColorFilter(Color.GRAY, Mode.SRC_IN); return res; } 

您可以将其设置为不可点击,并设置alpha以显示您提到的感觉。

在@tronman答案详细说明,你也可以编写一个函数,将灰色dynamic加载drawables(即不是从资源,例如从原始svg文件加载和转换为BitmapDrawables飞)。

 /** * Sets the specified image buttonto the given state, while modifying or * "graying-out" the icon as well * * @param enabled The state of the menu item * @param item The menu item to modify * @param originalIcon The drawable */ public static void setImageButtonEnabled(Context ctxt, boolean enabled, ImageButton item, Drawable originalIcon) { item.setEnabled(enabled); Drawable res = originalIcon.mutate(); if (enabled) res.setColorFilter(null); else res.setColorFilter(Color.GRAY, PorterDuff.Mode.SRC_IN); } 

如果你在背景上也有一个不透明的可绘图(用android:background设置),请参考select器Android:如何使可绘制的select器也可以修改背景。

我更喜欢覆盖ImageButton中的setEnabled()方法来相应地更改图像的alpha属性。 所以当button被禁用时,图像将是部分透明的并且更加禁用。

 public class CustomImageButton extends ImageButton { //... @Override public void setEnabled(boolean enabled) { if(this.isEnabled() != enabled) { this.setImageAlpha(enabled ? 0xFF : 0x3F); } super.setEnabled(enabled); } } 

不,你的形象是区分的因素..所以如果你不想改变图像,那么你不能分辨图像button是否被禁用,启用,按下。