如何使按钮变灰?
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 时会发生这种情况。ImageView
s 和@没有背景可绘制对象的 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"
.../>
【讨论】:
以上是关于如何使按钮变灰?的主要内容,如果未能解决你的问题,请参考以下文章