更多文章請訪問: 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