• android 布局 横屏 android横屏适配


    一、刘海屏适配
    1、layoutInDisplayCutoutMode属性
    Android 9.0系统中提供了3种layoutInDisplayCutoutMode属性来允许应用自主决定该如何对刘海屏设备进行适配。

    LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT
    这是一种默认的属性,在不进行明确指定的情况下,系统会自动使用这种属性。这种属性允许应用程序的内容在竖屏模式下自动延伸到刘海区域,而在横屏模式下则不会延伸到刘海区域。
    LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
    这种属性表示,不管手机处于横屏还是竖屏模式,都会允许应用程序的内容延伸到刘海区域。
    LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER 这种属性表示,永远不允许应用程序的内容延伸到刘海区域。
    2、配置layoutInDisplayCutoutMode的方式

    1. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    2.     window.attributes.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES
    3. }



    layoutInDisplayCutoutMode使用默认值,即我们不去设置。即使我们不做任何的适配工作,绝大多数的程序在默认情况下也是可以自动适配刘海屏手机的,并不会产生应用程序无法使用等问题的发生。

    但是,假如你开发的是一款视频类应用或者游戏的话(横屏显示),充分利用屏幕的空间明显可以带来更好的用户体验,界面上留着一条大黑边对用户总归是不够友好的。这个时候我们就可以通过指定layoutInDisplayCutoutMode属性的值,来让应用程序具备更好的屏幕适配性。
     
     

    红色箭头处有条大黑边。如果我们将layoutInDisplayCutoutMode设置为LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES,大黑边就会消失。并且设置沉浸式布局

    1. override fun onWindowFocusChanged(hasFocus: Boolean) {
    2.     super.onWindowFocusChanged(hasFocus)
    3.     if (hasFocus && Build.VERSION.SDK_INT >= 19) {
    4.         val decorView = window.decorView
    5.         decorView.systemUiVisibility = (View.SYSTEM_UI_FLAG_LAYOUT_STABLE
    6.                 or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
    7.                 or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
    8.                 or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
    9.                 or View.SYSTEM_UI_FLAG_FULLSCREEN
    10.                 or View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY)
    11.     }
    12. }


     3、需要适配的地方
    但是界面上交互的一些按键可能被刘海挡住,这样用户就不能点击了。

    我们左边的按键被刘海挡住一部分。这种情况就需要我们进行适配了。DisplayCutout类主要用于获取凹口位置和安全区域的位置等。主要方法如下所示:

    getBoundingRects():返回Rects的列表,每个Rects都是显示屏上非功能区域的边界矩形。

    getSafeInsetLeft ():返回安全区域距离屏幕左边的距离,单位是px。

    getSafeInsetRight ():返回安全区域距离屏幕右边的距离,单位是px。

    getSafeInsetTop ():返回安全区域距离屏幕顶部的距离,单位是px。

    getSafeInsetBottom():返回安全区域距离屏幕底部的距离,单位是px。

     

    适配代码如下:

    1. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    2.     root_layout.setOnApplyWindowInsetsListener { view, windowInsets ->
    3.         val displayCutout = windowInsets.displayCutout
    4.         if (displayCutout != null) {
    5.             val left = displayCutout.safeInsetLeft
    6.             val top = displayCutout.safeInsetTop
    7.             val right = displayCutout.safeInsetRight
    8.             val bottom = displayCutout.safeInsetBottom
    9.             val leftParams: FrameLayout.LayoutParams = btn_left.layoutParams as FrameLayout.LayoutParams
    10.             leftParams.setMargins(left, top, right, bottom)
    11.         }
    12.         windowInsets.consumeSystemWindowInsets()
    13.     }
    14. }


     
    root_layout是界面的根布局,上面代码就是获取安全区域,将按钮设置在安全区域以外。
     

    现在按钮就没有被刘海挡住了。

    二、non-SDK接口限制
    一般来说,SDK 接口是指在 Android 框架软件包索引中记录的接口。 对非 SDK 接口的处理是 API 抽象化的实现细节;其会随时更改。
    Android P 引入了针对非 SDK 接口的新使用限制,无论是直接使用还是通过反射或 JNI 间接使用。 无论应用是引用非 SDK 接口还是尝试使用反射或 JNI 获取其句柄,均适用这些限制。
    名单分类:

    Light grey list: targetSDK>=P时,警告;
    Dark grey list:targetSDK=p时,不允许调用;
    Black list:三方应用不允许调用;
    三、Battery Improvements
    谷歌在P版本之前没有一个完整的功耗解决方案,OEM厂商分别开发各自的功耗方案,管控手段都包括了清理应用,功耗得到优化,但是同时也影响了三方应用的一些功能正常使用,谷歌为了解决这个问题在P版本提出了自己的功耗解决方案。
    主要方案:
    AAB(Auto Awesome Battery):
    1、通过ML算法将应用进行分类,不同类型的应用功耗管控策略不一样
    2、Firebase Cloud Messaging (FCM):管控三方消息接收的频率
    3、谷歌提供了统一的应用的管控方法:Forced App Standby (FAS),谷歌不会通过清理应用来优化功耗
    Extreme Battery Saver(EBS)谷歌超级省电模式;
    Smart screen brightness:屏幕亮度调节优化算法。
    影响
    谷歌功耗方案对三方应用各种管控,存在导致应用后台功能无法正常使用的可能,特别是:IM、邮箱、闹钟、音乐(直播)、地图导航、运动健康、下载、日历等应用影响比较大。目前通过谷歌提供的调试命令验证:所有的应用都有可能会被分到管控的类型,对三方的后台功能是有影响的。
     

  • 相关阅读:
    什么是Peppol ID?如何创建?
    基于 Docker 的 Redis Cluster 集群部署
    Hadoop的概述
    python学习10--工程结构(包、模块)&命名空间&导入模块与变量&_init_.py&_all_&_name_
    详解csrf(跨站请求伪造)
    基础 | 并发编程 - [Lock 使用 & 对比 synchronized]
    【Image captioning】论文精读三–Show, Attend and Tell: Neural Image Caption Generation with Visual Attention
    计算机网络——计算机网络体系结构(3/4)-计算机网络体系结构分层思想举例
    Stable Diffusion 绘画入门教程(webui)-ControlNet(Recolor)
    黑马JVM总结(十一)
  • 原文地址:https://blog.csdn.net/chenhuakang/article/details/132687716