Android全面屏適配方法詳解
測試機(jī):
- Android 11 的 Xiaomi MI MAX 3
- Android 12 的 Xiaomi K40 Pro
測試方法
1. 該方法在api30后提示已經(jīng)過時(shí) 在onCreat()方法中,setContentView()前使用。
window.setFlags( WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN )
測試結(jié)果:Android11和Android12均有效,但Android12的挖孔屏區(qū)域無效
2. 沉浸模式-查詢到:Android系統(tǒng)到了4.4以后才提供沉浸式體驗(yàn)的支持。當(dāng)設(shè)置透明效果后,4.4以下無效果,4.4~5.0全透明,5.0以上半透明;Android沉浸式模式的本質(zhì)就是全屏化。
//該方法是從官網(wǎng)復(fù)制過來的,效果不如意 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()) }
測試結(jié)果:Android11無效,Android12有效,Android12的挖孔屏區(qū)域無效。Android11獲取windowInsetsController為null
//這是從別人那里拷過來的(csdn):https://blog.csdn.net/qq_32664007/article/details/126279919 private fun hideSystemBars(window: Window) { //隱藏狀態(tài)欄和導(dǎo)航欄 以及交互 WindowInsetsControllerCompat(window, window.decorView).let { //隱藏狀態(tài)欄和導(dǎo)航欄 it.hide(WindowInsetsCompat.Type.systemBars()) //交互效果 it.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE } }
測試結(jié)果:Android11無效,Android12有效,Android12的挖孔屏區(qū)域無效。
3.該方法在ide里提示已過時(shí),在官網(wǎng)上未提示
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)
測試結(jié)果:Android11和Android12均有效,但Android12的挖孔屏區(qū)域無效
4.該方法對測試機(jī)均有部分效過
WindowCompat.setDecorFitsSystemWindows(window, false)
測試結(jié)果:Android11和Android12的activity繪制區(qū)域均將狀態(tài)欄的區(qū)域繪制成功,但狀態(tài)欄依然透明顯示,Android12的挖孔屏區(qū)域無效,效果如圖(按鈕繪制在狀態(tài)欄的位置上):
5.使用主題
<item name="android:windowFullscreen">true</item>
測試結(jié)果:Android11有效,Android12有效,Android12的挖孔屏區(qū)域無效。
6.挖孔屏處理方式
//允許window 的內(nèi)容可以上移到劉海屏狀態(tài)欄 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 }
測試結(jié)果:Android12 挖孔屏有效
封裝成工具類
/** * 沉浸模式(全屏模式) * 設(shè)置全屏的方法 * 參數(shù)window在activity或AppCompatActivity都帶有 */ fun immersionFull(window: Window) { hideSystemBars(window) useSpecialScreen(window) }
/** * 隱藏狀態(tài)欄,顯示內(nèi)容上移到狀態(tài)欄 */ private fun hideSystemBars(window: Window) { //占滿全屏,activity繪制將狀態(tài)欄也加入繪制范圍。 //如此即使使用BEHAVIOR_SHOW_BARS_BY_SWIPE或BEHAVIOR_SHOW_BARS_BY_TOUCH //也不會(huì)因?yàn)闋顟B(tài)欄的顯示而導(dǎo)致activity的繪制區(qū)域出現(xiàn)變形 //使用劉海屏也需要這一句進(jìn)行全屏處理 WindowCompat.setDecorFitsSystemWindows(window, false) //隱藏狀態(tài)欄和導(dǎo)航欄 以及交互 WindowInsetsControllerCompat(window, window.decorView).let { //隱藏狀態(tài)欄和導(dǎo)航欄 //用于WindowInsetsCompat.Type.systemBars()隱藏兩個(gè)系統(tǒng)欄 //用于WindowInsetsCompat.Type.statusBars()僅隱藏狀態(tài)欄 //用于WindowInsetsCompat.Type.navigationBars()僅隱藏導(dǎo)航欄 it.hide(WindowInsetsCompat.Type.systemBars()) //交互效果 //BEHAVIOR_SHOW_BARS_BY_SWIPE 下拉狀態(tài)欄操作可能會(huì)導(dǎo)致activity畫面變形 //BEHAVIOR_SHOW_BARS_BY_TOUCH 未測試到與BEHAVIOR_SHOW_BARS_BY_SWIPE的明顯差異 //BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE 下拉或上拉的屏幕交互操作會(huì)顯示狀態(tài)欄和導(dǎo)航欄 it.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE } }
/** * 擴(kuò)展使用劉海屏 */ private fun useSpecialScreen(window: Window) { //允許window 的內(nèi)容可以上移到劉海屏狀態(tài)欄 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):
<!-- 導(dǎo)航欄透明 --> <item name="android:navigationBarColor"> @android:color/transparent </item> <!-- 狀態(tài)欄透明 --> <item name="android:statusBarColor"> @android:color/transparent </item> <!-- 不要標(biāo)題欄 --> <item name="windowActionBar">false</item> <item name="windowNoTitle">true</item>
到此這篇關(guān)于Android全面屏適配方法詳解的文章就介紹到這了,更多相關(guān)Android全面屏適配內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android仿微博個(gè)人詳情頁滾動(dòng)到頂部的實(shí)例代碼
這篇文章主要介紹了Android仿微博個(gè)人詳情頁滾動(dòng)到頂部的實(shí)例代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒家,需要的朋友可以參考下2019-05-05Android 使用自定義RecyclerView控件實(shí)現(xiàn)Gallery效果
這篇文章主要介紹了Android 使用自定義RecyclerView 實(shí)現(xiàn)Gallery效果,本文給大家簡單介紹了RecyclerView的基本用法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2017-10-10android異步任務(wù)設(shè)計(jì)思詳解(AsyncTask)
AsyncTask在Android十分常用,那為什么如此常用呢,不用行不行呢,內(nèi)部又是怎么實(shí)現(xiàn)的呢,為什么Java的API中沒有這個(gè)類呢,看完本文后,你將會(huì)知道答案2014-02-02Android Studio 恢復(fù)小窗口停靠模式(Docked Mode)
這篇文章主要介紹了Android Studio 恢復(fù)小窗口??磕J?Docked Mode),具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04Android webview注入JS代碼 修改網(wǎng)頁內(nèi)容操作
這篇文章主要介紹了Android webview注入JS代碼 修改網(wǎng)頁內(nèi)容操作,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-03-03Android開發(fā)中Listview動(dòng)態(tài)加載數(shù)據(jù)的方法示例
這篇文章主要介紹了Android開發(fā)中Listview動(dòng)態(tài)加載數(shù)據(jù)的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android操作ListView界面布局與數(shù)據(jù)動(dòng)態(tài)更新相關(guān)操作技巧,需要的朋友可以參考下2017-10-10Android中監(jiān)聽系統(tǒng)網(wǎng)絡(luò)連接打開或者關(guān)閉的實(shí)現(xiàn)代碼
本篇文章對Android中監(jiān)聽系統(tǒng)網(wǎng)絡(luò)連接打開或者關(guān)閉的實(shí)現(xiàn)用實(shí)例進(jìn)行了介紹。需要的朋友參考下2013-05-05