Android狀態系統 View狀態設計

2021-06-27 07:40:29 字數 2445 閱讀 5743

大家在安卓開發中可能會一直有個疑問,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...