欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android tint介绍及实现

程序员文章站 2022-05-13 22:37:59
近日听说了tint属性,于是小小的研究了一下。 发现tint属性在实际项目中非常实用。 在开发项目的时候,绝大部分的策划可能都有个这样的需求,当点击一个按钮素材的时候,素材变色。 这个功能并不难,可...

近日听说了tint属性,于是小小的研究了一下。

发现tint属性在实际项目中非常实用。

在开发项目的时候,绝大部分的策划可能都有个这样的需求,当点击一个按钮素材的时候,素材变色。

这个功能并不难,可以说非常简单。设置xml的drawable,pressed的属性就可以。

然而我们却忽略了一点,这样做的时候,往往我们会叫设计师妹妹(还是大叔?)设计两张素材,一张正常的,一张按下去的。

一个地方这样弄还好,如果是一个庞大的项目所有类似这样的地方都这样弄,你会发现很多很多的素材长的是一模一样,只是颜色不一样而已。这样就会导致我们的apk包的大小无形的增大不少。

那怎么办呢?

tint应运而生。

先说一下tint是在android5.0才开始出现的。

使用起来非常简单。

举个简单的例子:


    

就上面的代码,只要加一个tint颜色属性值。

这个tint素材显示出来的颜色就是我们指定的coloraccent。

是不是感觉不可思议,不在担心同样的素材,多变的颜色。

看到这里,有疑问了,那可不可以快捷的设置按下去的颜色?

当然了。

就不多解释了,直接贴代码,看到代码比我balabala理解估计更快。


其中drawable/tint_src_selector和@color/tint_color_selector不再是直接的素材而是xml

tint_src_selector代码:



    
    

注意上面代码,依然只用了一个素材。

tine_color_selector代码:



    
    

这里涉及到两个颜色,一个正常的,一个按下去的。

就这样,就可以到真机或者模拟器看效果了。

搞到这里,就感觉完美了。

然而,我发现,当我运行在5.0系统以下的时候,就报错了。

晕死,我们apk版本最低兼容要低于5.0啊。这可咋整?

所以想到了,到代码里面去设置tint(为什么?这还问,因为代码里可以判断系统版本咯)

于是我又各种搜。却发现怎么也实现不了,按下去变色的需求。

于是想着模仿xml的实现去解决这个问题。终于,这样就真的可以了。

直接贴代码吧:

为了方便看,直接把方法设置为了static方法。

    public static void initimageview(@nonnull context context, @nonnull imageview imageiv
            , @drawableres int imageres, @colorres int colornormal, @colorres int colorpressed) {
        drawable drawable = contextcompat.getdrawable(context,imageres);
        int[][] states = new int[2][];
        states[0] = new int[]{android.r.attr.state_pressed};
        states[1] = new int[]{};

        statelistdrawable statelistdrawable = new statelistdrawable();
        statelistdrawable.addstate(states[0],drawable);
        statelistdrawable.addstate(states[1],drawable);


        drawable.constantstate state = statelistdrawable.getconstantstate();
        drawable wrapdrawable = drawablecompat.wrap(state == null ? 
                statelistdrawable : state.newdrawable()).mutate();

        if (build.version.sdk_int >= build.version_codes.lollipop) {
            int[] color = new int[]{
                    contextcompat.getcolor(context,colorpressed),
                    contextcompat.getcolor(context,colornormal)
            };
            colorstatelist colorstatelist = new colorstatelist(states,color);
            wrapdrawable.settintlist(colorstatelist);
        }

        imageiv.setimagedrawable(wrapdrawable);
        //如果还是没效果,加一句clickable
//        imageiv.setclickable(true);
    }

这样就可以在代码上实现tint属性所带来的功能了。

不过这样的话5.0以下,点击就没有变色的功能了。如果也想有,怎么办?换手机呗(调侃=_=)