Android ImageButton具有禁用的UI感觉

Android ImageButton具有禁用的UI感觉,android,image,Android,Image,我有一个禁用的ImageButton(不可单击或设置为禁用)。我想给用户一个UI的感觉,它是禁用而不使用任何其他图像 有什么办法可以做到这一点吗?没有,你的形象是区别的因素。。因此,如果不想更改图像,则无法判断图像按钮是否已禁用、启用或按下。与常规的按钮不同,具有图像背景的图像按钮或按钮在禁用时不会变灰。实际上,您必须使用另一个图像,或者以显示为灰色的方式对其进行处理 如果可以使用其他图像,您可以使用(此处与常规按钮关联,但这与此相同): /drawable/my_selector.xml:

我有一个禁用的ImageButton(不可单击或设置为禁用)。我想给用户一个UI的感觉,它是禁用而不使用任何其他图像


有什么办法可以做到这一点吗?

没有,你的形象是区别的因素。。因此,如果不想更改图像,则无法判断图像按钮是否已禁用、启用或按下。

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

如果可以使用其他图像,您可以使用
(此处与常规
按钮关联,但这与此相同):

  • /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>
    

如果使用另一个图像是一个问题,其他答案(如@Tronman's或@southerton's)提供以编程方式处理图像的方法,使其显示为灰色。

您可以将其设置为不可单击,还可以将alpha设置为显示您提到的那种感觉。

@Oleg Vaskevich在这里为问题提供了不同的解决方案:

他的解决方案允许您在不创建其他图像或使用
的情况下将
图像按钮灰显


详细说明@tronman answer,您还可以编写一个函数,该函数将灰显动态加载的drawables(即,不是来自资源,例如从原始svg文件加载并动态转换为BitmapDrawables)


如果您还有一个非透明的可绘制背景(使用android:background设置),请参阅选择器以同时修改背景。

我更喜欢覆盖ImageButton中的
setEnabled()
方法来相应地更改图像的alpha属性。因此,当按钮被禁用时,图像将部分透明,看起来更加禁用

public class CustomImageButton extends ImageButton {
    //...

    @Override
    public void setEnabled(boolean enabled) {
        if(this.isEnabled() != enabled) {
            this.setImageAlpha(enabled ? 0xFF : 0x3F);
        }
        super.setEnabled(enabled);
    }
}
如果使用Kotlin,则可以创建一个扩展函数,使其看起来更优雅:

fun ImageView.setImageButtonEnabled(enabled: Boolean){
   //Above implementation here
}
并使用以下命令调用它:

yourImageView.setImageButtonEnabled(true/false)

在Kotlin中,您可以利用扩展函数

fun ImageButton.enable() {
    this.isEnabled = true
    this.imageAlpha = 0xFF
}

fun ImageButton.disable() {
    this.isEnabled = false
    this.imageAlpha = 0x3F
}

myButton.enable()
myButton.disable()

仅使用xml资源文件的解决方案:

    <ImageButton
        style="@style/your-style"
        android:tint="@color/but_color"
        android:src="@drawable/button" />
也就是说,我们设置了按钮的颜色(如果使用AndroidX支持库,在每个Android版本上都可以正常工作)。色调本身是颜色状态列表。根据需要设置颜色,这里是灰色表示禁用状态,主题的强调色表示启用状态。

我们只改变颜色,只需要一个图像绘制。但请注意,按钮的整个颜色都将更改。

使用ImageButton上的setImageAlpha,可以完成此操作

在使能的同时,

 ((ImageButton) findViewById(R.id.btnImageButton1)).setEnabled(true);
 ((ImageButton) findViewById(R.id.btnImageButton1)).setImageAlpha(0xFF);
禁用时

 ((ImageButton) findViewById(R.id.btnImageButton1)).setEnabled(false);
 ((ImageButton) findViewById(R.id.btnImageButton1)).setImageAlpha(0x3F);

正如@SnoopDougg所建议的,一个定制的ImageButton类可能是一个不错的主意,它扩展了ImageButton并在里面设置了ImageAlpha;我还没试过,但是

你的意思是如果你禁用它,你想让Android框架灰显或者类似的东西?我会按照Shlublu下面描述的方式来做。选择器非常简单,一旦你知道这一点,它非常有用。是的,我知道这种方法会奏效。但问题是我没有任何资源。如果不使用图像,我们就不能这样做吗?不,您必须使用常规的库存按钮。或者制作图像资源的黑白副本,并将其用作灰显的按钮。使用任何图像编辑器都很容易。还有另一种方法。请参阅下面的解决方案。我发现元素的顺序在my_选择器中很重要。状态为“enabled=“false”的项必须放在默认项的第一位。@DavidCheung是的,绝对是。逻辑采用顺序的方式,每个项目一个项目。你可以通过编程来实现,这样你就不需要提供新的图像。勾选:“请注意,在选择器中,逻辑采用顺序方式,…”我的禁用是最后一项。找了好几个小时。谢谢这是最好的答案,因为它满足了op不使用其他图像的要求。感谢您的解决方案。缺少
项。setImageDrawable(res)在结尾,但是是的,这个方法很有效。我喜欢这个解决方案,顺便说一句
3F
意味着25%的不透明度(可见):。
fun ImageButton.enable() {
    this.isEnabled = true
    this.imageAlpha = 0xFF
}

fun ImageButton.disable() {
    this.isEnabled = false
    this.imageAlpha = 0x3F
}

myButton.enable()
myButton.disable()
    <ImageButton
        style="@style/your-style"
        android:tint="@color/but_color"
        android:src="@drawable/button" />
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_enabled="false" android:color="#888" />
    <item android:color="?android:attr/colorAccent" />
</selector>
 ((ImageButton) findViewById(R.id.btnImageButton1)).setEnabled(true);
 ((ImageButton) findViewById(R.id.btnImageButton1)).setImageAlpha(0xFF);
 ((ImageButton) findViewById(R.id.btnImageButton1)).setEnabled(false);
 ((ImageButton) findViewById(R.id.btnImageButton1)).setImageAlpha(0x3F);