View 中 flag標(biāo)記,掩碼位運(yùn)算

一:前言

在Android源碼中, 發(fā)現(xiàn)了大量使用使用位運(yùn)算 & | << ~, 有一次我看到view.setClickable(true)方法時(shí), 發(fā)現(xiàn)它竟然是這樣的(如下代碼), 當(dāng)時(shí)我就傻眼了,好端端的一個(gè)boolean值, 保存就完事了, 為啥要搞得這么復(fù)雜?

    public void setClickable(boolean clickable) {
        setFlags(clickable ? CLICKABLE : 0, CLICKABLE);
    }

二. 使用掩碼位運(yùn)算 保存數(shù)據(jù)的本質(zhì)

本質(zhì): 利用二進(jìn)制位, 去保存一些值.
例如:boolean值在jvm中占了4個(gè)字節(jié), 也就是32位,如下圖:
如果使用二進(jìn)制位,每位用0/1去保存一個(gè)布爾值, 那4個(gè)字節(jié)就可以保存32個(gè)布爾值, 從而節(jié)省內(nèi)存.


1658559590(1).png

三. View 中 flag標(biāo)記如何保存:

例如:初始值如下

flags = 0  //初始值

int a = 0x1 << 1;  ---> 0001    ---> 2^0 = 1
int b = 0x1 << 2;  ---> 0010    ---> 2^1 = 2
int c = 0x1 << 3;  ---> 0100    ---> 2^2 = 4
int d = 0x1 << 4;  ---> 1000    ---> 2^3 = 8

以a為例,計(jì)算過(guò)程如下圖:

位運(yùn)算過(guò)程.png

結(jié)論如下:


//添加標(biāo)記
flags |= a  --->  添加標(biāo)記 a
flags |= b  --->  添加標(biāo)記 b


//移除標(biāo)記
flags &= ~a  --->  移除標(biāo)記 a
flags &= ~b  --->  移除標(biāo)記 b


//取出標(biāo)記
flags & a  --->  取出標(biāo)記 a   ----> 取出結(jié)果:a本身    或者 0
flags & b  --->  取出標(biāo)記 b

如下圖, 看flag值 , 就可以得出存了哪些值


flag值.png

四. 運(yùn)算規(guī)則

1 & 任何數(shù)都是那個(gè)數(shù)本身
0 & 任何數(shù)都是 0
0 | 任何數(shù)都是那個(gè)數(shù)本身
1 | 任何數(shù)都是 1
五. 在ViewGoup的標(biāo)記位
int mGroupFlags;  --->默認(rèn)為0



int FLAG_CLIP_CHILDREN = 0x1;     ---> 2^0 = 1

int FLAG_CLIP_TO_PADDING = 0x2;      ---> 2^1 = 2

int FLAG_INVALIDATE_REQUIRED  = 0x4;     ---> 2^2 = 4

int FLAG_RUN_ANIMATION = 0x8;      ---> 2^3 = 8

int FLAG_ANIMATION_DONE = 0x10;     ---> 2^4 = 16

int FLAG_PADDING_NOT_NULL = 0x20;     ---> 2^5 = 32

int FLAG_ANIMATION_CACHE = 0x40;     ---> 2^6 = 64

int FLAG_OPTIMIZE_INVALIDATE = 0x80;      ---> 2^7 = 128

int FLAG_CLEAR_TRANSFORMATION = 0x100;      ---> 2^7 = 256

int FLAG_NOTIFY_ANIMATION_LISTENER = 0x200;     ---> 2^7 = 512

int FLAG_USE_CHILD_DRAWING_ORDER = 0x400;     ---> 2^8 = 1024
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容