Android 凹口屏启动界面适配

作者: 石先 | 来源:发表于2018-08-07 16:45 被阅读79次

    今天 Google 正式发布了 Android 9 Pie,所以也着手把应用的 Target Version 升级到 API 28,现在凹口屏 (又称 "刘海屏") 的 Android 手机越来越多,Google 也是为了满足各手机厂商这个发展趋势提供了相应的 API。

    我们可以参考 Google 的这篇 Android P 凹口屏支持,打造全面屏体验
    提到的凹口屏幕适配方案。也可以请查阅官方文档《屏幕缺口支持指南》,了解适配过程中可能遇到的问题以及相应解决方案。

    △ 凹口屏设备: Essential PH-1 (右) 和华为 P20 (左)

    我们先来看看我的应用在没有适配凹口屏时的启动界面:
    应用界面上方存在一条大黑边:

    适配前启动界面

    下面就来说说我在实际适配凹口屏 Android 手机的过程:

    1. 开启显示凹口模式

    如果你没有凹口屏的真机,也可以在非凹口屏 P 版本手机或者 Android 模拟器中,开启 "模拟具有凹口的显示屏" 的设置项,然后再进行调试。

    2. 适配长屏幕的全面屏

    我们首先要确保应用在长屏幕设备上 (纵横比大于或等于 18:9) 也能够正常运行,尤其是现在市面上长屏手机越来越多,而且这些设备往往同时还采用了凹口屏设计。
    当我们的应用布局无法适应任意大的宽高比,可以通过设置最大宽高比来声明,Google 建议这个最大比率为 2.4(12:5)

    • 在 Android 8.0(API 26)及更高版本中,我们可以在 <activity> 标签中使用 android:MaxAspectRatio 来声明其支持的屏幕最大宽高比。比如我们可以声明最大宽高比为 2.4:
    <!-- Render on full screen up to screen aspect ratio of 2.4 -->
    <!-- Use a letterbox on screens larger than 2.4 -->
    <activity android:maxAspectRatio="2.4">
     ...
    </activity>
    
    • 对于Android 7.1及更低版本,我们可以在 <application> 元素中添加名为 android.max_aspect 的 <meta-data> 元素,如下所示:
    <!-- Render on full screen up to screen aspect ratio of 2.4 -->
    <!-- Use a letterbox on screens larger than 2.4 -->
    <meta-data android:name="android.max_aspect" android:value="2.4" />
    

    注意:如果设置了最大宽高比,请不要忘记也设置 android:resizeableActivity false。否则,最大宽高比无意义。

    这是因为从 Android 7.0 开始,应用的多窗口模式变为默认启动。在多窗口模式下,默认你的应用已经进行了全面屏适配,如果我们不想应用在多窗口模式下运行,可以修改以下属性:

    android:resizeableActivity="false"
    

    3. 适配凹形屏幕

    Google 为刘海屏显示方式提供了三种显示模式:

    // 默认情况,全屏页面不可用刘海区域,非全屏页面可以进行使用
    public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT = 0;
    // 允许页面延伸到刘海区域
    public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES = 1;
    // 不允许使用刘海区域
    public static final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER = 2;
    

    我们可以通过下面两种方式来指定应用在凹形屏幕的显示模式:

    • 在主题中加入android:windowLayoutInDisplayCutoutMode 属性指定显示模式:
    // value-v28/styles.xml
     <style name="AppTheme.Launcher" parent="AppTheme">
            <item name="android:windowBackground">@drawable/branded_launch_screens</item>
            <item name="android:statusBarColor">@color/colorPrimary</item>
            <item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
    </style>
    
    • 通过在代码中指定 Activity 的显示模式

    我们可以在 Activity 的 onCreate 中指定凹形屏幕的显示模式:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            if (Build.VERSION.SDK_INT >= 28) {
                WindowManager.LayoutParams lp = getWindow().getAttributes();
                lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES;
                getWindow().setAttributes(lp);
            }
    }
    

    最终效果:

    适配后的启动界面

    相关文章

      网友评论

        本文标题:Android 凹口屏启动界面适配

        本文链接:https://www.haomeiwen.com/subject/bmkavftx.html