網站首頁 編程語言 正文
測試機:
- Android 11 的 Xiaomi MI MAX 3
- Android 12 的 Xiaomi K40 Pro
測試方法
1. 該方法在api30后提示已經過時 在onCreat()方法中,setContentView()前使用。
window.setFlags(
WindowManager.LayoutParams.FLAG_FULLSCREEN,
WindowManager.LayoutParams.FLAG_FULLSCREEN
)
測試結果:Android11和Android12均有效,但Android12的挖孔屏區域無效
2. 沉浸模式-查詢到:Android系統到了4.4以后才提供沉浸式體驗的支持。當設置透明效果后,4.4以下無效果,4.4~5.0全透明,5.0以上半透明;Android沉浸式模式的本質就是全屏化。
//該方法是從官網復制過來的,效果不如意
private fun hideSystemBars() {
val windowInsetsController =
ViewCompat.getWindowInsetsController(window.decorView) ?: return
// Configure the behavior of the hidden system bars
windowInsetsController.systemBarsBehavior =
WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
// Hide both the status bar and the navigation bar
windowInsetsController.hide(WindowInsetsCompat.Type.systemBars())
}
測試結果:Android11無效,Android12有效,Android12的挖孔屏區域無效。Android11獲取windowInsetsController為null
//這是從別人那里拷過來的(csdn):https://blog.csdn.net/qq_32664007/article/details/126279919
private fun hideSystemBars(window: Window) {
//隱藏狀態欄和導航欄 以及交互
WindowInsetsControllerCompat(window, window.decorView).let {
//隱藏狀態欄和導航欄
it.hide(WindowInsetsCompat.Type.systemBars())
//交互效果
it.systemBarsBehavior =
WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
}
}
測試結果:Android11無效,Android12有效,Android12的挖孔屏區域無效。
3.該方法在ide里提示已過時,在官網上未提示
val decorView = window.decorView
decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE
or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
or View.SYSTEM_UI_FLAG_FULLSCREEN
or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY)
測試結果:Android11和Android12均有效,但Android12的挖孔屏區域無效
4.該方法對測試機均有部分效過
WindowCompat.setDecorFitsSystemWindows(window, false)
測試結果:Android11和Android12的activity繪制區域均將狀態欄的區域繪制成功,但狀態欄依然透明顯示,Android12的挖孔屏區域無效,效果如圖(按鈕繪制在狀態欄的位置上):
5.使用主題
<item name="android:windowFullscreen">true</item>
測試結果:Android11有效,Android12有效,Android12的挖孔屏區域無效。
6.挖孔屏處理方式
//允許window 的內容可以上移到劉海屏狀態欄
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
val lp = window.attributes
lp.layoutInDisplayCutoutMode =
WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
window.attributes = lp
}
測試結果:Android12 挖孔屏有效
封裝成工具類
/**
* 沉浸模式(全屏模式)
* 設置全屏的方法
* 參數window在activity或AppCompatActivity都帶有
*/
fun immersionFull(window: Window) {
hideSystemBars(window)
useSpecialScreen(window)
}
/**
* 隱藏狀態欄,顯示內容上移到狀態欄
*/
private fun hideSystemBars(window: Window) {
//占滿全屏,activity繪制將狀態欄也加入繪制范圍。
//如此即使使用BEHAVIOR_SHOW_BARS_BY_SWIPE或BEHAVIOR_SHOW_BARS_BY_TOUCH
//也不會因為狀態欄的顯示而導致activity的繪制區域出現變形
//使用劉海屏也需要這一句進行全屏處理
WindowCompat.setDecorFitsSystemWindows(window, false)
//隱藏狀態欄和導航欄 以及交互
WindowInsetsControllerCompat(window, window.decorView).let {
//隱藏狀態欄和導航欄
//用于WindowInsetsCompat.Type.systemBars()隱藏兩個系統欄
//用于WindowInsetsCompat.Type.statusBars()僅隱藏狀態欄
//用于WindowInsetsCompat.Type.navigationBars()僅隱藏導航欄
it.hide(WindowInsetsCompat.Type.systemBars())
//交互效果
//BEHAVIOR_SHOW_BARS_BY_SWIPE 下拉狀態欄操作可能會導致activity畫面變形
//BEHAVIOR_SHOW_BARS_BY_TOUCH 未測試到與BEHAVIOR_SHOW_BARS_BY_SWIPE的明顯差異
//BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE 下拉或上拉的屏幕交互操作會顯示狀態欄和導航欄
it.systemBarsBehavior =
WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE
}
}
/**
* 擴展使用劉海屏
*/
private fun useSpecialScreen(window: Window) {
//允許window 的內容可以上移到劉海屏狀態欄
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
val lp = window.attributes
lp.layoutInDisplayCutoutMode =
WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
window.attributes = lp
}
}
然后資源目錄的主題文件里添加(res->values->themes.xml):
<!-- 導航欄透明 --> <item name="android:navigationBarColor"> @android:color/transparent </item> <!-- 狀態欄透明 --> <item name="android:statusBarColor"> @android:color/transparent </item> <!-- 不要標題欄 --> <item name="windowActionBar">false</item> <item name="windowNoTitle">true</item>
原文鏈接:https://blog.csdn.net/weixin_45066871/article/details/127967966
相關推薦
- 2022-10-11 pandas?df.sample()的使用_python
- 2022-02-03 ionic集成極光推送之點擊推送跳轉到指定頁面
- 2022-05-21 Kubernetes特別屬性的標簽Label的強大作用_服務器其它
- 2022-10-01 Pycharm安裝scrapy及初始化爬蟲項目的完整步驟_python
- 2022-10-05 Ubuntu?Server?20.04?LTS?環境下搭建vim?編輯器Python?IDE的詳細步
- 2022-10-11 golang游戲等資源壓縮包創建和操作方法_Golang
- 2022-09-18 GO實現文件上傳操作_Golang
- 2022-12-15 裝Oracle用PLSQL連接登錄時不顯示數據庫的解決_oracle
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支