• 全面屏适配以及启动页适配(采用制作.9图的方式)


    版权声明:本文为HaiyuKing原创文章,转载请注明出处!

    前言

    关于全面屏

      全面屏是手机业界对于超高屏占比手机设计的一个宽泛的定义。从字面上解释就是,手机的正面全部都是屏幕,四个边框位置都是采用无边框设计,追求接近100%的屏占比。但受限于目前的技术,还不能做到手机正面屏占比100%的手机。现在业内所说的全面屏手机是指真实屏占比可以达到80%以上,拥有超窄边框设计的手机。

      全面屏手机屏幕的宽高比例比较特殊,不再是以前的16:9了。比如三星的Galaxy S8屏幕分辨率是:2960×1440,对应的屏幕比例为:18.5:9。VIVO X20手机屏幕分辨率是2160x1080,对应的屏幕比例:18:9。对于这种奇葩的屏幕比例,APP开发者该如何去优化自己的应用,才能在这些手机上显示的更加完美呢?下面,从以下方面来探究APP完美适配全面屏手机的方法。

    一、声明最大屏幕高宽比(解决黑边问题)

    二、启动页适配

    三、虚拟导航键(Navigation Bar)优化

    这里简单介绍下声明最大屏幕高宽比、启动页适配。

    一、声明最大屏幕高宽比(解决黑边问题)

      由于全面屏手机的高宽比比之前大,如果不适配的话,Android默认为最大的宽高比是1.86,小于全面屏手机的宽高比,因此,在全面屏手机上打开部分App时,上下就会留有空间,显示为黑条。这样非常影响视觉体验,另外全面屏提供的额外空间也没有得以利用,因此,这样的应用需要做相关适配。

    注意:targetSdkVersion==24(Android7.0)及以上默认支持了分屏模式,即Manifest文件中配置Activity的android:resizeableActivity默认属性为true,在这种情况下并不需要配置android.max_aspect比例值即可自动适配全面屏。如果由于某些原因(UI适配等)禁止了分屏模式,这个时候就要注意了!需要用到上面的代码,否则将出现上下黑条的显示效果,奇丑无比!

    所以,对于下面的情况需要考虑适配!

    • targetSdkVersion < 24
    • targetSdkVersion >= 24,但是禁用了分屏模式

      目前有两种解决方案:

    方案1、提高App所支持的最大屏幕纵横比(设置android.max_aspect比例值)

      在应用配置文件AndroidManifest.xml中显式声明支持的最大屏幕高宽比(maximum aspect ratio)。其中 ratio_float 为高宽比:
      传统屏幕:ratio_float = 16/9 = 1.778 ;
      三星S8屏幕:ratio_float = 18.5/9 = 2.056。
      红米6pro屏幕:ratio_float = 19/9 = 2.111。
      鉴于目前全面屏屏幕比例,将ratio_float设置为2.2即可适配一众全面屏手机。
    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.cn.cctvnews">
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:theme="@style/TranslucentTheme">
           
            <!--适配19:9全面屏黑边问题:https://blog.csdn.net/darkeet/article/details/80049913-->
            <!--https://blog.csdn.net/weelyy/article/details/79284332-->
            <meta-data
                android:name="android.max_aspect"
                android:value="2.2"/>
    
            <!-- 首页界面 -->
            <activity
                android:name=".activity.MainActivity"
                android:screenOrientation="portrait">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    </manifest>

    方案2、支持分屏模式(设置resizeableActivity属性值

    在targetSdkVersion==24(Android 7.0)以上Google默认支持了分屏模式,即Manifest文件中配置Activity的android:resizeableActivity默认属性为true。

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
              package="com.why.project.androidstartingwindowdemo">
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme"
            android:resizeableActivity="true">
            <!--首页-->
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN"/>
    
                    <category android:name="android.intent.category.LAUNCHER"/>
                </intent-filter>
            </activity>
        </application>
    
    </manifest>

    二、启动页适配

    在做启动优化,解决冷启动白屏的时候,我们往往会为要启动的Activity设置主题为一张背景图。参考《Android APP应用启动页白屏(StartingWindow)优化

    那么问题就来了,以往16:9的的背景图在18:9的屏幕中会有什么表现呢?答案是会被拉伸变形。

    解决方案有以下几种方案:

    方案1、针对全面屏制作独立的图片资源

    考虑到目前大部分全面屏手机只是在高度上拉长,且大多为6.0英寸左右,像素密度对比xxhdpi并没有多大区别,那我们可以在项目中增加一组资源drawable-xxhdpi-2160x1080 、drawable-long 这样解决图片的拉伸问题。

    方案2、采用相对布局

    在欢迎界面的布局文件中采用相对布局的方式,可以理解为将之前完整的一个背景图拆分成几个小图,然后组合在一起。这样一定程度上避免拉伸。

    方案3、制作.9图

    保留背景图完整,在此基础上通过Android Studio制作.9图。

    这里简单介绍下实现步骤,首先,以《Android APP应用启动页白屏(StartingWindow)优化》为例,在适配前看下运行在全面屏上的效果:

    步骤1、将背景图的png文件复制到项目中,比如demo中的startingwindow_bg.png文件

    注意:扩展名一定要.png,并且图片不能做压缩处理。否则有可能创建不成功。

    步骤2、鼠标选中这个文件——右键——Create 9-Patch file...

    步骤3、保存新建的.9图,如果不更改目录的话,直接点击OK

    步骤4、打开.9图,设置4条边的属性

    .9.png图片的用处可以概括为以下两点:

    • .9.png图片在图片拉伸的时候特定的区域不会发生图片失真;
    • .9.png图片作为背景图的时候可以指定内容显示区域;

     .9.png图片和普通图片相比较,周围会有一条黑色的线条,这些黑色线条有什么作用呢?就是用于指定我们背景的拉伸区域或者前景内容的显示区域。

    • 左边黑线:纵向拉伸区域,必须要画的,控制纵向拉伸,如上图右侧第一个小图。
    • 上边黑线:横向拉伸区域,必须要画的,控制横向拉伸,如上图右侧第二个小图。
    • 右边黑线:可选,纵向内容显示区域
    • 下边黑线:可选,横向内容显示区域

    ----摘自《Android设计中的.9.png图片

    那么,对于startingwindow_bg.png这张图片来讲,我们只需要设置左边和上边的拉伸区域即可。比如,我们想要做成下面的效果(左侧的图应该是合适的,有时候右边图也是可以的,根据实际情况处理):

                                

    首先,由于图片很大,所以需要放大比例才可以准确定位到边界,随便画出一条黑线出来

    然后,缩小到原图,选中show patches,鼠标定位到区域的边界进行拖动调整

    以此类推,分别画出左边和上边的黑线。

    步骤5、删除startingwindow_bg.png文件,只保留startingwindow_bg.9.png文件

    运行效果如下:

    参考资料

    Android手机 全面屏(18:9屏幕)适配指南

    适配18:9全面屏黑边问题

    Android APP适配全面屏手机的技术要点

    Android Studio制作.9.png图片

    Android设计中的.9.png图片

  • 相关阅读:
    ThinkPHP 3.2.2 实现持久登录 ( 记住我 )
    Java实现 LeetCode 20 有效的括号
    Java实现 LeetCode 20 有效的括号
    Java实现 LeetCode 19删除链表的倒数第N个节点
    Java实现 LeetCode 19删除链表的倒数第N个节点
    Java实现 LeetCode 19删除链表的倒数第N个节点
    Java实现 LeetCode 18 四数之和
    Java实现 LeetCode 18 四数之和
    Java实现 LeetCode 18 四数之和
    Java实现 LeetCode 17 电话号码的字母组合
  • 原文地址:https://www.cnblogs.com/whycxb/p/9737613.html
Copyright © 2020-2023  润新知