中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android怎么判斷頁面是否全屏

發布時間:2021-04-07 11:26:34 來源:億速云 閱讀:225 作者:小新 欄目:開發技術

小編給大家分享一下Android怎么判斷頁面是否全屏,希望大家閱讀完這篇文章之后都有所收獲,下面讓我們一起去探討吧!

Android 想判斷 Activity 是否是全屏,網上找了些方法,看到有直接獲取 flags 和一個具體的值比較,并沒有用,其實分析下來也覺得應該不對。大多都是如何設置全屏和取消全屏,并沒有判斷是否全屏的方法。

其實全屏控制要么通過主題設置,要么代碼 addFlags,最終都會到 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)

是位運算,看一下 attrs 里可以設置的 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;

很明顯,這些十六進制值換成二進制的話,都只有一個 1,而且每個變量的 1 處于不同的位置,所以設置一個 flag 肯定就是將 flags 的對應位置設為 1,而 clearFlags 就是將對應位置設為 0。

比如 FLAG_FULLSCREEN 值為 0x00000400,換成二進制的話后面的位就是 0100 0000 0000,它控制的是從右向左數第 11 位。而 addFlags 時兩個參數 flags 和 mask 一樣。所以 (attrs.flags&~mask) | (flags&mask) 的 flags&mask 自己和自己作與運算,結果還是自己,而 ~mask 結尾為 1011 1111 1111,和原來的 flags 作與運算,則第 11 位肯定變成了 0,其它位和 1 作與運算,保持原樣,再和后面做或,則第 11 位又變成了 1,而且這次運算只會影響到第 11 位,其它位置不變,不管原來第 11 位是 0 還是 1,結果都會變成 1。

相似的,如果是 clearFlags,第一個參數變成 0,第二個參數是 FLAG_FULLSCREEN,這樣 (flags&mask) 必定為 0,只看前面,(attrs.flags&~mask) 這個運算第 11 位必為 0。

其實 (attrs.flags&~mask) | (flags&mask) 前面的與運算會將對應位置變成 0,然后看后面的與運算,后面算出結果對應位置是 1,那最終就是 1,后面算出是 0,那最終也是 0。而后面的控制就是 0 或者自己和自己作個與運算。

說了一大堆廢話,其實就是最基礎的位運算。那么想判斷是否全屏很簡單,只要看 flags 從右向左數第 11 位是 0 還是 1,只要與 FLAG_FULLSCREEN 做個邏輯與就行了,除了第 11 位,其它位都變成了 0。

判斷方法為:

if ( (getWindow().getAttributes().flags & WindowManager.LayoutParams.FLAG_FULLSCREEN)
          == WindowManager.LayoutParams.FLAG_FULLSCREEN) {
  // 是全屏
}

看完了這篇文章,相信你對“Android怎么判斷頁面是否全屏”有了一定的了解,如果想了解更多相關知識,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

海门市| 城固县| 绩溪县| 湘西| 兴海县| 苗栗县| 赤壁市| 虞城县| 寿宁县| 股票| 西林县| 无锡市| 青铜峡市| 奉新县| 澳门| 斗六市| 广德县| 石阡县| 盘山县| 余干县| 崇义县| 宾阳县| 郴州市| 新宁县| 富阳市| 阜阳市| 调兵山市| 霍林郭勒市| 晋城| 砀山县| 那曲县| 青神县| 大余县| 沙田区| 怀远县| 中西区| 蓬莱市| 靖州| 托克托县| 安顺市| 娱乐|