Android 11----折叠屏初识
声明
博客地址:http://blog.youkuaiyun.com/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 更改时收到通知,并在状态发生变化时做出响应。
由于目前市场上已经有且未来还会出现更多不同的窗口和设备配置,因此对设备状态做出响应更加安全可靠。
主要涉及2个方面:
- 合页角度传感器(铰链)
- 设备状态
合页角度传感器(铰链)
其中,TYPE_HINGE_ANGLE 为 Android 11新增的传感器类型,专门用于处理折叠屏两部分屏幕之间的的角度相关。
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接口介绍:
参考资料
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 | 首版 |