关于 Drawable(三)

selector

屏幕快照 2017-05-05 上午8.53.41

xmlns:anroid
这种属性就不提了,定义命名空间的。

autoMirrored
之前说过了,镜像翻转。

constanSize
默认是 false ,指的是内部 item 的大小根据状态变化, true 的话就是一直都是最大尺寸。

dither
之前说过了,位图抖动,适应不同分辨率的。

enterFadeDurationexitFadaDuration 后面跟渐变的时间。(感觉效果不是很好,会闪一下)

variablePadding
默认是 false,有点像是前面的 constanSize ,当设置为 true 的时候需要为每一个 item 设置 layout 。

visible
后面跟布尔值,讲道理应该就是控制是否可见的。但是设置了 false 和 true 效果都一样。

一般来说,selector 自身的属性基本都是用不到的,更应该关心的是 item 的状态。

item

屏幕快照 2017-05-05 上午9.28.13

多达 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 。

关于状态的使用,由于不是匹配最佳选项,更多的时候,我们应该设置多几种,更加准确。

贴一段 JakeWhartonViewPagerIndicator 里面的部分 xml 代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Non focused states -->
<item android:state_focused="false" android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/vpi__tab_unselected_holo" />
<item android:state_focused="false" android:state_selected="true" android:state_pressed="false" android:drawable="@drawable/vpi__tab_selected_holo" />

<!-- Focused states -->
<item android:state_focused="true" android:state_selected="false" android:state_pressed="false" android:drawable="@drawable/vpi__tab_unselected_focused_holo" />
<item android:state_focused="true" android:state_selected="true" android:state_pressed="false" android:drawable="@drawable/vpi__tab_selected_focused_holo" />

<!-- Pressed -->
<!-- Non focused states -->
<item android:state_focused="false" android:state_selected="false" android:state_pressed="true" android:drawable="@drawable/vpi__tab_unselected_pressed_holo" />
<item android:state_focused="false" android:state_selected="true" android:state_pressed="true" android:drawable="@drawable/vpi__tab_selected_pressed_holo" />

<!-- Focused states -->
<item android:state_focused="true" android:state_selected="false" android:state_pressed="true" android:drawable="@drawable/vpi__tab_unselected_pressed_holo" />
<item android:state_focused="true" android:state_selected="true" android:state_pressed="true" android:drawable="@drawable/vpi__tab_selected_pressed_holo" />
</selector>

关于 selector 的创建还有个插件 SelectorChapek ,它的使用比较简单,网上的教程也不少,不过其实这类型的插件都有点鸡肋。