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

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

StateListDrawable對應的XML根元素是<selector>失乾,它可以根據(jù)View的狀態(tài)的不同匹配展示不同的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>

二、子節(jié)點

iStateListDrawable對應的XML根元素是<selector>俺泣,它可以根據(jù)View的狀態(tài)的不同匹配展示不同的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>

二熟掂、子節(jié)點

子節(jié)點要關心只有 selector里面的屬性和item里面的狀態(tài)缎浇。
每一個item表示一個Drawable,item里面放什么怎么主要關系不大赴肚,我們關注的只有item的狀態(tài)素跺。

  • android:constantSize
    StateListDrawable的大小是否隨著View的狀態(tài)的改變而改變。true固定大小誉券,不隨之改變指厌,false為隨著改變拉伸自身大小。
    默認為false踊跟。
    .
    .

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

  • android:variablePadding
    默認false琴锭,建議false
    是否隨著View的狀態(tài)的改變而改變padding晰甚,如果為true,padding的狀態(tài)會隨著改變决帖,如果為false厕九,那么就采用item內(nèi)部的Drawable自身設定的padding的值。

  • 主要關心item里面的Drawable的狀態(tài)判定

狀態(tài) 含義
android:state_pressed 按下的狀態(tài)地回,(按下但是還沒松開)
android:state_focused 當前View獲取了焦點
android:state_selected 用戶選擇了當前View
android:state_checked 用戶選中了View扁远,一般用于CheckBox這種非黑即白的選項
android:state_enabled 當前View處于可用的狀態(tài)
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湃缎、系統(tǒng)查找順序是順著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各個屬性詳解

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市蹂季,隨后出現(xiàn)的幾起案子冕广,更是在濱河造成了極大的恐慌,老刑警劉巖偿洁,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件撒汉,死亡現(xiàn)場離奇詭異梗醇,居然都是意外死亡缸逃,警方通過查閱死者的電腦和手機冲呢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門苛聘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來榛瓮,“玉大人琅豆,你說我怎么就攤上這事点待×揖” “怎么了爱榕?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵瓣喊,是天一觀的道長。 經(jīng)常有香客問我黔酥,道長藻三,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任跪者,我火速辦了婚禮棵帽,結果婚禮上,老公的妹妹穿的比我還像新娘渣玲。我一直安慰自己逗概,他們只是感情好,可當我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布忘衍。 她就那樣靜靜地躺著逾苫,像睡著了一般卿城。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上铅搓,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天瑟押,我揣著相機與錄音,去河邊找鬼星掰。 笑死多望,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的氢烘。 我是一名探鬼主播便斥,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼威始!你這毒婦竟也來了?” 一聲冷哼從身側響起像街,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤黎棠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后镰绎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體脓斩,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年畴栖,在試婚紗的時候發(fā)現(xiàn)自己被綠了随静。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡吗讶,死狀恐怖燎猛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情照皆,我是刑警寧澤重绷,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站膜毁,受9級特大地震影響昭卓,放射性物質發(fā)生泄漏。R本人自食惡果不足惜瘟滨,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一候醒、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧杂瘸,春花似錦倒淫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽占业。三九已至,卻和暖如春纯赎,著一層夾襖步出監(jiān)牢的瞬間谦疾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工犬金, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留念恍,地道東北人。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓晚顷,卻偏偏與公主長得像峰伙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子该默,可洞房花燭夜當晚...
    茶點故事閱讀 44,941評論 2 355

推薦閱讀更多精彩內(nèi)容