日常開發當中,難免會出現這樣一種情況,為一個按鈕、TextView...設置一個點擊狀態的顏色改變,可能是background背景的改變,也可能是字體顏色的改變,簡單點說:默認狀態下,字體顏色或者背景是一種顏色,按下或者點擊的時候,變成另一種顏色。
這里面有一些小坑,為了避免踩到,特此小結一下。本文參考了 http://keeganlee.me/post/android/20150905。
(一)、selector做為drawable和color使用時的區別和注意事項
1、background的selector
結論:background的selector,item只能用drawable屬性,不能用color屬性,並且drawable還必須用引用的形式
2、textcolor的selector
結論:textcolor的selector,item不能使用drawable屬性,只能用color屬性,值可以直接指定,也可以引用指定。
總結:
1、selector作為drawable資源時,item必須使用android:drawable屬性指定,資源放在drawable目錄下
2、selector作為color資源時,item必須使用android:color屬性指定,資源放在color目錄下
注意:
1、color資源也可以放於drawable目錄,引用時則用@drawable來引用,但不推薦這么做,drawable資源和color資源最好還是分開;
2、android:drawable屬性除了引用@drawable資源,也可以引用@color顏色值;但android:color只能引用@color;
3、item的狀態是從上往下匹配的,如果匹配到一個item的狀態,那它就將采用這個item指定的資源,而不是采用最佳匹配的規則;所以設置默認的狀態,一定要寫在最后,如果寫在前面,則后面所有的item都不會起作用了(重點)。
關於適用的時候的注意區別和注意事項就這些,下面讓我們看看selector下的屬性和item下的屬性介紹。
(二)、selector下的屬性
1、android:dither="true"
布爾值。值為“true”時,將在位圖的像素配置與屏幕不同時(例如:ARGB 8888 位圖和 RGB 565 屏幕)啟用位圖的抖動;值為“false”時則停用抖動。默認值為 true。
2、android:visible="true"
設置初始的可見性狀態,默認為false
3、android:autoMirrored="true"
設置圖片是否需要鏡像反轉,當布局方向是RTL,即從右到左布局時才有用,API Level 19(Android 4.4)才添加的屬性
4、android:constantSize="true"
布爾值。
可繪制對象報告的內部大小,在狀態變更時保持不變,則值為“true”(大小是所有狀態的最大值);
如果大小根據當前狀態而變化,則值為“false”。默認值為 false。
5、android:variablePadding="true"
布爾值。
如果可繪制對象的內邊距,應根據選擇的當前狀態而變化,則值為“true”;
如果內邊距應保持不變(基於所有狀態的最大內邊距),則值為“false”。啟用此功能要求您在狀態變更時處理執行布局,這通常不受支持。默認值為 false。
6、android:exitFadeDuration="1000"
狀態改變時,舊狀態消失時的淡出時間,以毫秒為單位
7、android:enterFadeDuration="1000"
狀態改變時,新狀態展示時的淡入時間,以毫秒為單位
(三)、item下的屬性
1、android:drawable
可繪制對象資源。必備。引用要插入的可繪制對象資源。
2、android:state_pressed
布爾值。
如果在按下對象(例如觸摸/點按某按鈕)時應使用此項目,則值為“true”;
如果在默認的未按下狀態時應使用此項目,則值為“false”。
3、android:state_checked
布爾值。如果在對象已選中時應使用此項目,則值為“true”;
如果在對象未選中時應使用此項目,則值為“false”。
4、android:state_checkable
布爾值。
如果當對象可選中時應使用此項目,則值為“true”;
如果當對象不可選中時應使用此項目,則值為“false”。(僅當對象可在可選中與不可選中小部件之間轉換時才有用。)
5、android:state_selected
布爾值。
如果在使用定向控件瀏覽(例如使用方向鍵瀏覽列表)的情況下,對象為當前用戶選擇時應使用此項目,則值為“true”;
如果在未選擇對象時應使用此項目,則值為“false”。當焦點 (android:state_focused
) 不充分(例如,列表視圖有焦點但使用方向鍵選擇其中的項目)時,使用所選狀態。
6、android:state_enabled
布爾值。
如果在對象啟用(能夠接收觸摸/點擊事件)時應使用此項目,則值為“true”;
如果在對象停用時應使用此項目,則值為“false”。
7、android:state_focused
布爾值。
如果在對象具有輸入焦點(例如當用戶選擇文本輸入時)時應使用此項目,則值為“true”;
如果在默認的非焦點狀態時應使用此項目,則值為“false”。
8、android:state_activated
布爾值。
如果在對象激活作為持續選擇(例如,在持續導航視圖中“突出顯示”之前選中的列表項)時應使用此項目,則值為“true”;
如果在對象未激活時應使用此項目,則值為“false”。此項為 API 級別 11 新引入的配置。
9、android:state_hovered
布爾值。
如果當光標懸停在對象上時應使用此項目,則值為“true”;
如果在默認的非懸停狀態時應使用此項目,則值為“false”。
通常,這個可繪制對象可能與用於“聚焦”狀態的可繪制對象相同。此項為 API 級別 14 新引入的配置。
10、android:state_window_focused
布爾值。
如果當應用窗口有焦點(應用在前台)時應使用此項目,則值為“true”;
如果當應用窗口沒有焦點(例如,通知欄下拉或對話框出現)時應使用此項目,則值為“false”。
以下不常見的屬性,目前還不清楚什么用,待補充。
11、android:state_last
12、android:state_first
13、android:state_middle
14、android:state_single
15、android:state_drag_can_accept
16、android:state_drag_hovered
17、android:state_accelerated
18、android:state_active
其實,在實際開發的過程中,這里面的很多屬性都不會用到,大多數情況下,我們只需要根據控件的狀態,設置相應的drawable或color資源就可以了,同時可以使用多個狀態。例如:
至此,selector及item下的屬性和drawable、color屬性時的注意事項全部介紹完畢!!!感謝閱讀。