selector

xmlns:anroid
这种属性就不提了,定义命名空间的。
autoMirrored
之前说过了,镜像翻转。
constanSize
默认是 false ,指的是内部 item 的大小根据状态变化, true 的话就是一直都是最大尺寸。
dither
之前说过了,位图抖动,适应不同分辨率的。
enterFadeDuration 和 exitFadaDuration 后面跟渐变的时间。(感觉效果不是很好,会闪一下)
variablePadding
默认是 false,有点像是前面的 constanSize ,当设置为 true 的时候需要为每一个 item 设置 layout 。
visible
后面跟布尔值,讲道理应该就是控制是否可见的。但是设置了 false 和 true 效果都一样。
一般来说,selector 自身的属性基本都是用不到的,更应该关心的是 item 的状态。
item

多达 17 种 state , 默认状态下都是 false。
关于状态的匹配,有点像是 if...else 。由于一个场景中可能有多个状态与之匹配,但是所显示的 item 却是第一个匹配到的 item (不一定是最匹配的),因为当状态改变的时候,item 是从上到下遍历的,先到先得。
所以!我们应该将缺省状态放最后。
state_focused
具有输入焦点。(例如 EditView 光标闪烁,而像 Button 这种,点击也没用)
state_press
按下。
state_accelerated
关于这个我在官方 API 里面并没有找到。有人说是硬件加速时候的效果。
但是我将其设置为 true 之后,发现无论什么情况下,都是处于 true 。开了虚拟机,状态也是 true。
state_activated
set when a view or its parent has been “activated” meaning the user has currently marked it as being of interest。
可以想成是地图界面中,那个当前位置的标记。(个人理解)
state_active
set when a view or drawable is considered “active” by its host。
可以想成是机顶盒或者带键盘手机上用方向键激活选项。(个人理解)
state_checkable
控件是否可选中。
state_checked
控件是否已经选中。
state_drag_can_accept
该控件有能力接受哟景湖拖拽其他的控件。(这个在平板端可能比较常见,拖拽上传文件之类的)
state_drag_hovered
拖拽的过程中,有控件正位于自身控件的上方。
state_enabled
正常的状态下。
state_first
state_middle
state_last
这三个也是从没用过。
它们用作范围有局限性,必须是 in an ordered set 。
可以参考这里。
state_hovered
当有指针悬浮在该控件上的时候。
state_seleted
很常用,被选中的状态。
state_single
只有一个元素显示图片。
state_window_focused
这个比较好理解,当前应用在例如对话框或者通知栏下拉的时候会失去 focused 。
关于状态的使用,由于不是匹配最佳选项,更多的时候,我们应该设置多几种,更加准确。
贴一段 JakeWharton 的 ViewPagerIndicator 里面的部分 xml 代码:
1 | <selector xmlns:android="http://schemas.android.com/apk/res/android"> |
关于 selector 的创建还有个插件 SelectorChapek ,它的使用比较简单,网上的教程也不少,不过其实这类型的插件都有点鸡肋。