大家在安卓開發中可能會一直有個疑問,android中selector工作原理是什麼?為什麼view設定selector背景後,view就能響應selector中設定了各種狀態? 如果要自己實現乙個drawable也能響應view的各種狀態,需要怎麼做?
要回答這些問題,需要深入理解安卓的狀態系統。從今天開始,我們會帶領大家逐步深入理解安卓的狀態設計,直到能夠回答我們所有對於狀態的疑問。
首先,我們來認識一下view的狀態,在view類中,狀態的定義如下:
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;
也就是說,在安卓的設計中,狀態一共是10個,其含義分別如下:
狀態說明
view_state_window_focused
window處在前台狀態,比如通知欄拖下時,window就不再是前台狀態
view_state_selected
選中狀態,比如checkbox或者radiobutton的選中
view_state_focused
是否取得焦點,軌跡球和方向鍵可以觸發該狀態,手機現在一般看不到該狀態,機頂盒上比較常見
view_state_enabled
正常狀態
view_state_pressed
按下狀態
view_state_activated
表示使用者選中了自己感興趣的專案,比如勾選了listview裡的item中的checkbox
view_state_accelerated
表示設定了硬體加速,如果有該標記,則colorbackgroundcachehint會被忽略
view_state_hovered
表示當有乙個指標懸浮在該view之上
view_state_drag_can_accept
表示此view有能力接受使用者拖拽的其他view
view_state_drag_hovered
表示在拖拽操作中, 有view正在位於自己的上方
接下來便是這些狀態與android.r.attr裡的屬性的對應:
static
final
int view_state_ids = new
int ;
為什麼要有這個對應呢?因為我們在xml布局中也經常要用到這些狀態,這些狀態是如何被使用的呢,請往下看: r.attr可以在sdk/platforms/android-17/data/res/values/attrs.xml中找到,以上的屬性都屬於drawablestates,以focus為例,其定義如下:
name="state_focused"
format="boolean" />
每乙個屬性都是布林型別的,看到這裡,大家一定會想起selector的寫法,比如:
<?xml version="1.0" encoding="utf-8"?>
xmlns:android="">
android:state_focused="true"
android:drawable="@drawable/btn_selected"/>
selector>
android命名空間對應就是/data/res,android:state_focused對應的就是r.attr.state_focused。
說到這兒,你應該對安卓中各個狀態有了初步的了解了,下一講,我們會一起討論一下這些狀態的組合。
Android 螢幕(View)座標系統
首先明確一下 android中的座標系統 螢幕的左上角是座標系統原點 0,0 原點向右延伸是x軸正方向,原點向下延伸是y軸正方向。一 view的座標 需要注意view的座標是相對父容器而言的,包括 gettop getbottom getleft getright 以gettop為例,函式源 為 t...
Android 螢幕(View)座標系統
首先明確一下 android中的座標系統 螢幕的左上角是座標系統原點 0,0 原點向右延伸是x軸正方向,原點向下延伸是y軸正方向。一 view的座標 需要注意view的座標是相對父容器而言的,包括 gettop getbottom getleft getright 以gettop為例,函式源 為 t...
Android 最簡單的映象系統View控制項
安卓自帶的控制項沒有映象功能,沒關係我們可以自己實現乙個。其實很簡單,重寫系統控制項的draw方法,不是ondraw方法。具體可以看原始碼 這是我寫的seekbar的映象,公司需求 package com.finals.oilrank.util.view import android.content...