<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Android判斷頁面是否全屏

          共 3895字,需瀏覽 8分鐘

           ·

          2021-04-08 10:25

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


          其實全屏控制要么通過主題設(shè)置,要么代碼 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 里可以設(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;


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


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


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


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


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


          判斷方法為:

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


          到這里就結(jié)束啦.


          瀏覽 33
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  91人人草| 污污网站在线免费观看 | 亚洲香焦巨胸女人网视频网 | 伊人成人小说 | 亚洲精品久久久蜜桃 直播 |