Android 全面屏处理(适配挖孔屏、刘海屏) kotlin

这篇具有很好参考价值的文章主要介绍了Android 全面屏处理(适配挖孔屏、刘海屏) kotlin。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

测试机:

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的挖孔屏区域无效,效果如图(按钮绘制在状态栏的位置上):
Android 全面屏处理(适配挖孔屏、刘海屏) kotlin

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):文章来源地址https://www.toymoban.com/news/detail-420076.html

<!-- 导航栏透明 -->
<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>

到了这里,关于Android 全面屏处理(适配挖孔屏、刘海屏) kotlin的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • uniapp 适配全面屏

    1、manifest.json 文件修改 app-plus 下 添加 2、部分页面设置全屏(登录页面)

    2024年02月11日
    浏览(24)
  • Android存储权限完美适配(Android11及以上适配)

    一、Bug简述 一个很普通的需求,需要下载图片到本地,我的三个测试机(荣耀Android10,红米 11 和小米Android 13都没有问题)。 然后,主角登场了,测试的三星Android 13 死活拉不起存储权限弹窗。 想了下,三星的系统可能和小米的系统做了些区别。于是就是看了下存储权限的版

    2024年02月06日
    浏览(46)
  • 【H5移动端】常用的移动端方案合集-键盘呼起、全面屏适配、图片大小显示、300ms点击延迟、首屏优化(不定期补充~)

    这篇文章总结了我在工作中做H5遇到的一些问题,包括我是怎么解决的。可能不是当下的最优解,但是能保证解决问题。 单位适配问题可看:【H5移动端】前端H5移动端的单位适配方案集,包括给你用例子讲明白什么是1像素的问题(不定期补充~) 本文章未来也会不定期的补充

    2024年02月14日
    浏览(41)
  • android 布局 横屏 android横屏适配

    一、刘海屏适配 1、layoutInDisplayCutoutMode属性 Android 9.0系统中提供了3种layoutInDisplayCutoutMode属性来允许应用自主决定该如何对刘海屏设备进行适配。 LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT 这是一种默认的属性,在不进行明确指定的情况下,系统会自动使用这种属性。这种属性允许应用程

    2024年02月09日
    浏览(35)
  • android8、android13自适应图标适配

    前言:为了解决应用图标在不同android手机上的外观样式问题,google官方在android8和android13两个版本做了变更(这2个版本都提供了向下兼容),下文介绍适配方法以及 注意事项(此处有彩蛋) 。 一、android8(API27)适配 1、找到资源文件夹:mipmap-anydpi-v26(若旧的as里没有默认生成,

    2024年02月09日
    浏览(63)
  • Android适配平板屏幕尺寸

    一、划分手机和平板 人为判断方法:     大于6英寸的就是平板。小于6英寸的都是手机     平板尺寸: 6英寸、7英寸、10英寸、14英寸… Android系统支持多配置资源文件,我们可以追加新的资源目录到你的Android项目中。命名规范: 资源名字-限制符 layout/drawble文件夹     说

    2024年04月14日
    浏览(49)
  • Android Studio 屏幕适配

    Android开发屏幕适配流程 首先studio中没有ScreenMatch这个插件的,下去现在这个插件 点击File-settings-Plugins-(搜索ScreenMatch插件),点击下载,应用重启Studio即可,如下图 在values下 创建dimens.xml,粘贴如下代码 复制粘贴后,右击项目App,点击ScreenMatch 如下图 就会在res下总动生成适配

    2024年02月14日
    浏览(31)
  • Android中的屏幕适配

    在Android开发中,屏幕适配是指将应用程序的界面和布局适配到不同尺寸、像素密度以及屏幕方向的设备上,以确保应用程序在各种设备上都能正确显示并提供良好的用户体验。 Android设备的屏幕尺寸、像素密度和屏幕方向各不相同,因此在开发Android应用时,需要考虑以下几个

    2024年02月14日
    浏览(32)
  • Android 14适配

    Google I/O 2023 发布的 Android beta2 ,Android 14 将在2023年第三季度发布。Google Play 已经开始强制要求targetSdkVersion 33适配,所以 targetSdkVersion 34适配也是非常有必要的。 前台服务类型(foregroundServiceType)是在 Android 10 引入的,通过 android:foregroundServiceType 可以指定 service 的服务类型,

    2024年02月16日
    浏览(36)
  • Android 14 适配指南

    Google2月按时发布了第一个开发者预览版本,正式版会在8-9月份发布。 按照惯例,Android更新了可以刷机的手机型号,Pixel 4仅支持4a(5G)版本: Pixel 4a (5G) Pixel 5 and 5a Pixel 6 and 6 Pro Pixel 6a Pixel 7 and 7 Pro 开发者可以参考Android官网(https://developer.android.com/about/versions/14/get)进行刷机

    2024年02月06日
    浏览(58)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包