禁用单选按钮不会像禁用复选框一样“灰显”控件。 我在想,在整个radiobutton视图上放置一个半透明的黑色位图是多么困难,从而使它看起来更暗?
不确定从哪一步开始,有什么想法吗?
答案 0 :(得分:3)
在现有图像或可绘制图片上添加胶合代码最好使用ColorFilter
。
您可以创建两个单独的drawable并将它们添加到StateListDrawable
,并为禁用的drawable提供灰色滤镜。这可能会花费你一些内存,因为你复制了一个drawable,听起来你只是使用Android的股票单选按钮,所以创建它的副本可能会很痛苦。
更常用的方法是在禁用View时应用滤色器。尝试继承单选按钮并覆盖drawableStateChanged()
,如下所示:
@Override
public void drawableStateChanged() {
Drawable background = getBackground();
if(background != null) {
if(!isEnabled()) {
background.setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY);
} else {
background.setColorFilter(null);
}
}
}
修改强>
呃 - 哦,我看到CompoundButton
有一个方法setButtonDrawable()
。因此复合按钮不能使用背景作为其drawable,就像普通按钮一样。当然,mButtonDrawable
是一个私人变量,而且没有相应的“获取”方法 - 非常感谢Google。如果没有通过反射访问它,您可能必须为此创建自己的可绘制资源。 : - (
创建自己的按钮drawable可让您更好地控制应用程序的外观,但当然这意味着您将无法匹配正在运行的任何设备的主题,此外还会增加应用程序的大小因为你最终添加了8个png资源。您可以尝试覆盖onDraw()
,就像您谈到的那样,并在其上放置一些半透明的ColorDrawable
,但每次我自己尝试它时,它看起来就像完全废弃。
在前往其中任何一条道路之前,试试这个:幸运的是,在android.R.drawable.btn_radio
的公共API中公开了单选按钮 。因此,您可以将其膨胀为StateListDrawable
并尝试以某种方式向其添加状态。可能有用的一种方法是:
StateListDrawable draw = (StateListDrawable) getResources().getDrawable(android.R.drawable.btn_radio);
Drawable radioBtnNormal = draw.getCurrent();
Drawable radioBtnDisabled = new LayerDrawable(new Drawable[]{radioBtnNormal});
radioBtnDisabled.setColorFilter(Color.GRAY, PorterDuff.Mode.MULTIPLY);
draw.addState(new int[]{-android.R.attr.state_enabled}, radioBtnDisabled);
button.setButtonDrawable(draw);
你可能不得不玩那里倒数第二行的状态;我总是很难让状态恰到好处,以便它能够满足我的需求。另请注意state_enabled
前面的负号,表示禁用状态。
如果这对您不起作用,您还可以尝试将原始drawable包装在您自己的LayerDrawable
子类中,并覆盖onStateChanged
方法,根据您的状态添加/删除颜色过滤器
我做过类似的事情,但没有这个具体的事情,所以我不知道它是否会奏效,但希望我已经给你足够的想法,你会找到适合你的东西!