Android如何判斷頁面是否全屏
Android 想判斷 Activity 是否是全屏,網(wǎng)上找了些方法,看到有直接獲取 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,它控制的是從右向左數(shù)第 11 位。而 addFlags 時兩個參數(shù) 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,第一個參數(shù)變成 0,第二個參數(shù)是 FLAG_FULLSCREEN,這樣 (flags&mask) 必定為 0,只看前面,(attrs.flags&~mask) 這個運算第 11 位必為 0。
其實 (attrs.flags&~mask) | (flags&mask) 前面的與運算會將對應位置變成 0,然后看后面的與運算,后面算出結果對應位置是 1,那最終就是 1,后面算出是 0,那最終也是 0。而后面的控制就是 0 或者自己和自己作個與運算。
說了一大堆廢話,其實就是最基礎的位運算。那么想判斷是否全屏很簡單,只要看 flags 從右向左數(shù)第 11 位是 0 還是 1,只要與 FLAG_FULLSCREEN 做個邏輯與就行了,除了第 11 位,其它位都變成了 0。
判斷方法為:
if ( (getWindow().getAttributes().flags & WindowManager.LayoutParams.FLAG_FULLSCREEN)
== WindowManager.LayoutParams.FLAG_FULLSCREEN) {
// 是全屏
}
到這里就結束啦.
以上就是Android如何判斷頁面是否全屏的詳細內(nèi)容,更多關于Android 判斷頁面是否全屏的資料請關注腳本之家其它相關文章!
- Android如何讓WebView中的HTML5頁面實現(xiàn)視頻全屏播放
- Android Studio 全屏沉浸式透明狀態(tài)欄效果的實現(xiàn)
- android實現(xiàn)點擊圖片全屏展示效果
- Android使用WebView實現(xiàn)全屏切換播放網(wǎng)頁視頻功能
- Android Toast實現(xiàn)全屏顯示
- android 全屏去掉底部虛擬導航欄的方法
- Android實現(xiàn)全屏截圖或長截屏功能
- android 中ProgressDialog實現(xiàn)全屏效果的示例
- Android給任何view添加全屏傾斜水印
- Android開發(fā)實現(xiàn)瀏覽器全屏顯示功能
- Android開發(fā)之全屏與非全屏的切換設置方法小結
相關文章
Android?imageVIew實現(xiàn)鏡像旋轉的方法
在Android應用開發(fā)中,有時候我們需要對ImageView中的圖片進行鏡像旋轉,以展示不同的效果,本文將介紹如何使用代碼實現(xiàn)ImageView的鏡像旋轉效果,這篇文章主要介紹了Android?imageVIew如何做鏡像旋轉,需要的朋友可以參考下2024-06-06
Android自定義控件實現(xiàn)通用驗證碼輸入框(二)
這篇文章主要為大家詳細介紹了Android自定義控件實現(xiàn)通用驗證碼輸入框的第二篇,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-01-01
Android使用SwipeListView實現(xiàn)類似QQ的滑動刪除效果
這篇文章主要介紹了Android使用SwipeListView實現(xiàn)類似QQ的滑動刪除效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-08-08
Android應用中使用ViewPager實現(xiàn)類似QQ的界面切換效果
這篇文章主要介紹了Android應用中使用ViewPager實現(xiàn)類似QQ的界面切換效果的示例,文中的例子重寫了PagerAdapter,并且講解了如何解決Android下ViewPager和PagerAdapter中調(diào)用notifyDataSetChanged失效的問題,需要的朋友可以參考下2016-03-03
Android 實現(xiàn)圓圈擴散水波動畫效果兩種方法
這篇文章主要介紹了Android 實現(xiàn)圓圈擴散水波動畫效果兩種方法,需要的朋友可以參考下2018-05-05
Android用viewPager2實現(xiàn)UI界面翻頁滾動的效果
自學Android中,然后需要實現(xiàn)UI頁面翻頁滑動的效果,例如頭條的功能 我這邊利用了viewPager2的翻頁功能,具體流程如下:2021-05-05

