Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android中selector的初步認識(一)

Android中selector的初步認識(一)

編輯:關於Android編程

最近在看代碼的時候,看到很多時候,在代碼中會使用selector來控制button或listview在不同狀態下樣式(比如在滾動圖片的例子中)


今天,我就來著重學習一下在android中selector的用法


我查了一下android的API文檔,在API文檔中,對這樣的寫法的名稱叫做state list

我們可以在這個地址(http://developer.android.com/intl/zh-cn/guide/topics/resources/drawable-resource.html)查看到API中對state list的說明,本文的主要內容其實就是對API文檔的翻譯和解讀


下面是對StateListDrawable(編譯後對應的對象)的整體描述

A StateListDrawable is a drawableobject defined in XML that uses a several different images to represent thesame graphic, depending on the state of the object. For example, a Button widget canexist in one of several different states (pressed, focused, or niether) and,using a state list drawable, you can provide a different background image foreach state.

You can describe thestate list in an XML file. Each graphic is represented by an element insidea single element. Each uses variousattributes to describe the state in which it should be used as the graphic forthe drawable.

During eachstate change, the state list is traversed top to bottom and the first item thatmatches the current state is used—the selection is not based on the "best match," but simply the first itemthat meets the minimum criteria of the state.

StateListDrawable是在XML中定義的一個可繪制(drawable)的對象,它可以根據狀態的不同為同一個圖形更換不同的圖片。比如說,對於一個按鈕控件(Button)可以有幾種不同的狀態(pressed,focused或者其它),你可以使用state list為其中的每一個狀態來設置按鈕的背景圖片。

你可以在XML文件中申明state list。在Selector標簽中每一對item標簽對應一個圖形。每個item標簽中都可以設置一個屬性值去表示當前狀態下圖形的樣子。

每當狀態發生改變時,系統會在state list中從上到下遍歷尋找與之相匹配的狀態。注意,這裡在遍歷時只會取去當前狀態相匹配的第一個Item,而不是最匹配的那一個。


XML文件的位置:

res/drawable/filename.xml

編譯後的數據類型:

該文件將會編譯為一個StateListDrawable對象

如何引用該文件:

In Java: R.drawable.filename

In XML: @[package:]drawable/filename



接下來,我們看一下,在配置XML文件時,需要用到的屬性:


    


這是在API文檔中列舉出來的,在selector中可能會用到的標簽及屬性 下面,讓我們來一一解讀一下這些標簽和屬性:

selector標簽,這個標簽是必要的標簽,而且應當作為XML文件的根節點,在selector可以有一或多個item子標簽 在selector標簽中,我們可以配置以下幾種屬性: xmlns:android="http://schemas.android.com/apk/res/android" 這個是android的命名空間,默認這麼寫就可以
android:constantSize 這個是布爾型,false表示各個狀態的大小(size)各自不同,true表中所有的狀態大小相同(以最大的為准)。默認為false
android:dither 布爾型。true表示,如果一個屏幕中位圖有這不同的像素配置,啟用位圖的抖動。false表示不啟用位圖的抖動。默認為true。據度娘:dither,抖動,是一種故意造成的噪音用以隨機化量化誤差,阻止大幅度拉升圖像時導致的像banding(色帶)這樣的問題。
android:variablePadding 布爾型。選擇true時,drawable的內邊距會根據狀態的變化而變化,設置為true時,你必須為不同的狀態配置layout,但是通常不建議這麼做。選擇false時,內邊距保持一致,所有狀態中最大的內邊距。默認為false

接下來是Item標簽 item標簽,通過一些屬性的配置,定義drawable的特定狀態。該標簽必須作為selector的子標簽。 在item標簽中,我們可以配置一下幾種屬性

android:drawable

這個屬性是必須的,為當前控件指定資源。

android:state_pressed

布爾值。true指當用戶點擊或者觸摸該控件的狀態。默認為false

android:state_focused

布爾值。ture指當前控件獲得焦點時的狀態。默認為false

android:state_hovered

布爾值。true表示光標移動到當前控件上的狀態。默認為false

android:state_selected

布爾值。true表示被選擇的狀態,例如在一個下拉列表中用方向鍵下選擇其中一個選項。

這個和focus的區別,selected是focus不充分的情況。比如一個listview獲得焦點(focus),而用方向鍵選擇了其中的一個item(selected)

android:state_checkable

布爾值。ture表示可以被勾選的狀態。這個僅在當控件具有被勾選和不被勾選的狀態間轉換時才起作用。

android:state_checked

布爾值。true表示當前控件處於被勾選(check的狀態)

android:state_enabled

布爾值。true表示當前控件出於可用的狀態。比如可以被點擊

android:state_activated

布爾值。true表示當前控件被激活的狀態。

android:state_window_focused

布爾值。true表示當前控件出於最前端時,應用窗口獲得焦點的狀態。


注意:安卓程序在讀取這個文件時,只會讀取符合當前控件狀態的第一個Item的內容。如果在selector下的第一個item中沒有標注以上任何一個狀態,那麼它表示使用任何狀態,將會在空間每次狀態變化時只讀取這個item的內容。所以,這樣的默認的配置,一般都會置於最下面的item中。


由於水平有限,翻譯的質量不是很高,有什麼不准確的地方希望大家指正。而且我覺得想要更深入的理解還是需要在實際的代碼中,所以下一篇中我會使用一個例子來測試一下各種屬性和狀態有什麼不同,如果在寫代碼中發現什麼問題,我也會盡量補充到這篇博客中的。
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved