Android 11----折叠屏初识
时间:2023-06-01 13:37:00
Android 11-折叠屏初步知识
声明
博客地址:http://blog.csdn.net/luzhenrong45
折叠屏简介
更宏观的折叠屏概念也被称为柔性屏,可以实现360度的弯曲,甚至扭曲。
可折叠设备通常在显示屏上有一个折叠,或者有一个宽度的铰链将两个显示屏分开。带铰链的设备可以跨越铰链后面的内容,如微软Surface跨接模式。有些设备可以半折叠或放置在其他位置,如三星Galaxy Z Flip支持折叠和部分折叠状态的翻盖设备(三星称为)Flex模式)。
在Anroid 11之前,Google对折叠屏提供了Screen Continuity原生系统支持(屏幕连续性),并称此技术为:Foldables。利用这种柔性显示技术,App 可适应折叠屏设备。Anroid 11版增强了对折叠屏的支持,为开发者适应折叠屏应用提供了更多接口。
折叠屏API接口
关于折叠屏,在Android Q 版本已经开始正式支持,本文仅针对Android 简要介绍了11版折叠屏的一些扩展支持。
根据官网提供Android 11新特性介绍文档中,对折叠屏的支持和适应指导如下:
可折叠设备
使用 Android 11可以通过以下方法确定页面角度:提供 TYPE_HINGE_ANGLE 新传感器,新 SensorEvent,后者可以监控页面角度,并提供设备两部分之间的角度测量值。用户操作设备时,可以使用这些原始测量值进行精细的动画显示。虽然知道确切的页面角度对某些类型的应用程序(如启动器和壁纸)非常有用,但大多数应用程序应该使用 Jetpack 通过调用 窗口管理器库DeviceState.getPosture() 检索设备状态。或者,您的应用也可以调用 registerDeviceStateChangeCallback(),在 DeviceState 在更改时收到通知,并在状态发生变化时做出响应。由于市场上有更多不同的窗口和设备配置,对设备状态的响应更加安全可靠。
主要涉及两个方面:
- 页角传感器(铰链)
- 设备状态
页角传感器(铰链)
其中,TYPE_HINGE_ANGLE 为 Android 11专门用于处理折叠屏两部分屏幕之间的角度相关性。
Sensor.TYPE_HINGE_ANGLE
A sensor of this type measures the angle,in degrees,between two integral parts of the device. Movement of a hinge measured by this sensor type is expected to alter the ways in which the user may interact with the device,for example by unfolding or revealing a display.values[0]: Measured hinge angle between 0 and 360 degrees inclusive翻译:这种类型的传感器测量设备两部分之间的角度。这种传感器类型测量的铰链运动有望通过扩展或显示屏幕等方式改变用户与设备的交互。values[0]值:0-360度铰角的测量值
设备状态
根据铰链硬件设计,不同的可折叠设备可以有几种中间状态:关闭、部分打开、完全打开(平面)或翻转。
【androidx.window.DeviceState】
class DeviceState { public static final int POSTURE_UNKNOWN = 0; public static final int POSTURE_CLOSED = 1; public static final int POSTURE_HALF_OPENED = 2; public static final int POSTURE_OPENED = 3; public static final int POSTURE_FLIPPED = 4; public int getPosture();}
常量 | 说明 |
---|---|
POSTURE_CLOSED | 可折叠设备已折叠,其主屏幕区域不可访问。 |
POSTURE_FLIPPED | 可折叠设备翻转柔性屏幕部件或物理屏幕面向相反的方向。 |
POSTURE_HALF_OPENED | 可折叠设备的铰链处于开启和关闭状态之间的中间位置,柔性屏幕部件之间或物理屏幕面板之间存在非平角。 |
POSTURE_OPENED | 可折叠设备完全打开,呈现给用户的屏幕空间是平的。 |
POSTURE_UNKNOWN | 设备状态未知。可能意味着这个设备不支持可变姿势(非折叠屏设备)或者没有提供任何关于它的状态的信息。 |
方法 | 说明 |
---|---|
public int getPosture() | 获得具有柔性屏幕或多个物理屏幕的可折叠设备的折叠状态,状态值为上述5种之一。非折叠设备始终返回 POSTURE_UNKNOWN |
折叠屏应用适配
折叠屏调试环境
- 折叠屏真机调试(高端人士专用)
- 可折叠设备模拟器(Android 11以上)
(1)创建可折叠设备AVD
Android Studio 3.5以上版本,支持创建可折叠设备模拟器AVD
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bIXb97P2-1605102307706)(https://tvax3.sinaimg.cn/large/007rDMYyly1gkl7lt7p19j30sb0c574r.jpg)]
(2)模拟可折叠设备屏幕变化
利用模拟器可以可触发屏幕折叠/展开,更改方向和快速操作等,如侧边工具栏所示。
应用适配折叠屏
- 获取设备状态
大多数应用都应该使用 Jetpack 窗口管理器库,通过调用 DeviceState.getPosture() 检索设备状态。或者,也可以调用 registerDeviceStateChangeCallback(),以在 DeviceState 更改时收到通知,并在状态发生变化时做出响应。
设备状态获取举例:
import androidx.window.DeviceState; DeviceState mDeviceState = new DeviceState.Builder().build(); int state = mDeviceState.getPosture();
关于 设备状态registerDeviceStateChangeCallback回调的具体用法,目前aosp以及官方文档并没有太多介绍,而且就目前所知,这部分相关api(包括上面的DeviceState)是集成在androidx的扩展库中的,aosp源码并不携带相关源码(有可能后续更新)。
因此,registerDeviceStateChangeCallback 此处暂不介绍,后面有详细技术文档再更新。
- 获取合页角度
折叠屏监控铰链角度变化举例:
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); // 获取传感器管理对象 mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); // 获取传感器的类型(TYPE_HINGE_ANGLE:铰链角度传感器) mSensor = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); } @Override protected void onResume() {
super.onResume(); // 为铰链角度传感器注册监听器 mSensorManager.registerListener(mSensorEventListener, mSensor, SensorManager.SENSOR_DELAY_NORMAL); } @Override protected void onPause() {
super.onPause(); // 取消监听 mSensorManager.unregisterListener(mSensorEventListener); } SensorEventListener mSensorEventListener = new SensorEventListener() {
// 当传感器的值改变的时候回调该方法 @Override public void onSensorChanged(SensorEvent event) {
//event.values[0]: 测量的铰链角度,其值范围在0到360度之间 Log.d(TAG, "onSensorChanged value = " + event.values[0]; } // 当传感器精度发生改变时回调该方法 @Override public void onAccuracyChanged(Sensor sensor, int accuracy) {
} };
更多官方API接口介绍:
DeviceState
DeviceState.Builder
WindowManager
WindowBackend
参考资料
https://developer.android.com/preview/features
https://developer.android.com/guide/topics/ui/foldables?hl=en
https://developer.android.com/preview/features/foldables
https://github.com/android/user-interface-samples/tree/master/WindowManager
华为折叠屏应用开发指导
三星折叠屏初体验|写给开发者的设计指南
修改说明
作者 | 版本 | 修改时间 | 修改说明 |
---|---|---|---|
WalkAloner | V1.0 | 2020/11/11 | 首版 |