前言
基于上篇文章Android 5.0之后的各版本与日常开发相关的内容整理,本篇文章对Android 7.0、8.0、9.0做个简述。
内容如下:
Android 7.0(N)
1.多窗口支持(分屏模式)
2.桌面长按图标出现快捷方式
Android 8.0(O)
1.画中画模式(PIP,其实就像是分屏模式的优化版)
2.自定义字体,可下载字体(AS 3.x以上可以找到,但没有中文字体可下载)。
3.自动缩放文本视图(Autosizing TextView)
Android 9.0(P)
1.刘海屏适配。
2.ImageDecoder 和 AnimagedImageDrawable。
Android 7.0
1、多窗口支持(分屏模式)
Android N允许用户一次在屏幕中使用两个App。
知识点
1、禁用分屏模式。
App默认允许分屏模式,如果要禁用分屏模式,可以在AndroidManifest.xml的application节点添加属性android:resizeableActivity="false",表示应用页面不接受分屏,这样有的手机就没有显示分屏按钮了,或者即使用户开启了分屏模式,切换到该应用时仍会强制回到全屏模式。
2、全屏->分屏->全屏的生命周期如何变化?
App页面从全屏模式切换到分屏模式,它的Activity生命周期会经历销毁后重建的过程,如果不希望重建,可以在该页面设置android:configChanges="orientation|screenLayout|screenSize"。(不设置screenSize也可能会成功)
举例A、B两个app。
1)appA,全屏->分屏:
onPause() -> onStop() -> onMultiWindowModeChanged() ->onStart() ->onResume() ->onPause()。
2)此时要选择appB分屏,当点击appA时,appA才会调用onResume。
3)appA,分屏->全屏,此时只会回调 onMultiWindowModeChanged()。
3、isInMultiWindowMode()可得知当前是否处于分屏模式;onMultiWindowModeChanged方法是每次切换进出分屏模式都会回调的。
4、视频播放页面,建议不在onPause方法中暂停播放视频,而应当在onStop方法中暂停播放,并在onStart方法中恢复播放视频。
总结
分屏主要影响的是视频播放页面,需要在视频播放页设置分配不重建,且把视频播放暂停逻辑移到onStop()和onStart()中。实际上分屏使用情况率不太多,也可以禁止它分屏。
参考
Android编程开发技巧之Android7.0的分屏模式
2、桌面长按图标出现快捷方式
桌面长按图标出现快捷方式条目,可以拖动到桌面,放置成一个单独固定的桌面快捷方式,具体效果可以看支付宝和微博。它分为静态配置和动态配置
静态配置
1)在res文件夹下创建xml目录,并在xml目录下创建配置文件 shortcuts.xml。
2.)在Manifest中添加meta-data配置。只在app启动的第一个页面添加配置才有效。
//关键代码
//1.shortcuts.xml
//shortcutLongLabel 就是长按显示的条目
//shortcutShortLabel 就是拖动到桌面显示的文字
//2.在AndroidManifest.xml 中 app启动的第一个Activity里添加配置
动态配置
由ShortcutManager发布, 可以根据用户的行为或者偏好添加, 动态更新。
参考
Android 7.0新特性——桌面长按图标出现快捷方式
Android 8.0
1、画中画(PIP模式)
Android 7.0推出了分屏模式,8.0推出了新的多窗口模式——“Picture in Picture”(简称PIP,“画中画”)和分屏模式一样,适合用于视频播放,用户体验上更佳。
知识点
1、开启PIP模式
和分屏模式不一样,Activity默认不支持PIP模式,如果要开启,需要在Activity设置
android:supportsPictureInPicture="true"。
2、和分屏模式一样,Activity不重建,可以设置android:configChanges="orientation|screenLayout|screenSize"。此时点击进入PIP模式,会调用onPause()和onPictureInPictureModeChanged()。
3、isInPictureInPictureMode()可得知当前是否处于PIP模式;onPictureInPictureModeChanged方法是每次切换进出PIP模式都会回调的。
4、PIP模式进入需在代码里设置,enterPictureInPictureMode()方法。
总结
PIP模式主要影响的是视频播放页面,需要在视频播放页设置分配不重建,且把视频播放暂停逻辑移到onStop()和onStart()中,它的用户体验比分屏模式好很多。
参考
Android 8.0 新特性及开发指南
2、自定义字体及可下载字体
在Android 8.0之前,要在视图上使用自定义字体必须进行以下操作。
1)将字体文件放到 assets 文件夹。
2)从 asset 文件将字体加载为 Typeface 对象
3)用 TextView.setTypeface() 设置视图的 Typeface。
Typeface tf =Typeface.createFromAsset(getAssets(), "fonts/sxslst.ttf");
tvOld.setTypeface(tf);
Android 8 推出了字体资源的新特性,提供了可下载字体,不直接与APK一同打包,而是在第一次使用的时候才去请求,下载和使用方式如下:
1)在Layout Editor中,选择一个TextView,然后在Attributes窗口中, 选择fontFamily > More Fonts,出现了字体Resources窗口。
2)选择要下载的字体,然后会在res\fonts 文件夹下创建这个字体的xml,在TextView中添加android:fontFamily="@font/akronim"即可使用了。
3)LayoutInflater和资源搜索是同步任务。默认情况下,首次尝试检索字体会触发对提供字体的应用程序的请求,从而增加了第一个布局绘制时间,为了避免延迟,可以在Manifest中预先声明需要检索的字体。如果要替换全局字体,可以在theme下设置 fontFamily。
AS的字体选择页面
总结
Google提供的可下载字体都是对中文不生效的,这功能对国内开发者来说没啥用处,要改变字体还是得用回以前的方式。
参考
Android 8.0 新特性(一) - 可下载字体
Android 自定义和可下载字体
3、Autosizing TextView
自动调整文本大小的TextView,当TextView的布局边界尺寸发生变化时,文本大小可以跟着自动缩放调整。文本的自动缩放支持两种模式,粒度型和预置大小型。
粒度型:没有设置autoSizePresetSizes,那么会按缩放步长进行每一次得缩放。
预置大小型:文字的大小按预置变大,比如可以12sp直接到50sp。
属性 | 作用 |
---|---|
autoSizeTextType | none(默认,表示不自动缩放)、uniform(横、纵缩放) |
autoSizeMinTextSize | 最小尺寸 |
autoSizeMaxTextSize | 最大尺寸 |
autoSizeStepGranularity | 变化粒度的步长,粒度型 |
autoSizePresetSizes | 指定预置大小序列,为array数组,预置大小型 |
参考
Android O —— Autosizing TextViews 自动调整文本大小的TextView
Android 9.0
1、刘海屏适配
Google将刘海屏命名为屏幕缺口,Android P 支持最新的全面屏以及为摄像头和扬声器预留空间的凹口屏幕,它提供的适配方案如下:
1)对于有状态栏的页面,不会受到刘海屏特性的影响,因为刘海屏包含在状态栏中了。
2)全屏显示的页面,系统刘海屏方案会对应用界面做下移处理,避开刘海区显示,这时会看到刘海区域变成一条黑边;
3)已经适配Android P应用的全屏页面可以通过谷歌提供的适配方案使用刘海区,真正做到全屏显示。
可见,其实如果能接受刘海那一块有黑边,不作操作也行,如果一些页面图片要置顶到状态栏,这时候就要做全屏适配了。
针对页面是全屏显示的情况
1、不适配的话将会留出一条黑色边。
2、要做到真正全屏的话,那么就先要获取到刘海的区域(危险区域),内容部分(操作按钮等)应当避开危险区域,保证在安全区域中展示。横屏的话两边都需要注意避开刘海(危险区域)。
各厂商刘海屏适配
上述的适配是Android 9.0才有的解决方案,在这之前,要用各个厂商的自己的刘海屏适配。
参考
Android 刘海屏适配全攻略
2、ImageDecoder 和 AnimagedImageDrawable
ImageDecoder,该类除了支持对各种图片格式的解码、缩放、裁剪之外,其强大之处在于支持对解码后的图像做后期处理(post-process),使用该功能可以添加复杂的自定义特效,比如圆角,或是将图片放在圆形像框中。编写后期处理回调函数,你可以添加任何绘图指令实现需要的效果。
AnimagedImageDrawable,支持GIF和WebP格式的动图,并被新增的解码器类ImageDecoder直接支持,用法跟矢量动画类AnimatedVectorDrawable类似,实现方式也类似,通过新增渲染线程和工作线程,不需要在UI线程处理动图更新。
参考
Android P图像媒体后期处理
android P ImageDecoder 使用
Github地址:DViewSummary