如何使按钮变灰?

Posted

技术标签:

【中文标题】如何使按钮变灰?【英文标题】:How to grey out a button? 【发布时间】:2012-02-03 07:32:00 【问题描述】:

我有一个如下所示定义的按钮。当我想禁用它时,我使用my_btn.setEnabled(false),但我也想将它变灰。我该怎么做?

谢谢

<Button android:id="@+id/buy_btn" style="@style/srp_button" />

样式/srp_button

<style name="srp_button" parent="@android:style/Widget.Button">
    <item name="android:background">@drawable/btn_default</item>
    <item name="android:layout_width">wrap_content</item>
    <item name="android:layout_height">wrap_content</item>
    <item name="android:textColor">#ffffff</item>
    <item name="android:textSize">14sp</item>
    <item name="android:typeface">serif</item>
    <item name="android:paddingLeft">30dp</item>
    <item name="android:paddingRight">30dp</item>
    <item name="android:paddingTop">5dp</item>
    <item name="android:paddingBottom">5dp</item>
</style>

drawable/btn_default.xml

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/pink" />
    <corners android:radius="6dp" />
</shape>

【问题讨论】:

使用选择器***.com/questions/7335345/button-background-selector 【参考方案1】:

您必须在 btn_defaut.xml 中提供 3 或 4 个状态作为选择器。

    按下状态 默认状态 焦点状态 启用状态(带有错误指示的禁用状态;参见 cmets)

您将为状态提供相应的效果和背景。

这里有详细讨论:Standard Android Button with a different color

【讨论】:

所以为了让它变灰,我必须改变背景颜色和禁用状态下的文本颜色?有没有办法只添加一个透明的前景? 是的!您将为android:state_disable="true" 提供什么,它将显示按钮被禁用时的状态,这是一种简单且推荐的方式。 在哪里可以指定禁用状态的文本颜色?似乎只能指定背景...我为此提出了一个新问题:***.com/questions/8743584/… 没有android:state_disable="true",是吗?你指的是android:state_enabled="false"吗? @MarcoW.: 是的,你是绝对正确的。为错误的属性道歉。【参考方案2】:
Button button = (Button)findViewById(R.id.buy_btn);
button.setEnabled(false);

【讨论】:

这不能回答问题。【参考方案3】:

将 Clickable 设置为 false 并将背景颜色更改为:

callButton.setClickable(false);
callButton.setBackgroundColor(Color.parseColor("#808080"));

【讨论】:

【参考方案4】:

最简单的解决方案是为按钮的背景图像设置颜色过滤器,如我所见here

你可以这样做:

if ('need to set button disable')
    button.getBackground().setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY);
else
    button.getBackground().setColorFilter(null);

希望我能帮助到某人...

【讨论】:

我最喜欢这种方法。谢谢! 这种方法有潜力,但产生的颜色并不总是你想象的那样。例如,与灰色相乘的橙色按钮会产生深红色 - 而不是褪色的橙色。 也许应该使用 Mode.SRC_IN 而不是乘法。见***.com/a/17112876/550471 这可行,但两种颜色混合后会变成另一种颜色 太棒了!好干净。【参考方案5】:

您还可以通过设置 alpha 使其显示为禁用(使其半透明)。如果您的按钮背景是图像,并且您不想为其创建状态,这将特别有用。

button.setAlpha(.5f);
button.setClickable(false);

更新:我在 Kotlin 之前以及我还是菜鸟的时候就编写了上述解决方案。它更像是一个“快速”的解决方案,但我不建议在专业环境中使用它。

今天,如果我想要一个可以在任何按钮/视图上运行而无需创建状态列表的通用解决方案,我会创建一个 Kotlin 扩展。

fun View.disable() 
    getBackground().setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY)
    setClickable(false)

在 Java 中,您可以使用静态 util 函数执行类似的操作,您只需将视图作为变量传递。它不是那么干净,但它可以工作。

【讨论】:

我读过调用 setAlpha 在 CPU 上的开销很大。谁能确认一下? @AliKazi 这取决于您的View 的类型。来自this G+ post:“如果您的视图不包含重叠的绘图命令,则setAlpha() 将被优化掉,我们只需修改Paint 对象以应用适当的alpha。当View.hasOverlappingRendering() 返回true 时会发生这种情况。ImageViews 和@没有背景可绘制对象的 987654328@s 是此优化的常见候选对象。如果您处于这种情况,请尽可能多地使用 setAlpha()。"。 @Sufian 谢谢。但为了更安全,我为每个按钮使用了一个简单的 StateListDrawable。我是怎么做到的,我已经发布了一个新的答案。我已经包含了指向我了解到 alpha 对性能不利的链接。 视觉上对用户不友好 实际上在视觉上禁用了视图。谢谢@Siavash【参考方案6】:

所有给定的答案都很好,但我记得知道使用 setAlpha 可以提高性能bad idea(更多信息here)。因此,创建StateListDrawable 是管理按钮禁用状态的更好主意。方法如下:

在 res/drawable 文件夹中创建一个 XML btn_blue.xml:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- Disable background -->
    <item android:state_enabled="false"
          android:color="@color/md_blue_200"/>
    
    <!-- Enabled background -->
    <item android:color="@color/md_blue_500"/>
</selector>

在 res/values/styles.xml 中创建按钮样式

<style name="BlueButton" parent="ThemeOverlay.AppCompat">
      <item name="colorButtonNormal">@drawable/btn_blue</item>
      <item name="android:textColor">@color/md_white_1000</item>
</style>

然后将此样式应用于您的按钮:

<Button
     android:id="@+id/my_disabled_button"
     android:layout_
     android:layout_
     android:theme="@style/BlueButton"/>

现在当您调用btnBlue.setEnabled(true)btnBlue.setEnabled(false) 时,状态颜色会自动切换。

【讨论】:

【参考方案7】:

您应该为禁用的按钮创建一个 XML 文件 (drawable/btn_disable.xml)

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <solid android:color="@color/grey" />
    <corners android:radius="6dp" />
</shape>

并为按钮创建一个选择器(drawable/btn_selector.xml

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

    <item android:drawable="@drawable/btn_disable" android:state_enabled="false"/>
    <item android:drawable="@drawable/btn_default" android:state_enabled="true"/>
    <item android:drawable="@drawable/btn_default" android:state_pressed="false" />

</selector>

将选择器添加到您的按钮

<style name="srp_button" parent="@android:style/Widget.Button">
    <item name="android:background">@drawable/btn_selector</item>
</style>

【讨论】:

【参考方案8】:

我为此使用了这个代码:

ColorMatrix matrix = new ColorMatrix();
matrix.setSaturation(0);
ColorMatrixColorFilter filter = new ColorMatrixColorFilter(matrix);
profilePicture.setColorFilter(filter);

【讨论】:

【参考方案9】:

我尝试了上述解决方案,但它们似乎都不适合我。我选择了以下选项:

<!-- button_color_selector.xml -->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:color="@color/colorAccent" android:state_enabled="true"/>
    <item android:color="@color/colorAccentLight" android:state_enabled="false"/>
</selector>
<com.google.android.material.button.MaterialButton
                android:layout_
                android:layout_
                android:backgroundTint="@color/button_color_selector"
                .../>

【讨论】:

以上是关于如何使按钮变灰?的主要内容,如果未能解决你的问题,请参考以下文章

除非选择单选按钮,否则如何使复选框变灰?

如何使用javascript使按钮变灰且不能点击

java中要使按钮变灰是用哪个方法

如何使用javascript使按钮变灰且不能点击?

如何统一使相机的边缘变灰

将模态视图放在视图上并使背景变灰