当前位置: 首页 > 面试题库 >

StateListDrawable切换滤色器

林彬
2023-03-14
问题内容

我想创建在TabHost中使用的自定义按钮。我一直在尝试仅使用相同的图像资源(png),但是根据状态改变了滤色器。因此,我做了这一点作为自定义按钮的布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent" android:layout_height="fill_parent">
    <ImageView android:id="@+id/tab_icon"
        android:layout_centerInParent="true" android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true" android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <TextView android:id="@+id/tab_text" android:layout_below="@id/tab_icon"
        android:layout_centerHorizontal="true" android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</RelativeLayout>

在我的活动中,我添加如下标签:

tabHost.addTab(tabHost.newTabSpec(TAB_NAME_NEWS).setIndicator(buildTab(R.drawable.tab_icon_news, R.string.news))
          .setContent(newsIntent));

这是“ buildTab”方法:

private final static int[] SELECTED = new int[] { android.R.attr.state_selected };
private final static int[] IDLE = new int[] { -android.R.attr.state_selected };

private View buildTab(int icon, int label) {
    LayoutInflater inflater = LayoutInflater.from(this);
    View view = inflater.inflate(R.layout.tab_button, null);
    StateListDrawable drawable = new StateListDrawable();

    Drawable selected = getResources().getDrawable(icon);
    selected.mutate();
    selected.setBounds(0, 0, selected.getIntrinsicWidth(), selected.getIntrinsicHeight());
    selected.setColorFilter(new LightingColorFilter(0xFFFFFFFF, 0x0000FF00));
    drawable.addState(SELECTED, selected);

    Drawable idle = getResources().getDrawable(icon);
    idle.mutate();
    idle.setColorFilter(new LightingColorFilter(0xFFFFFFFF, 0x000000FF));
    drawable.addState(IDLE, idle);

    ((ImageView) view.findViewById(R.id.tab_icon)).setImageDrawable(drawable);
    ((TextView) view.findViewById(R.id.tab_text)).setText(getString(label));
    return view;
}

在选择状态下,图像应完全为绿色(0x0000FF00),在未选择状态下,图像应为蓝色(0x000000FF)。

问题在于滤色镜似乎被完全忽略了。在任何情况下我都看不到颜色变化。

我还尝试通过在android:tint上设置属性来获得相同的结果<ImageView/>,但是显然您不能使用对a的引用<selector>,因为它会引发NumberFormatException

我看不到我在做什么错,因此我们将不胜感激。


问题答案:

好的,我从来没有上面的代码可以工作,所以这就是我最终要做的。

首先,我将LayerDrawable子类化:

public class StateDrawable extends LayerDrawable {

    public StateDrawable(Drawable[] layers) {
        super(layers);
    }

    @Override
    protected boolean onStateChange(int[] states) {
        for (int state : states) {
            if (state == android.R.attr.state_selected) {
                super.setColorFilter(Color.argb(255, 255, 195, 0), PorterDuff.Mode.SRC_ATOP);
            } else {
                super.setColorFilter(Color.GRAY, PorterDuff.Mode.SRC_ATOP);
            }
        }
        return super.onStateChange(states);
    }

    @Override
    public boolean isStateful() {
        return true;
    }

}

我将buildTab()方法更改为以下内容:

private View buildTab(int icon, int label) {
    LayoutInflater inflater = LayoutInflater.from(this);
    View view = inflater.inflate(R.layout.tab_button, null);
    ((ImageView) view.findViewById(R.id.tab_icon)).setImageDrawable(new StateDrawable(new Drawable[] { getResources()
          .getDrawable(icon) }));
    ((TextView) view.findViewById(R.id.tab_text)).setText(getString(label));
    return view;
}

我仍然像这样添加标签:

Intent fooIntent = new Intent().setClass(this, FooActivity.class);
tabHost.addTab(tabHost.newTabSpec(TAB_NAME_INFO).setIndicator(buildTab(R.drawable.tab_icon_info, R.string.info)).setContent(infoIntent));

这对我有效,与android 1.6兼容。



 类似资料:
  • 实现App外观主题切换功能,可以切换导航条、TabBar和字体的颜色,以及TabBar的按钮图片。 [Code4App.com]

  • 由于列表中最高角色的位置等于角色的数量,所以创建的每个角色都应该移动到完全相同的位置,从而将其下面的每个角色都低一个位置。 但这不是正在发生的事情。 在执行这些代码行并降低进程速度时(通过使用和/或),我看到了以下情况: null 如果您怀疑这是我的代码中根深蒂固的,请让我知道,因为我可以为您提供更多的细节。

  • 问题内容: 我有一个引导网站,当屏幕尺寸小于992px时,会添加Hamburger切换器。代码如下: 可以更改汉堡切换按钮的颜色吗? 问题答案: Bootstrap 4中的(汉堡包)使用SVG 。切换器图标图像有2个“版本”。一个用于浅色导航栏,另一个用于深色导航栏… 使用了较深的背景光/白色toggler 使用上较亮的背景黑色/灰色toggler 因此,如果要将切换器图像的颜色更改为其他颜色,可

  • 本文向大家介绍Vue点击切换颜色的方法,包括了Vue点击切换颜色的方法的使用技巧和注意事项,需要的朋友参考一下 如下所示: 以上这篇Vue点击切换颜色的方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持呐喊教程。

  • 我有一个从60000毫秒开始的倒计时计时器,想要从颜色更改文本颜色。蓝色到彩色。红色一旦时间在和低于10000毫秒。我尝试了以下方法,但没有任何成功;试图设置TextSwitcher的TextColor并添加IF语句,该语句将根据int值timerState更改颜色...除了停止计时器并在毫秒内创建另一个计时器之外,我不知道如何让它工作。 我单击一个imageButton,它启动一个对话框片段(P

  • 本文向大家介绍Go 过滤切片,包括了Go 过滤切片的使用技巧和注意事项,需要的朋友参考一下 示例 要过滤切片而不分配新的基础数组: