大家在安卓開發(fā)中可能會一直有個疑問,android中selector工作原理是什么?為什么View設(shè)置selector背景后,View就能響應selector中設(shè)置了各種狀態(tài)? 如果要自己實現(xiàn)一個Drawable也能響應View的各種狀態(tài),需要怎么做这刷?
要回答這些問題,需要深入理解安卓的狀態(tài)系統(tǒng)娩井。從今天開始暇屋,我們會帶領(lǐng)大家逐步深入理解安卓的狀態(tài)設(shè)計,直到能夠回答我們所有對于狀態(tài)的疑問洞辣。
首先咐刨,我們來認識一下View的狀態(tài),在View類中扬霜,狀態(tài)的定義如下:
static final int VIEW_STATE_WINDOW_FOCUSED = 1;
static final int VIEW_STATE_SELECTED = 1 << 1;
static final int VIEW_STATE_FOCUSED = 1 << 2;
static final int VIEW_STATE_ENABLED = 1 << 3;
static final int VIEW_STATE_PRESSED = 1 << 4;
static final int VIEW_STATE_ACTIVATED = 1 << 5;
static final int VIEW_STATE_ACCELERATED = 1 << 6;
static final int VIEW_STATE_HOVERED = 1 << 7;
static final int VIEW_STATE_DRAG_CAN_ACCEPT = 1 << 8;
static final int VIEW_STATE_DRAG_HOVERED = 1 << 9;
也就是說定鸟,在安卓的設(shè)計中,狀態(tài)一共是10個著瓶,其含義分別如下:
狀態(tài) | 說明 |
---|---|
VIEW_STATE_WINDOW_FOCUSED | window處在前臺狀態(tài)联予,比如通知欄拖下時,window就不再是前臺狀態(tài) |
VIEW_STATE_SELECTED | 選中狀態(tài),比如CheckBox或者RadioButton的選中 |
VIEW_STATE_FOCUSED | 是否取得焦點躯泰,軌跡球和方向鍵可以觸發(fā)該狀態(tài),手機現(xiàn)在一般看不到該狀態(tài)华糖,機頂盒上比較常見 |
VIEW_STATE_ENABLED | 正常狀態(tài) |
VIEW_STATE_PRESSED | 按下狀態(tài) |
VIEW_STATE_ACTIVATED | 表示用戶選中了自己感興趣的項目麦向,比如勾選了ListView里的item中的CheckBox |
VIEW_STATE_ACCELERATED | 表示設(shè)置了硬件加速,如果有該標記客叉,則colorBackgroundCacheHint會被忽略 |
VIEW_STATE_HOVERED | 表示當有一個指針懸浮在該View之上 |
VIEW_STATE_DRAG_CAN_ACCEPT | 表示此View有能力接受用戶拖拽的其他View |
VIEW_STATE_DRAG_HOVERED | 表示在拖拽操作中诵竭, 有View正在位于自己的上方 |
接下來便是這些狀態(tài)與Android.R.attr里的屬性的對應:
static final int[] VIEW_STATE_IDS = new int[] {
R.attr.state_window_focused, VIEW_STATE_WINDOW_FOCUSED ,
R.attr.state_selected, VIEW_STATE_SELECTED,
R.attr.state_focused, VIEW_STATE_FOCUSED,
R.attr.state_enabled, VIEW_STATE_ENABLED,
R.attr.state_pressed, VIEW_STATE_PRESSED,
R.attr.state_activated, VIEW_STATE_ACTIVATED,
R.attr.state_accelerated, VIEW_STATE_ACCELERATED,
R.attr.state_hovered, VIEW_STATE_HOVERED,
R.attr.state_drag_can_accept, VIEW_STATE_DRAG_CAN_ACCEPT ,
R.attr.state_drag_hovered, VIEW_STATE_DRAG_HOVERED
};
為什么要有這個對應呢兼搏?因為我們在xml布局中也經(jīng)常要用到這些狀態(tài)卵慰,這些狀態(tài)是如何被使用的呢,請往下看:
R.attr可以在sdk/platforms/android-17/data/res/values/attrs.xml中找到佛呻,以上的屬性都屬于DrawableStates裳朋,以focus為例,其定義如下:
<attr name="state_focused" format="boolean" />
每一個屬性都是布爾類型的吓著,看到這里鲤嫡,大家一定會想起selector的寫法,比如:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true" android:drawable="@drawable/btn_selected"/>
</selector>
android命名空間對應就是/data/res绑莺,android:state_focused對應的就是R.attr.state_focused暖眼。
說到這兒,你應該對安卓中各個狀態(tài)有了初步的了解了纺裁,下一講诫肠,我們會一起討論一下這些狀態(tài)的組合。
by 如是我聞