这是indexloc提供的服务,不要输入任何密码

hadss_avoid_area 1.0.0-rc.0 copy "hadss_avoid_area: ^1.0.0-rc.0" to clipboard
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 ,请自由地享受和参与开源。

0
likes
150
points
25
downloads

Publisher

unverified uploader

Weekly Downloads

A responsive component plug-in library for multi-device adaptation.

Homepage
Repository

Topics

#fold #safe-area #avoid-area

Documentation

Documentation
API reference

License

Apache-2.0 (license)

Dependencies

flutter, plugin_platform_interface

More

Packages that depend on hadss_avoid_area