hadss_avoid_area 1.0.0-rc.0
hadss_avoid_area: ^1.0.0-rc.0 copied to clipboard
A responsive component plug-in library for multi-device adaptation.
hadss_avoid_area #
简介 #
1、使用Flutter实现原生高级组件FolderStack和FoldSplitContainer,效果与原生ArkUI效果一致。 (1)鸿蒙原生的FolderStack继承于Stack(层叠布局)控件,新增了折叠屏悬停能力,通过识别upperItems自动避让折叠屏折痕区后移到上半屏。 (2)鸿蒙原生的FoldSplitContainer分栏布局,实现折叠屏二分栏、三分栏在展开态、悬停态以及折叠态的区域控制。 2、Flutter框架中获取导航条、状态栏、挖孔、刘海、屏幕圆角等避让区域。 3、在Flutter框架中动态获取避让区域的实时数据。
工程目录 #
├─android // Android原生能力实现
│ ├── src/main/kotlin/hadss/avoid_area
│ ├── AvoidArea.kt // Android返回数据对象
│ ├── AvoidAreaMethodCallHandler.kt // Android提供避让区域原生能力的桥接方法
│ ├── AvoidAreaPlugin.kt // Android能力提供插件
│ ├── FolderStateStreamHandler.kt // Android提供折叠原生能力的桥接方法
│ └── Rect.kt // Android返回区域数据对象
│
├─example // example工程
│ └─lib
│ ├── avoid_area_ui.dart // 区域避让测试UI
│ ├── fold_split_container_ui.dart // FoldSplitContainer测试UI
│ ├── folder_stack_ui.dart // FolderStack测试UI
│ └── main.dart // 主页面
│
├─ios // iOS原生能力实现
│ ├── Classes
│ │ ├── AvoidAreaPlugin.swift // iOS能力提供插件方法实现
│ │ └── AWSafeAreaMonitor.swift // iOS区域避让具体能力方法实现
│ └── hadss_avoid_area.podspec // iOS库配置文件
│
├─lib
│ ├── hadss_avoid_area.dart
│ ├── api
│ │ ├── avoid_area_api.dart // 对外提供API接口
│ │ └── avoid_area.dart // 窗口相关类,用于API接口的参数以及返回
| └── component
| ├── folder_split_view.dart // FoldSplitContainer组件
| ├── folder_options.dart // 折叠屏参数类
| ├── folder_stack.dart // FolderStack组件
| └── folder_plugin.dart // 原生接口对接工具类
|
├─ohos
│ ├── src/main/ets/plugin
| └── AvoidAreaPlugin.ets // 鸿蒙能力提供插件
| └── FolderStateStreamHandler.ets // 折叠屏状态监听
安装与使用 #
运行前准备
flutter pub get
cd example
移动设备运行
flutter run
Web端运行
flutter run -d chrome --web-hostname=127.0.0.1
组件说明 #
FolderStack
继承于Stack(层叠布局)
控件,新增了折叠屏悬停能力,通过识别upperItems自动避让折叠屏折痕区后移到上半屏,以下是独有属性。其余属性和Stack保持一致
名称 | 参数类型 | 必填 | 说明 |
---|---|---|---|
upperItems | List | 是 | 定义悬停态会被移到上半屏的子组件的id,组件id在此数组中的子组件悬停触发时自动避让折叠屏折痕区后移到上半屏,其它组件堆叠在下半屏区域。 |
onFolderStateChange | ValueChanged | 否 | 当折叠状态改变的时候回调 |
FoldingFeature
折叠屏状态
名称 | 参数类型 | 说明 |
---|---|---|
state | FoldStatus | 折叠状态 |
orientation | Axis | 折痕方向 |
bounds | Rect | 折痕区域 |
FoldStatus
折叠状态枚举类
名称 | 说明 |
---|---|
unknown | 表示设备当前折叠状态未知 |
expanded | 表示设备当前折叠状态为完全展开 |
folded | 表示设备当前折叠状态为折叠 |
halfFolded | 表示设备当前折叠状态为半折叠,半折叠指完全展开和折叠之间的状态 |
使用示例:
build() {
FolderStack(
upperItems: const ["item1", "item2"],
onFolderStateChange: (state) {
print("state=$state");
},
children: [
Container(
key: ValueKey('item1'),
width: double.infinity,
height: double.infinity,
color: Colors.red,
child: const Center(
child: Text("背景"),
),
),
Container(
key: ValueKey('item2'),
color: Colors.blue,
width: double.infinity,
margin: const EdgeInsets.all(20),
height: 30,
child: const Text(
"弹幕",
textAlign: TextAlign.center,
),
),
Container(
color: Colors.yellow,
child: const Text("标题,返回"),
),
Align(
alignment: Alignment.bottomCenter,
child: Container(
width: double.infinity,
height: 100,
color: Colors.grey,
alignment: Alignment.center,
child: const Text(
"进度条",
textAlign: TextAlign.center,
),
),
)
],
);
}
FoldSplitContainer
分栏布局,实现折叠屏二分栏、三分栏在展开态、悬停态以及折叠态的区域控制。
名称 | 参数类型 | 必填 | 说明 |
---|---|---|---|
primary | Widget | 是 | 主要区域 |
secondary | Widget | 是 | 次要区域 |
extra | Widget | 否 | 扩展区域回调函数,不传入的情况,没有对应区域 |
foldedLayoutOptions | FoldedRegionLayoutOptions | 是 | 折叠态布局信息(lib/component/folder_options.dart中定义) |
expandedLayoutOptions | ExpandedRegionLayoutOptions | 是 | 展开态布局信息(lib/component/folder_options.dart中定义) |
hoverModeLayoutOptions | HoverModeRegionLayoutOptions | 是 | 悬停态布局信息(lib/component/folder_options.dart中定义) |
onHoverStatusChange | ValueChanged | 否 | 折叠屏进入或退出悬停模式时触发的回调函数 |
FoldedRegionLayoutOptions
折叠态布局信息
名称 | 参数类型 | 说明 |
---|---|---|
verticalSplitRatio | double | 主要区域与次要区域之间的高度比例。默认值:PresetSplitRatio.LAYOUT_1V1 |
ExpandedRegionLayoutOptions
展开态布局信息
名称 | 参数类型 | 说明 |
---|---|---|
isExtraRegionPerpendicular | bool | 扩展区域是否从上到下贯穿整个组件,当且仅当extra有效时此字段才生效。默认值:true |
verticalSplitRatio | double | 主要区域与次要区域之间的高度比例。默认值:PresetSplitRatio.LAYOUT_1V1 |
horizontalSplitRatio | double | 主要区域与扩展区域之间的宽度比例,当且仅当extra有效时此字段才生效。默认值:PresetSplitRatio.LAYOUT_3V2 |
extraRegionPosition | ExtraRegionPosition | 扩展区域的位置信息,当且仅当isExtraRegionPerpendicular = false有效时此字段才生效。默认值:ExtraRegionPosition.top |
HoverModeRegionLayoutOptions
展开态布局信息
名称 | 参数类型 | 说明 |
---|---|---|
showExtraRegion | bool | 可折叠屏幕在半折叠状态下是否显示扩展区域。默认值:false。 |
horizontalSplitRatio | double | 主要区域与扩展区域之间的宽度比例,当且仅当extra有效时此字段才生效。默认值:PresetSplitRatio.LAYOUT_3V2 |
extraRegionPosition | ExtraRegionPosition | 扩展区域的位置信息,当且仅当isExtraRegionPerpendicular = false有效时此字段才生效。默认值:ExtraRegionPosition.top |
PresetSplitRatio
区域比例,值为第一个区域的占用比例
名称 | 值 | 说明 |
---|---|---|
layout_1V1 | 0.5 | 布局比例1 :1 |
layout_2V3 | 2.0 / 5.0 | 布局比例2 :3 |
layout_3V2 | 3.0 / 5.0 | 布局比例3 :2 |
使用示例:
build() {
FoldSplitContainer(
primary: Container(
width: double.infinity,
height: double.infinity,
color: const Color.fromARGB(100, 255, 0, 0),
child: Column()
///详细代码参考 example/lib/fold_split_container_ui.dart,
),
secondary: Container(
width: double.infinity,
height: double.infinity,
color: const Color.fromARGB(100, 0, 255, 0),
child: Column()
///详细代码参考 example/lib/fold_split_container_ui.dart,
),
extra: Container(
width: double.infinity,
height: double.infinity,
color: const Color.fromARGB(100, 0, 0, 255),
child: Column()
///详细代码参考 example/lib/fold_split_container_ui.dart,
),
foldedLayoutOptions: foldedRegionLayoutOptions,
expandedLayoutOptions: expandedRegionLayoutOptions,
hoverModeLayoutOptions: foldingRegionLayoutOptions,
onHoverStatusChange: (status) {},
);
}
区域避让接口说明 #
AvoidAreaApi
区域避让对外提供能力
名称 | 参数 | 返回值 | 说明 |
---|---|---|---|
getWindowAvoidArea | AvoidAreaType: type | AvoidArea | 获取当前应用窗口内容规避的区域。如系统栏区域、刘海屏区域、手势区域、软键盘区域等与窗口内容重叠时,需要窗口内容避让的区域。 |
addAvoidAreaListener | void onData(T event)?,{Function? onError, void onDone()?, bool? cancelOnError} | void | 添加系统规避区变化事件监听。 |
removeAvoidAreaListener | 无 | void | 获取当前应用窗口内容规避的区域。如系统栏区域、刘海屏区域、手势区域、软键盘区域等与窗口内容重叠时,需要窗口内容避让的区域。 |
AvoidAreaType
系统规避区变化后返回的规避区域类型
名称 | 值 | 说明 |
---|---|---|
system | 0 | 表示系统默认区域。一般包括状态栏、导航栏,各设备系统定义可能不同。 |
cutout | 1 | 表示刘海屏区域。 |
systemGesture | 2 | 表示手势区域。 |
keyboard | 3 | 表示软键盘区域。 |
navigationIndicator | 4 | 表示导航条区域。 |
AvoidArea
系统规避区变化后返回的规避区域
名称 | 类型 | 说明 |
---|---|---|
visible | 0 | 规避区域是否可见。true表示可见;false表示不可见。 |
leftRect | Rect | 屏幕左侧的矩形区。 |
topRect | Rect | 屏幕顶部的矩形区。 |
rightRect | Rect | 屏幕右侧的矩形区。 |
bottomRect | Rect | 屏幕底部的矩形区。 |
Rect
窗口矩形区域
名称 | 类型 | 说明 |
---|---|---|
left | int | 矩形区域的左边界,该参数为整数。 |
top | int | 矩形区域的上边界,该参数应为整数。 |
width | int | 矩形区域的宽度,该参数应为整数。 |
height | int | 矩形区域的高度,该参数应为整数。 |
特别说明:
getWindowAvoidArea Android目前避让区域只能获取到状态栏、刘海屏、导航栏3块,而且值和鸿蒙获取到的不一致,无法获取到软键盘以及手势区域避让区域; getWindowAvoidArea iOS由于手势区域UI不感知,所以返回数据均为0,同时addAvoidAreaListener的实现采用遍历返回的方式,屏幕转换情况下返回所有避让区域的最新值 addAvoidAreaListener&removeAvoidAreaListener Android目前未找到对应的监听和去监听方法,目前空实现
名称 | 说明 |
---|---|
系统默认区域 | Android获取的导航栏高度高于Harmony,左边界、上边界、宽度一致 |
刘海屏区域 | Android获取的刘海屏左边界和Harmony一致,上边界比Harmony小,宽度比Harmony大,高度比Harmony小 |
手势区域 | Harmony有相关API,Android和iOS无对应API,目前都返回默认值0 |
软键盘区域 | Harmony有相关API,Android和iOS无对应API,Harmony正常返回,Android和iOS返回默认值0 |
导航条区域 | 矩形区域的高度,该参数应为整数。 |
监听避让区域变化 | Harmony有相关API,Android无对应API |
取消监听避让区域变化 | Harmony有相关API,Android无对应API |
使用示例:
getWindowAvoidArea() async {
// 获取系统默认区域规避区
await AvoidAreaApi.getWindowAvoidArea(AvoidAreaType.system);
if (kDebugMode) {
print('avoidAreaMethod.system = ${json.encode(windowAvoidArea)}');
}
}
addAvoidAreaListener() {
// 添加系统规避区变化事件监听
AvoidAreaApi.addAvoidAreaListener((event) {
if (kDebugMode) {
print('receiveBroadcastStream event = $event');
}
});
}
removeAvoidAreaListener() {
// 删除系统规避区变化事件监听
AvoidAreaApi.removeAvoidAreaListener();
}
贡献代码 #
使用过程中发现任何问题都可以提 Issue。
同时,也非常欢迎您提交 PR。
开源协议 #
本项目基于Apache License 2.0 ,请自由地享受和参与开源。