更多文章请访问: http://user.qzone.qq.com/469241633/main#!app=2&via=QZ.HashRefresh&pos=1341222376
html
今天弄这个selector把脑袋弄得清痛,最终个人理解以下:android
官方关于这个的介绍在:http://developer.android.com/guide/topics/resources/drawable-resource.html#StateListapi
先复制一个样例:app
<?xml version="1.0" encoding="utf-8"?>ide
<selector xmlns:android="http://schemas.android.com/apk/res/android" android:constantSize=["true" | "false"]布局
android:dither=["true" | "false"]ui
android:variablePadding=["true" | "false"] > spa
<item xml
android:drawable="@[package:]drawable/drawable_resource" android:state_pressed=["true" | "false"]htm
android:state_focused=["true" | "false"]
android:state_hovered=["true" | "false"]
android:state_selected=["true" | "false"]
android:state_checkable=["true" | "false"]
android:state_checked=["true" | "false"]
android:state_enabled=["true" | "false"]
android:state_activated=["true" | "false"]
android:state_window_focused=["true" | "false"] />
</selector>
首先是这个东西:android:constantSize=["true" | "false"]
这个东西有什么用呢?这一东西是说咱们在后面那个item里面设置drawable这个东西的大小是否是固定的。咱们这个文件通常都是用做控件的Backgroup或者selector总之就是背景状态,通常背景都是把控件的后面所有覆盖,但有的时候咱们要设置设固定的大小,好比一个Button有300*200大,而设置这个Button的背景图片只有200*100,而如今咱们又不想图片被拉大把覆盖整个Button的底层,那么就能够把这个属性设置为true,这样图片就只显示在中间了,就像咱们设置桌面背景同样,能够设置成居中、拉伸,若是这里设置成true就至关于居中,若是不设置或者设置为false就是拉伸.
android:dither=["true" | "false"]
这个东西是说是否让系统来帮咱们处理颜色差别,通常android系统中使用的颜色是ARGB_8888,但不少显示设置是RGB_565,这个ARGB_8888与RGB_565有什么区别呢。这个ARGB_8888也就是说每个像素点要拿4个字节来保存,依次每一个字节是A8个字节,R8个字节,G8个字节,B8个字节,来保存,而RGB_565它只用了两个字节来保存颜色,两个字节总共16位,前5位保存R,中间6位保存G,后5位保存B.所以呀,若是android系统的点显示到屏幕上,还得转换一下,在这里这个dither就起做用了,
若是咱们把它设置为true的话,那显示的时候屏幕间断的取点,这样的结果,有的时候看上去就有那种分层的感受,也就是前面一部分的颜色与后面一部分的颜色感受断层了,就是很不平滑的感受,若是咱们这里设置为true的话,默认就是true,android系统,它会在取的点之间再通过一些计算,在其间补充一点相间的颜色使看起来比较平滑,但这样和真的图片仍是有差别的,因些有的人想要获得很逼真的显示,这里就得本身来计算了,本身来计算,即占内存又占cpu,但颜色能够很逼真,若是有这样的需求那这里就要把这个属性设置为false
android:variablePadding
这个是可变的填充,这个有什么用呢?这个就是,在当当前这个组件被selected的时候,好比某一个tab被selected,或者listView里面的个item被selected的时候,若是设置为true的话,那么被选的这个tab或item的填充就会变大,使得看上去与其它的tab或item不同。
接下来就是item中的属性了,这个也是常常用的。
android:drawable="@[package:]drawable/drawable_resource" 这个是说若是系统匹配上当前这个item(也就是要使用这个item),那么就用这里设置的资源这个资源,通常都为图片。
android:state_pressed=["true" | "false"]这个是说当前这个组件是否被按下,若是要设置按下的那一刻的状态,那么这里就要设置为true,例如,一个Button当手按下去后,尚未离开的状态(就是touched住的时候,尚未放开,和Clicked,点击时的那一刻)。
android:state_focused=["true" | "false"]
这个是当得到焦点的时候的状态,就是当控件高亮的时候的状态,哪些状况能够形成此状态呢,好比说,轨迹球(有的手机上面有一个小球,能够用手指在上面向不一样的方向滚动,滚动的时候,界面里面的焦点,就会转向滚动的方向的控件),还有就是d-pad之类的东西(好比果游戏手柄上面的上下左右键,还有键盘上面的上下左右键等)这些东西就能够控制组件上面的焦点。
android:state_hovered=["true" | "false"]
这个是api等组在14以上才有的,这个是当光标移动到某一个组件之上的时候的状态,到目前为止,尚未看见过哪一个手机设备带有鼠标之类的东西,可能这个专门是为平板电脑设置的或者之后可能出现带有鼠标之类的设备而准备的吧,文档中说,通常这个值设置为与focused这个值同样。
android:state_selected=["true" | "false"]
这个是当一个tab被打开的状态。或者一个listView等里面一个item被选择的时候的状态,所以这个属性设置在通常的组件上面是没有用的,只有设置有做为tab或item的布局里面的项时,这个属才起做用.
android:state_checkable=["true" | "false"]
这个是当一个组件在能够checked或不能够checked的时候的状态,如今较常见的,可以checkable的组件有,单选项和多选项,因此这个属性只有设置在像这类组件上面才有做用的。
android:state_checked=["true" | "false"]
这个是当一个组件被checked 或者没有checked 的时候的状态,也就是说只有在可checkable上面的组件才有做用的,通常常见的就是多选按钮组与单选按钮组里面的项,这个才有做用的。
android:state_enabled=["true" | "false"]
这个是当一个组件是否能处理touch或click事件的时候的状态,若是要对组件可否响应事件设置不一样背景的时候,就要靠这个属性了.
android:state_window_focused=["true" | "false"]
这个是是否对当前界面是否获得焦点的两种状态的设置,好比说当咱们打开一个界面,那么这个界面就得到了焦点,若是咱们去把“通知”拉下来,那么这个界面就失去焦点,或者弹出了一个对话框,那么这个界面也失去焦点了。
最后文档特别提醒:系统是从上往下匹配的,若是匹配到一个item那么它就将采用这个item,而不是采用的最佳匹配的规则,因此设置缺省的状态,必定要写在最后,不少人为了保险起见,一开始就把缺省的写好,那么这样后面全部的item就都不会起做用了,还会所以找不着哪里出了问题。
更多文章请访问: http://user.qzone.qq.com/469241633/main#!app=2&via=QZ.HashRefresh&pos=1341222376