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>
.
.
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輸入框
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"/>
了解更多的Drawable分類 Drawable圖像資源抽象類
本篇完
相關參考
作者:阿敏其人
鏈接:https://www.jianshu.com/p/7257ce82c762
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
