Android 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以下,点击就没有变色的功能了。如果也想有,怎么办?换手机呗(调侃=_=)