Drawable子類之——StateListDrawable (選擇器)


Drawable子類之——StateListDrawable (選擇器)

https://www.jianshu.com/p/7257ce82c762

本文出自 “阿敏其人” 簡書博客,轉載或引用請注明出處。

StateListDrawable對應的XML根元素是<selector>,它可以根據View的狀態的不同匹配展示不同的Drawable。比如點擊時背景是紅色,不點擊時時白色,所以StateListDrawable鯧魚點擊事件的背景。

我們常常給按鈕的按下的時候設定一個特殊的背景,大概如下

<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" android:drawable="@color/little_gray"></item> <item android:state_focused="true" android:drawable="@color/little_gray"></item> <item android:drawable="@color/big_bg_color"></item> </selector> 

一、語法


<?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> 

二、子節點

iStateListDrawable對應的XML根元素是<selector>,它可以根據View的狀態的不同匹配展示不同的Drawable。比如點擊時背景是紅色,不點擊時時白色,所以StateListDrawable鯧魚點擊事件的背景。

一、語法


<?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> 

二、子節點

子節點要關心只有 selector里面的屬性和item里面的狀態。
每一個item表示一個Drawable,item里面放什么怎么主要關系不大,我們關注的只有item的狀態。

  • android:constantSize
    StateListDrawable的大小是否隨着View的狀態的改變而改變。true固定大小,不隨之改變,false為隨着改變拉伸自身大小。
    默認為false。
    .
    .

  • android:dither
    是否開啟抖動,開。
    .
    .

  • android:variablePadding
    默認false,建議false
    是否隨着View的狀態的改變而改變padding,如果為true,padding的狀態會隨着改變,如果為false,那么就采用item內部的Drawable自身設定的padding的值。

  • 主要關心item里面的Drawable的狀態判定

狀態 含義
android:state_pressed 按下的狀態,(按下但是還沒松開)
android:state_focused 當前View獲取了焦點
android:state_selected 用戶選擇了當前View
android:state_checked 用戶選中了View,一般用於CheckBox這種非黑即白的選項
android:state_enabled 當前View處於可用的狀態
android:state_hovered 光標是否懸停,通常與focused state相同,它是4.0的新特性
android:state_checkable 組件是否能被check。如:RadioButton是可以被check的。
android:state_activated 是否被激活
android:state_window_focused 應用程序是否在前台,當有通知欄被拉下來或者一個對話框彈出的時候應用程序就不在前台了

三、特點

1、item可以用多個,item里面放的是Drawable
2、系統查找順序是順着item從上到下知道找到就停止往下尋找。

四、Demo演示

這里的demo我們在 Drawable子類之—— Drawable子類之—— ShapeDrawable (圖形定義)使用過。

圓形的點擊變換顏色

<?xml version="1.0" encoding="utf-8"?> <!--別看這里我們使用的是ovrl(橢圓) ,但是我們得到可是 圓形 的點擊效果--> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" > <shape android:shape="oval"> <solid android:color="#ff0000" /> <stroke android:width="4dp" android:color="#294736" /> </shape> </item> <item > <shape android:shape="oval"> <solid android:color="#848374" /> <stroke android:width="4dp" android:color="#745863" /> </shape> </item> </selector> 
 
圓形的點擊顏色變化.gif

.
.
Edittext的背景框和焦點變化

<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:state_window_focused="false"> <shape android:shape="rectangle"> <solid android:color="#FFFFFFFF"/> <corners android:radius="3dp"/> <padding android:left="10dp" android:right="10dp"/> <stroke android:width="1dp" android:color="#BDC7D8"/> </shape> </item> <item android:state_focused="true" > <shape android:shape="rectangle" > <solid android:color="#FFFFFFFF"/> <corners android:radius="3dp"/> <padding android:left="10dp" android:right="10dp"/> <stroke android:width="1dp" android:color="#728ea3"/> </shape> </item> </selector> 
 
Edittext的焦點變化.gif

Edittext輸入框

selector_edittext_line

<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_pressed="true" > <shape android:shape="rectangle"> <corners android:radius="10dp" /> <solid android:color="@color/deep_orange" /> </shape> </item> <item > <shape android:shape="rectangle"> <corners android:radius="10dp" /> <solid android:color="@color/orange" /> </shape> </item> </selector> 

使用

 <EditText
            android:id="@+id/username" android:layout_width="match_parent" android:layout_height="40dp" android:layout_gravity="center_horizontal" android:background="@null" android:drawableBottom="@drawable/selector_edittext_line" android:hint="@string/user_name" android:paddingLeft="10dip" android:singleLine="true" android:textColor="#000" android:textSize="18sp"/> 
 
下划線.gif

了解更多的Drawable分類 Drawable圖像資源抽象類
本篇完


相關參考

Android之drawable state各個屬性詳解



作者:阿敏其人
鏈接:https://www.jianshu.com/p/7257ce82c762
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM