代码之家  ›  专栏  ›  技术社区  ›  FrinkTheBrave

安卓:如何“灰显”无线按钮

  •  1
  • FrinkTheBrave  · 技术社区  · 15 年前

    禁用RadioButton不会以禁用复选框的方式“灰显”控件。 我在想,在整个RadioButton视图上放置一个半透明的黑色位图会有多困难,从而使其看起来更暗?

    不太确定从哪里开始,有什么想法吗?

    1 回复  |  直到 15 年前
        1
  •  3
  •   Neil Traft    15 年前

    在现有图像或可绘制图像上添加单板最好使用 ColorFilter .

    您可以创建两个单独的抽屉,并将它们添加到 StateListDrawable ,并给禁用的抽屉一个灰色滤色片。不过,这可能会让你损失一些内存,因为你在复制一个抽屉,而且听起来你只是在使用安卓的股票单选按钮,所以创建一个副本可能会很痛苦。

    一种更普遍的方法就是在视图被禁用时应用颜色过滤器。尝试对单选按钮进行子类化并重写 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() . 所以复合按钮不能像普通按钮那样使用背景作为它们的抽屉。当然了。 mButtonDrawable 是一个私有变量,没有等价的“get”方法——非常感谢Google。除了通过反射访问它,您可能还需要为此创建自己的可提取资源。:

    创建你自己的按钮可绘制给你更多的控制你的应用程序的外观,但当然这意味着你将不匹配的任何设备运行的主题,加上它增加了你的应用程序的大小,因为你最终会添加像8 PNG资源。你可以尝试重写 onDraw() 就像你说的,把某种半透明的 ColorDrawable 最重要的是,但每次我自己尝试过,它看起来都像一个垃圾。

    在走这两条路之前,试试这个:幸运的是,这个收音机按钮是可以拉的 在公共API中公开 android.R.drawable.btn_radio . 所以,你可以把这个膨胀成 状态列表可绘制 并尝试以某种方式添加状态。一种可能有效的方法是:

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

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