日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

Android全面屏適配方法詳解_Android

作者:時寒很苦惱 ? 更新時間: 2022-12-24 編程語言

測試機:

  • 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

欄目分類
最近更新