日常开发当中,难免会出现这样一种情况,为一个按钮、TextView...设置一个点击状态的颜色改变,可能是background背景的改变,也可能是字体颜色的改变,简单点说:默认状态下,字体颜色或者背景是一种颜色,按下或者点击的时候,变成另一种颜色。
这里面有一些小坑,为了避免踩到,特此小结一下。本文参考了 http://keeganlee.me/post/android/20150905。
(一)、selector做为drawable和color使用时的区别和注意事项
1、background的selector
结论:background的selector,item只能用drawable属性,不能用color属性,并且drawable还必须用引用的形式
2、textcolor的selector
结论:textcolor的selector,item不能使用drawable属性,只能用color属性,值可以直接指定,也可以引用指定。
总结:
1、selector作为drawable资源时,item必须使用android:drawable属性指定,资源放在drawable目录下
2、selector作为color资源时,item必须使用android:color属性指定,资源放在color目录下
注意:
1、color资源也可以放于drawable目录,引用时则用@drawable来引用,但不推荐这么做,drawable资源和color资源最好还是分开;
2、android:drawable属性除了引用@drawable资源,也可以引用@color颜色值;但android:color只能引用@color;
3、item的状态是从上往下匹配的,如果匹配到一个item的状态,那它就将采用这个item指定的资源,而不是采用最佳匹配的规则;所以设置默认的状态,一定要写在最后,如果写在前面,则后面所有的item都不会起作用了(重点)。
关于适用的时候的注意区别和注意事项就这些,下面让我们看看selector下的属性和item下的属性介绍。
(二)、selector下的属性
1、android:dither="true"
布尔值。值为“true”时,将在位图的像素配置与屏幕不同时(例如:ARGB 8888 位图和 RGB 565 屏幕)启用位图的抖动;值为“false”时则停用抖动。默认值为 true。
2、android:visible="true"
设置初始的可见性状态,默认为false
3、android:autoMirrored="true"
设置图片是否需要镜像反转,当布局方向是RTL,即从右到左布局时才有用,API Level 19(Android 4.4)才添加的属性
4、android:constantSize="true"
布尔值。
可绘制对象报告的内部大小,在状态变更时保持不变,则值为“true”(大小是所有状态的最大值);
如果大小根据当前状态而变化,则值为“false”。默认值为 false。
5、android:variablePadding="true"
布尔值。
如果可绘制对象的内边距,应根据选择的当前状态而变化,则值为“true”;
如果内边距应保持不变(基于所有状态的最大内边距),则值为“false”。启用此功能要求您在状态变更时处理执行布局,这通常不受支持。默认值为 false。
6、android:exitFadeDuration="1000"
状态改变时,旧状态消失时的淡出时间,以毫秒为单位
7、android:enterFadeDuration="1000"
状态改变时,新状态展示时的淡入时间,以毫秒为单位
(三)、item下的属性
1、android:drawable
可绘制对象资源。必备。引用要插入的可绘制对象资源。
2、android:state_pressed
布尔值。
如果在按下对象(例如触摸/点按某按钮)时应使用此项目,则值为“true”;
如果在默认的未按下状态时应使用此项目,则值为“false”。
3、android:state_checked
布尔值。如果在对象已选中时应使用此项目,则值为“true”;
如果在对象未选中时应使用此项目,则值为“false”。
4、android:state_checkable
布尔值。
如果当对象可选中时应使用此项目,则值为“true”;
如果当对象不可选中时应使用此项目,则值为“false”。(仅当对象可在可选中与不可选中小部件之间转换时才有用。)
5、android:state_selected
布尔值。
如果在使用定向控件浏览(例如使用方向键浏览列表)的情况下,对象为当前用户选择时应使用此项目,则值为“true”;
如果在未选择对象时应使用此项目,则值为“false”。当焦点 (android:state_focused
) 不充分(例如,列表视图有焦点但使用方向键选择其中的项目)时,使用所选状态。
6、android:state_enabled
布尔值。
如果在对象启用(能够接收触摸/点击事件)时应使用此项目,则值为“true”;
如果在对象停用时应使用此项目,则值为“false”。
7、android:state_focused
布尔值。
如果在对象具有输入焦点(例如当用户选择文本输入时)时应使用此项目,则值为“true”;
如果在默认的非焦点状态时应使用此项目,则值为“false”。
8、android:state_activated
布尔值。
如果在对象激活作为持续选择(例如,在持续导航视图中“突出显示”之前选中的列表项)时应使用此项目,则值为“true”;
如果在对象未激活时应使用此项目,则值为“false”。此项为 API 级别 11 新引入的配置。
9、android:state_hovered
布尔值。
如果当光标悬停在对象上时应使用此项目,则值为“true”;
如果在默认的非悬停状态时应使用此项目,则值为“false”。
通常,这个可绘制对象可能与用于“聚焦”状态的可绘制对象相同。此项为 API 级别 14 新引入的配置。
10、android:state_window_focused
布尔值。
如果当应用窗口有焦点(应用在前台)时应使用此项目,则值为“true”;
如果当应用窗口没有焦点(例如,通知栏下拉或对话框出现)时应使用此项目,则值为“false”。
以下不常见的属性,目前还不清楚什么用,待补充。
11、android:state_last
12、android:state_first
13、android:state_middle
14、android:state_single
15、android:state_drag_can_accept
16、android:state_drag_hovered
17、android:state_accelerated
18、android:state_active
其实,在实际开发的过程中,这里面的很多属性都不会用到,大多数情况下,我们只需要根据控件的状态,设置相应的drawable或color资源就可以了,同时可以使用多个状态。例如:
至此,selector及item下的属性和drawable、color属性时的注意事项全部介绍完毕!!!感谢阅读。
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Courier }
span.s1 { }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Hannotate SC" }
span.s1 { }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Hannotate SC" }
span.s1 { }
p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px "Hannotate SC" }
span.s1 { }