Android如何判斷頁(yè)面是否全屏
Android 想判斷 Activity 是否是全屏,網(wǎng)上找了些方法,看到有直接獲取 flags 和一個(gè)具體的值比較,并沒(méi)有用,其實(shí)分析下來(lái)也覺(jué)得應(yīng)該不對(duì)。大多都是如何設(shè)置全屏和取消全屏,并沒(méi)有判斷是否全屏的方法。
其實(shí)全屏控制要么通過(guò)主題設(shè)置,要么代碼 addFlags,最終都會(huì)到 Window 的 setFlags 方法里,下面看源碼:
public void setFlags(int flags, int mask) { final WindowManager.LayoutParams attrs = getAttributes(); attrs.flags = (attrs.flags&~mask) | (flags&mask); mForcedWindowFlags |= mask; dispatchWindowAttributesChanged(attrs);}
主要的邏輯就是這一句:
attrs.flags = (attrs.flags&~mask) | (flags&mask)
是位運(yùn)算,看一下 attrs 里可以設(shè)置的 flag 常量
public static final int FLAG_ALLOW_LOCK_WHILE_SCREEN_ON = 0x00000001;public static final int FLAG_DIM_BEHIND = 0x00000002;public static final int FLAG_BLUR_BEHIND = 0x00000004;public static final int FLAG_NOT_FOCUSABLE= 0x00000008;public static final int FLAG_NOT_TOUCHABLE= 0x00000010;public static final int FLAG_NOT_TOUCH_MODAL = 0x00000020;public static final int FLAG_TOUCHABLE_WHEN_WAKING = 0x00000040;public static final int FLAG_KEEP_SCREEN_ON= 0x00000080;public static final int FLAG_LAYOUT_IN_SCREEN = 0x00000100;public static final int FLAG_LAYOUT_NO_LIMITS = 0x00000200;public static final int FLAG_FULLSCREEN = 0x00000400;public static final int FLAG_FORCE_NOT_FULLSCREEN = 0x00000800;public static final int FLAG_DITHER = 0x00001000;public static final int FLAG_SECURE = 0x00002000;public static final int FLAG_SCALED = 0x00004000;public static final int FLAG_IGNORE_CHEEK_PRESSES = 0x00008000;public static final int FLAG_LAYOUT_INSET_DECOR = 0x00010000;public static final int FLAG_ALT_FOCUSABLE_IM = 0x00020000;public static final int FLAG_WATCH_OUTSIDE_TOUCH = 0x00040000;public static final int FLAG_SHOW_WHEN_LOCKED = 0x00080000;public static final int FLAG_SHOW_WALLPAPER= 0x00100000;public static final int FLAG_TURN_SCREEN_ON= 0x00200000;public static final int FLAG_DISMISS_KEYGUARD = 0x00400000;public static final int FLAG_SPLIT_TOUCH = 0x00800000;public static final int FLAG_HARDWARE_ACCELERATED = 0x01000000;public static final int FLAG_LAYOUT_IN_OVERSCAN = 0x02000000;public static final int FLAG_TRANSLUCENT_STATUS = 0x04000000;public static final int FLAG_TRANSLUCENT_NAVIGATION = 0x08000000;public static final int FLAG_LOCAL_FOCUS_MODE = 0x10000000;public static final int FLAG_SLIPPERY = 0x20000000;public static final int FLAG_LAYOUT_ATTACHED_IN_DECOR = 0x40000000;public static final int FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS = 0x80000000;
很明顯,這些十六進(jìn)制值換成二進(jìn)制的話,都只有一個(gè) 1,而且每個(gè)變量的 1 處于不同的位置,所以設(shè)置一個(gè) flag 肯定就是將 flags 的對(duì)應(yīng)位置設(shè)為 1,而 clearFlags 就是將對(duì)應(yīng)位置設(shè)為 0。
比如 FLAG_FULLSCREEN 值為 0x00000400,換成二進(jìn)制的話后面的位就是 0100 0000 0000,它控制的是從右向左數(shù)第 11 位。而 addFlags 時(shí)兩個(gè)參數(shù) flags 和 mask 一樣。所以 (attrs.flags&~mask) | (flags&mask) 的 flags&mask 自己和自己作與運(yùn)算,結(jié)果還是自己,而 ~mask 結(jié)尾為 1011 1111 1111,和原來(lái)的 flags 作與運(yùn)算,則第 11 位肯定變成了 0,其它位和 1 作與運(yùn)算,保持原樣,再和后面做或,則第 11 位又變成了 1,而且這次運(yùn)算只會(huì)影響到第 11 位,其它位置不變,不管原來(lái)第 11 位是 0 還是 1,結(jié)果都會(huì)變成 1。
相似的,如果是 clearFlags,第一個(gè)參數(shù)變成 0,第二個(gè)參數(shù)是 FLAG_FULLSCREEN,這樣 (flags&mask) 必定為 0,只看前面,(attrs.flags&~mask) 這個(gè)運(yùn)算第 11 位必為 0。
其實(shí) (attrs.flags&~mask) | (flags&mask) 前面的與運(yùn)算會(huì)將對(duì)應(yīng)位置變成 0,然后看后面的與運(yùn)算,后面算出結(jié)果對(duì)應(yīng)位置是 1,那最終就是 1,后面算出是 0,那最終也是 0。而后面的控制就是 0 或者自己和自己作個(gè)與運(yùn)算。
說(shuō)了一大堆廢話,其實(shí)就是最基礎(chǔ)的位運(yùn)算。那么想判斷是否全屏很簡(jiǎn)單,只要看 flags 從右向左數(shù)第 11 位是 0 還是 1,只要與 FLAG_FULLSCREEN 做個(gè)邏輯與就行了,除了第 11 位,其它位都變成了 0。
判斷方法為:
if ( (getWindow().getAttributes().flags & WindowManager.LayoutParams.FLAG_FULLSCREEN) == WindowManager.LayoutParams.FLAG_FULLSCREEN) { // 是全屏}
到這里就結(jié)束啦.
以上就是Android如何判斷頁(yè)面是否全屏的詳細(xì)內(nèi)容,更多關(guān)于Android 判斷頁(yè)面是否全屏的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. React+umi+typeScript創(chuàng)建項(xiàng)目的過(guò)程2. .Net core 的熱插拔機(jī)制的深入探索及卸載問(wèn)題求救指南3. ASP調(diào)用WebService轉(zhuǎn)化成JSON數(shù)據(jù),附j(luò)son.min.asp4. SharePoint Server 2019新特性介紹5. 三個(gè)不常見(jiàn)的 HTML5 實(shí)用新特性簡(jiǎn)介6. 解決ASP中http狀態(tài)跳轉(zhuǎn)返回錯(cuò)誤頁(yè)的問(wèn)題7. ASP中常用的22個(gè)FSO文件操作函數(shù)整理8. 無(wú)線標(biāo)記語(yǔ)言(WML)基礎(chǔ)之WMLScript 基礎(chǔ)第1/2頁(yè)9. ASP.NET Core 5.0中的Host.CreateDefaultBuilder執(zhí)行過(guò)程解析10. ASP編碼必備的8條原則
