Android:如何'变灰'放射性按钮

时间:2010-08-27 20:08:46

标签: android

禁用单选按钮不会像禁用复选框一样“灰显”控件。 我在想,在整个radiobutton视图上放置一个半透明的黑色位图是多么困难,从而使它看起来更暗?

不确定从哪一步开始,有什么想法吗?

1 个答案:

答案 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方法,根据您的状态添加/删除颜色过滤器

我做过类似的事情,但没有这个具体的事情,所以我不知道它是否会奏效,但希望我已经给你足够的想法,你会找到适合你的东西!