三星折叠屏适配常见问题
1. 使用场景一:APP连续性
可折叠设备展开时,当前应用页面须无缝延续到另一个屏幕,并可自动调整大小匹配新的布局,反之亦然。也就是说,应用程序需要准备好在多个屏幕(不同分辨率、密度等)之间切换。
适配原则
双屏在切换过程中,APP不发生Crash/FC(Forced quit)/ANR, 尽量不重启,页面能够适应新的屏幕,不发生内容缺失或布局不对称,切换过程自然流畅不卡顿。
问题分类
1-1 Folding layout:折叠/展开操作的布局问题
1-2 Folding-内容/状态丢失:折叠/展开操作时出现的内容/状态丢失问题
1-3 Folding-Crash/FC/ANR:折叠/展开操作时出现的Crash/FC/ANR问题
1-1 Folding layout问题及修改建议
1) 问题描述:从折叠到打开屏幕,APP页面未布满屏幕,从展开到折叠屏幕,页面显示不全。
修改建议:正确处理运行时配置变更。
l 如果采用系统默认方式处理,即屏幕发生切换时,重启正在运行的Activity(先后调用onDestroy() 和onCreate())。建议在onCreate() 方法中重绘页面,例如可以在屏幕大于sw580时使用平板模式重绘 (仅为举例,需根据各自业务实际情况调整)。
l 如果采用不重启Activity自行处理的方式,可在Activity或者fragment的onConfigurationChanged()方法中,重新获取屏幕的宽高绘制视图。
*注意,使用这种不重启Activity的方式,您需要在应用清单manifest中增加android:configChanges属性,并至少包含以下配置值:
2) 问题描述:进行折叠/展开操作,自定义View的位置偏移。
修改建议:屏幕切换后,屏幕宽高发生了变化,如果是自定义的View,需要在自定义的代码中刷新布局,重写onMeasure() 或 onDraw() 方法。
1-2 Folding – 内容/状态丢失 问题及修改建议
问题描述:例如屏幕发生切换后,摄像头从前置变成了后置;或者输入的内容丢失等问题。
修改建议:
l 如果采用系统默认方式处理,销毁Activity之前,需调用onSaveInstanceState()来保存应用状态的数据,并在重新创建时恢复状态。
l 如果采用不重启Activity,自行处理的方式,可保持原有状态。
在应用清单manifest中增加 android:configChanges 属性及进行配置,在onConfigurationChanged()方法中处理配置变更。
1-3 Folding – Crash/FC/ANR
修改建议:如果采用系统默认方式处理,
l 重新加载资源时不要出现异常调用。
l 重新加载Activity时,不要在OnDestroy()中调用finish()或自行终止进程,否则将导致APP在设备折叠或展开时关闭。
o 参考资料
- https://developer.samsung.com/galaxy/foldable/techdocs#app-continuity
2. 使用场景二:Multi-Window
支持三个窗口的多任务处理功能,十分贴合展开后大屏的使用场景,可带来高效并发的体验。
适配原则
建议APP支持多窗口,并能正常布局,窗口Switch或Resize也能正确布局并且不发生Crash/FC(Forced quit)/ANR, 改变焦点,Switch或Resize操作都不会停止播放视频。
问题分类
2-1 不支持多窗口
2-2 Multi Window layout
2-3 Multi Window-内容/状态丢失
2-4 Multi Window-Crash/FC/ANR
2-5 Stop Playback
2-1 不支持多窗口
建议尽量支持多窗口,声明方法:
声明resizeableActivity属性,目的是通知系统该APP是否为Multi-window做了适配。
u 如果设置为true,允许进入多窗口模式。
u 如果设置为false,不允许进入多窗口模式,只允许全屏显示。
u 如果未设置,属性值默认为true。如果低于Android N,请参看下文说明。
2-2 Multi Window layout
问题描述:Multi Window状态下以及进行窗口Switch, resize操作时出现的布局问题。
修改建议:正确处理运行时配置变更
l 如果采用系统默认方式处理,即屏幕发生切换时,重启正在运行的Activity(先后调用onDestroy()和onCreate())。建议在onCreate()方法中重绘页面,例如可以在屏幕大于sw580时使用平板模式重绘(仅为举例,需根据各自业务实际情况调整)。
l 如果采用不重启Activity,自行处理的方式,可在Activity或者fragment的onConfigurationChanged()方法中,重新获取屏幕的宽高绘制视图。
l 如果是自定义的View,需要在自定义的代码中刷新布局,重写onMeasure() 或 onDraw() 方法。
2-3 Multi Window-内容/状态丢失
问题描述:Multi Window状态下以及进行窗口Switch, resize操作时出现的内容/状态丢失问题。
修改建议:
l 如果采用系统默认方式处理,销毁Activity之前,需调用onSaveInstanceState()来保存应用状态的数据,并在重新创建时恢复状态。
l 如果采用不重启Activity,自行处理的方式,可保持原有状态。
在应用清单manifest中增加 android:configChanges 属性及进行配置,在onConfigurationChanged()方法中处理配置变更。
2-4 Multi Window-Crash/FC/ANR
修改建议:如果采用系统默认方式处理,
l 重新加载资源时不要出现异常调用。
l 重新加载Activity时,不要在OnDestroy()中调用finish()或自行终止进程,否则将导致APP在设备折叠或展开时关闭。
2-5 Stop Playback
问题描述:在切换到Multi Window状态下焦点发生变化/Switch/Resize时视频停止播放。
修改建议:
l 播放视频的Activity不要在其onPause()中暂停视频,建议在onStop()中处理暂停,在onStart()中播放。
l 从Android P开始,应用可以增加支持Multi-resume属性,支持以后,在多窗口中的应用都会处于Resume状态,而非pause状态。
o 参考资料
- https://developer.android.com/training/multiscreen/screensizes
- https://developer.android.com/training/multiscreen/screendensities
- https://developer.android.com/guide/topics/ui/multi-window
- https://developer.android.com/guide/topics/resources/runtime-changes
- https://developer.samsung.com/galaxy/foldable/techdocs#multi-resume
3. 使用场景三:双屏独立使用
适配原则
建议APP支持最大纵横比,内外屏都能完整显示,内屏显示时,需要正确适配L-Cut(L型缺口的摄像头区域) 。
问题分类
3-1 Max aspect ratio
3-2 Min aspect ratio
3-3 DisplayCutout
3-1 Max aspect ratio
问题描述:APP在外屏上不能满屏显示,底部有黑条。
适配建议:APP支持最大纵横比,有三种方式,随着手机屏幕尺寸的不断变化,应用最好不进行最大纵横比设置,尽量采用由系统自动调节的方式,如果必须设置,请选择市场上最大纵横比进行设置。下面是支持最大纵横比的三种方式:
3-2 Min aspect ratio
问题描述:APP在内屏上不能满屏显示,左右有黑色边框。
适配建议: 这是因为如果APP targetSdkVersion<29时,Android默认支持的最小纵横比为4:3,即1.33,所以在纵横比小于1.33时将进入兼容模式,左右黑色边框填充。如果应用同时不支持多窗口,就需要设置最小纵横比。
APP支持最小纵横比,有三种方式:
3-2 DisplayCutout页面内容被L型缺口遮挡问题
修改建议:
l UI页面需按照DisplayCutout标准接口进行优化。
l 应避免页面布局对Status Bar使用了硬编码。
l 基于Window而非Screen获得坐标。
l Activity非全屏显示时,无内容区域背景建议设置为非透明。
o 参考资料
- https://developer.android.google.cn/guide/practices/screens-distribution#MaxAspectRatio
- https://developer.android.google.cn/reference/android/R.attr#minAspectRatio
- https://developer.android.google.cn/reference/android/view/DisplayCutout
- https://developer.samsung.com/galaxy/foldable/techdocs#other
- http://support-cn.samsung.com/App/DeveloperChina/Notice/Detail?NoticeId=86
收集反馈
如果您:
适配过程中遇到了技术问题,
对可折叠设备有自己的畅想、建议、意见…
欢迎发邮件到:rdtpservice@samsung.com
邮件主题:三星Foldables+APP名
感谢您的关注和参与!
您还可登录三星中国开发者网站:三星中国开发者网站 | 中国三星电子
或关注“三星开发者”公众号查看相关开发者指引。