Selector中的各種狀態詳解



更多文章請訪問: http://user.qzone.qq.com/469241633/main#!app=2&via=QZ.HashRefresh&pos=1341222376

今天弄這個selector把腦殼弄得清痛,最終我的理解如下:

官方關於這個的介紹在:http://developer.android.com/guide/topics/resources/drawable-resource.html#StateList

先複製一個樣例:

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android"    android:constantSize=["true" "false"]

android:dither=["true" "false"]

android:variablePadding=["true" "false">    

<item        

 android:drawable="@[package:]drawable/drawable_resource"              android:state_pressed=["true" "false"]

  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總之就是背景狀態,一般背景都是把控件的後面全部覆蓋,但有的時候我們要設置設固定的大小,比如一個Button300*200大,而設置這個Button的背景圖片只有200*100,而現在我們又不想圖片被拉大把覆蓋整個Button的底層,那麼就可以把這個屬性設置爲true,這樣圖片就只顯示在中間了,就像我們設置桌面背景一樣,可以設置成居中、拉伸,如果這裏設置成true就相當於居中,如果不設置或者設置爲false就是拉伸.

android:dither=["true" "false"]

這個東西是說是否讓系統來幫我們處理顏色差異,一般android系統中使用的顏色是ARGB_8888,但很多顯示設置是RGB_565,這個ARGB_8888RGB_565有什麼區別呢。這個ARGB_8888也就是說每一個像素點要拿4個字節來保存,依次每個字節是A8個字節,R8個字節,G8個字節,B8個字節,來保存,而RGB_565它只用了兩個字節來保存顏色,兩個字節總共16位,前5位保存R,中間6位保存G,5位保存B.因此呀,如果android系統的點顯示到屏幕上,還得轉換一下,在這裏這個dither就起作用了,

如果我們把它設置爲true的話,那顯示的時候屏幕間斷的取點,這樣的結果,有的時候看上去就有那種分層的感覺,也就是前面一部分的顏色與後面一部分的顏色感覺斷層了,就是很不平滑的感覺,如果我們這裏設置爲true的話,默認就是trueandroid系統,它會在取的點之間再經過一些計算,在其間補充一點相間的顏色使看起來比較平滑,但這樣和真的圖片還是有差異的,因些有的人想要得到很逼真的顯示,這裏就得自己來計算了,自己來計算,即佔內存又佔cpu,但顏色可以很逼真,如果有這樣的需求那這裏就要把這個屬性設置爲false

android:variablePadding

這個是可變的填充,這個有什麼用呢?這個就是,在噹噹前這個組件被selected的時候,比如某一個tabselected,或者listView裏面的個itemselected的時候,如果設置爲true的話,那麼被選的這個tabitem的填充就會變大,使得看上去與其它的tabitem不一樣。

接下來就是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被選擇的時候的狀態,因此這個屬性設置在一般的組件上面是沒有用的,只有設置有作爲tabitem的佈局裏面的項時,這個屬才起作用.

android:state_checkable=["true" "false"]

這個是當一個組件在可以checked或不可以checked的時候的狀態,現在較常見的,能夠checkable的組件有,單選項和多選項,所以這個屬性只有設置在像這類組件上面纔有作用的。

android:state_checked=["true" "false"]

這個是當一個組件被checked 或者沒有checked 的時候的狀態,也就是說只有在可checkable上面的組件纔有作用的,一般常見的就是多選按鈕組與單選按鈕組裏面的項,這個纔有作用的。

android:state_enabled=["true" "false"]

這個是當一個組件是否能處理touchclick事件的時候的狀態,如果要對組件能否響應事件設置不同背景的時候,就要靠這個屬性了.

android:state_window_focused=["true" "false"]

這個是是否對當前界面是否得到焦點的兩種狀態的設置,比如說當我們打開一個界面,那麼這個界面就獲得了焦點,如果我們去把“通知”拉下來,那麼這個界面就失去焦點,或者彈出了一個對話框,那麼這個界面也失去焦點了。

最後文檔特別提醒:系統是從上往下匹配的,如果匹配到一個item那麼它就將採用這個item,而不是採用的最佳匹配的規則,所以設置缺省的狀態,一定要寫在最後,很多人爲了保險起見,一開始就把缺省的寫好,那麼這樣後面所有的item就都不會起作用了,還會因此找不着哪裏出了問題。


更多文章請訪問: http://user.qzone.qq.com/469241633/main#!app=2&via=QZ.HashRefresh&pos=1341222376

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章