hadss_uni_input 1.0.0-rc.0 copy "hadss_uni_input: ^1.0.0-rc.0" to clipboard
hadss_uni_input: ^1.0.0-rc.0 copied to clipboard

A multimode input interactive normalized event plugin project.

hadss_uni_input #

介绍 #

Flutter框架的多设备适配交互归一库核心代码。

目录结构 #

├─hadss_uni_input // 项目名称
│  ├─src
│  │  ├─gesture_event.dart // 回调方法参数
│  │  ├─gesture_utils.dart // 公用方法及配置
│  │  ├─keyboard_detector.dart // 键盘事件
│  │  ├─pointer_options.dart // 接口参数
│  │  ├─touch_finger.dart // 触压类
│  │  └─unified_gesture_detector.dart // 事件归一类
│  ├─hadss_uni_input.dart // 接口文件

新增特性 #

  1. 新增轻扫交互归一功能,相关接口onSwipe。
  2. 新增滚动/平移交互归一功能,相关接口onPanStart,onPanUpdate,onPanEnd,onPanCancel。
  3. 新增缩放交互归一功能,相关接口onPinchStart,onPinchUpdate,onPinchEnd,onPinchCancel。
  4. 新增旋转交互归一功能,相关接口this.onRotateStart,onRotateUpdate,onRotateEnd,onRotateCancel。
  5. 新增上下文菜单交互归一功能,相关接口onContentMenu。
  6. 注意:本组件所有手势,键盘不允许同时按下两个键。
  7. 新增点击功能,与flutter点击功能用法一致,相关接口 onTap,onTapDown,onTapUp,onTapCancel。
  8. 新增双击功能,与flutter双击功能用法一致,相关接口 onDoubleTap,onDoubleTapDown,onDoubleTapCancel。
  9. 新增长按功能,与flutter长按功能用法一致,相关接口 onLongPress,onLongPressStart,onLongPressDown,onLongPressMoveUpdate,onLongPressUp,onLongPressEnd,onLongPressCancel。
  10. 新增拖拽功能,与flutter拖拽功能用法一致,相关接口 onDragDown,onDragStart,onDragUpdate,onDragEnd,onDragCancel。
  11. 新增悬浮功能,相关接口onHover。
  12. 请确保电脑中只有一个flutter sdk,否则通过flutter运行鸿蒙真机会出现启动崩溃。
  13. 如果要在鸿蒙平板和2in1设备运行,请在ohos-entry-src-main-module.json5中添加。

部署步骤 #

  1. 下载源码。
  2. 打开命令行,进入 项目根目录\packages\uni_input\example目录
  3. 执行命令创建Flutter项目 flutter create .
  4. 配置鸿蒙开发环境
  5. 执行命令 flutter build hap --release

交互归一能力 #

以下为事件接口 #

事件名称 事件说明
onPanStart 滚动事件开始触发回调
onPanUpdate 滚动事件过程触发回调
onPanEnd 滚动事件结束触发回调
onPanCancel 滚动事件取消触发回调
onPinchStart 缩放事件开始触发回调
onPinchUpdate 缩放事件过程触发回调
onPinchEnd 缩放事件结束触发回调
onPinchCancel 缩放事件取消触发回调
onSwipe 轻扫事件回调
onRotateStart 旋转事件开始触发回调
onRotateUpdate 旋转事件过程触发回调
onRotateEnd 旋转事件结束触发回调
onRotateCancel 旋转事件取消触发回调
onContentMenu 上下文菜单触发回调
onHover 悬浮触发回调
onDoubleTap 双击触发回调
onDoubleTapDown 双击按下触发回调
onDoubleTapCancel 双击取消触发回调
onLongPress 长按触发回调
onLongPressStart 长按开始触发回调
onLongPressDown 长按按下触发回调
onLongPressMoveUpdate 长按移动中触发回调
onLongPressUp 长按抬起触发回调
onLongPressEnd 长按结束触发回调
onLongPressCancel 长按取消触发回调
onTap 点击触发回调
onTapDown 点击按下触发回调
onTapUp 点击抬起触发回调
onTapCancel 点击取消触发回调
onDragDown 拖拽按下触发回调
onDragStart 拖拽开始触发回调
onDragUpdate 拖拽进行中触发回调
onDragEnd 拖拽结束触发回调
onDragCancel 拖拽取消触发回调

说明: 触控板双指捏合生效条件:

  1. OpenHarmony SDK: >= API 15
  2. flutter sdk 版本要求:oh-3.27.4-dev

以下为pointerOptions参数 #

插件参数信息 #

属性 说明 参数类型 默认值
direction 触发滑动手势的滑动方向 SwipeDirection SwipeDirection.All
speed 识别滑动的最小速度,单位dp/s double 100
enableSwipe 轻扫功能开关 bool false
panDirection 用于指定触发滑动的手势方向,此枚举值支持逻辑与(&)和逻辑或运算。 int PanDirection.All.value
distance 用于指定触发滑动手势事件的最小滑动距离,单位为vp double 5
enablePan 滚动功能开关 bool false
pinchDistance 缩放最小识别距离,单位为dp double 5
enablePinch 缩放功能开关 boolean false
angle 触发旋转手势的最小改变度数,单位为deg double 1
enableRotate 旋转功能开关 bool false

以下为pointerOptions参数 #

属性 说明 参数类型
offsetX 手势事件偏移量X,单位为vp,用于PanGesture手势触发场景,从左向右滑动offsetX为正,反之为负。 double
offsetY 手势事件偏移量Y,单位为vp,用于PanGesture手势触发场景,从上向下滑动offsetY为正,反之为负。 double
angle 用于RotationGesture手势触发场景时,表示旋转角度。用于SwipeGesture手势触发场景时,表示滑动手势的角度,即两根手指间的线段与水平方向的夹角变化的度数。 double
scale 缩放比例,用于PinchGesture手势触发场景。取值范围:[0, +∞) double
pinchCenterX 捏合手势中心点的x轴坐标,单位为vp,用于PinchGesture手势触发场景。取值范围:[0, +∞) double
pinchCenterY 捏合手势中心点的y轴坐标,单位为vp,用于PinchGesture手势触发场景。取值范围:[0, +∞) double
speed 滑动手势速度,即所有手指相对当前组件元素原始区域滑动的平均速度,单位为dp/秒,用于SwipeGesture手势触发场景。取值范围:[0, +∞) double
velocityX 用于PanGesture手势中,获取当前手势的x轴方向速度。坐标轴原点为屏幕左上角,分正负方向速度,从左往右为正,反之为负。单位为dp/s。 double
velocityY 用于PanGesture手势中,获取当前手势的y轴方向速度。坐标轴原点为屏幕左上角,分正负方向速度,从上往下为正,反之为负。单位为dp/s double
velocity 用于PanGesture手势中,获取当前手势的主方向速度。为xy轴方向速度的平方和的算术平方根。单位为dp/s。 double
localPosition 提供给上下文菜单显示使用,表明当前鼠标或者触控点的位置 Offset

使用说明 #

  1. import引用交互hadss_uni_input
import 'package:hadss_uni_input/hadss_uni_input.dart';
  1. 滚动平移事件监听实例
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('滚动平移'),
        leading: IconButton(
          icon: Icon(Icons.arrow_back),
          onPressed: () {
            Navigator.pop(context);
          },
        ),
      ),
      body: UnifiedGestureDetector(
        pointerOptions: PointerOptions(
            enablePan: true,
            panDirection: panDirection),
        onPanStart: onPanStart,
        onPanUpdate: onPanUpdate,
        onPanEnd: onPanEnd,
        child: Material(
          child: Center(
            child: Transform(
              alignment: Alignment.center,
              transform: Matrix4.identity()
                ..translate(_offset.dx, _offset.dy)
                ..rotateZ(_rotation)
                ..scale(_scale),
              child: Container(
                width: 200,
                height: 200,
                color: Colors.green,
                alignment: Alignment.center,
                child: const Text(
                  '滚动平移',
                  style: TextStyle(fontSize: 30),
                ),
              ),
            ),
          ),
        ),
      ),
    );
  }

  1. 轻扫事件监听实例
Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('轻扫'),
        leading: IconButton(
          icon: Icon(Icons.arrow_back),
          onPressed: () {
            Navigator.pop(context);
          },
        ),
      ),
      body: UnifiedGestureDetector(
        pointerOptions: PointerOptions(
          speed: 150,
          direction: SwipeDirection.All,
          enableSwipe: true,
        ),
        onSwipe: onSwipe,
        child: Material(
          child: Center(
            child: Transform(
              alignment: Alignment.center,
              transform: Matrix4.identity()
                ..translate(_offset.dx, _offset.dy)
                ..rotateZ(_rotation)
                ..scale(_scale),
              child: Container(
                width: 200,
                height: 200,
                color: Colors.green,
                alignment: Alignment.center,
                child: const Text(
                  '轻扫',
                  style: TextStyle(fontSize: 30),
                ),
              ),
            ),
          ),
        ),
      ),
    );
  }

  1. 缩放事件监听实例
Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('缩放'),
        leading: IconButton(
          icon: Icon(Icons.arrow_back),
          onPressed: () {
            Navigator.pop(context);
          },
        ),
      ),
      body: UnifiedGestureDetector(
        pointerOptions: PointerOptions(
            enablePinch: true,),
        onPinchStart: onPinchStart,
        onPinchUpdate: onPinchUpdate,
        onPinchEnd: onPinchEnd,
        child: Material(
          child: Center(
            child: Transform(
              alignment: Alignment.center,
              transform: Matrix4.identity()
                ..translate(_offset.dx, _offset.dy)
                ..rotateZ(_rotation)
                ..scale(_scale),
              child: Container(
                width: 200,
                height: 200,
                color: Colors.green,
                alignment: Alignment.center,
                child: const Text(
                  '缩放',
                  style: TextStyle(fontSize: 30),
                ),
              ),
            ),
          ),
        ),
      ),
    );
  }

  1. 旋转事件监听实例
Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('旋转'),
        leading: IconButton(
          icon: Icon(Icons.arrow_back),
          onPressed: () {
            Navigator.pop(context);
          },
        ),
      ),
      body: UnifiedGestureDetector(
        pointerOptions: PointerOptions(
            enableRotate: true,),
        onRotateStart: onRotateStart,
        onRotateUpdate: onRotateUpdate,
        onRotateEnd: onRotateEnd,
        child: Material(
          child: Center(
            child: Transform(
              alignment: Alignment.center,
              transform: Matrix4.identity()
                ..translate(_offset.dx, _offset.dy)
                ..rotateZ(_rotation)
                ..scale(_scale),
              child: Container(
                width: 200,
                height: 200,
                color: Colors.green,
                alignment: Alignment.center,
                child: const Text(
                  '旋转',
                  style: TextStyle(fontSize: 30),
                ),
              ),
            ),
          ),
        ),
      ),
    );
  }

  1. 拖拽事件监听实例
Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('拖拽'),
        leading: IconButton(
          icon: const Icon(Icons.arrow_back),
          onPressed: () {
            Navigator.pop(context);
          },
        ),
      ),
      body: Transform(
        alignment: Alignment.center,
        transform: Matrix4.identity()..translate(_offset.dx, _offset.dy),
        child: Center(
          child: UnifiedGestureDetector(
            onDragStart: onDragStart,
            onDragUpdate: onDragUpdate,
            onDragCancel: onDragCancel,
            child: Container(
              width: 200,
              height: 200,
              color: Colors.green,
              alignment: Alignment.center,
              child: const Text(
                '拖拽',
                style: TextStyle(fontSize: 30),
              ),
            ),
          ),
        ),
      ),
    );
  }

  void onDragStart(DragStartDetails detail) {
    setState(() {
      _offset = detail.localPosition;
    });
  }

  void onDragUpdate(DragUpdateDetails detail) {
    setState(() {
      _offset = detail.localPosition;
    });
  }

  void onDragCancel() {
    showDialog(
        context: context,
        builder: (BuildContext context) {
          return const AlertDialog(
            title: Text('拖拽取消'),
          );
        });
  }

  1. 悬浮事件监听实例
Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('悬浮'),
        leading: IconButton(
          icon: const Icon(Icons.arrow_back),
          onPressed: () {
            Navigator.pop(context);
          },
        ),
      ),
      body: Center(
        child: UnifiedGestureDetector(
          onHover: onHover,
          child: Container(
            width: 200,
            height: 200,
            color: color,
            alignment: Alignment.center,
            child: Text(
              text,
              style: const TextStyle(fontSize: 30),
            ),
          ),
        ),
      ),
    );
  }

  void onHover(bool isHover, PointerEvent event) {
    if (isHover) {
      setState(() {
        text = '悬浮中';
        color = Colors.red;
      });
    } else {
      setState(() {
        text = '悬浮取消';
        color = Colors.green;
      });
    }
  }

约束与限制 #

  1. OpenHarmony SDK: >= API 12.
  2. flutter sdk 版本要求:>= 3.7.12

使用过程中发现任何问题都可以提 Issue
同时,也非常欢迎您提交 PR

开源协议 #

本项目基于Apache License 2.0 ,请自由地享受和参与开源。

0
likes
145
points
24
downloads

Publisher

unverified uploader

Weekly Downloads

A multimode input interactive normalized event plugin project.

Homepage
Repository

Topics

#input

Documentation

Documentation
API reference

License

Apache-2.0 (license)

Dependencies

flutter, vector_math

More

Packages that depend on hadss_uni_input