hadss_uni_input 1.0.0-rc.0
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 // 接口文件
新增特性 #
- 新增轻扫交互归一功能,相关接口onSwipe。
- 新增滚动/平移交互归一功能,相关接口onPanStart,onPanUpdate,onPanEnd,onPanCancel。
- 新增缩放交互归一功能,相关接口onPinchStart,onPinchUpdate,onPinchEnd,onPinchCancel。
- 新增旋转交互归一功能,相关接口this.onRotateStart,onRotateUpdate,onRotateEnd,onRotateCancel。
- 新增上下文菜单交互归一功能,相关接口onContentMenu。
- 注意:本组件所有手势,键盘不允许同时按下两个键。
- 新增点击功能,与flutter点击功能用法一致,相关接口 onTap,onTapDown,onTapUp,onTapCancel。
- 新增双击功能,与flutter双击功能用法一致,相关接口 onDoubleTap,onDoubleTapDown,onDoubleTapCancel。
- 新增长按功能,与flutter长按功能用法一致,相关接口 onLongPress,onLongPressStart,onLongPressDown,onLongPressMoveUpdate,onLongPressUp,onLongPressEnd,onLongPressCancel。
- 新增拖拽功能,与flutter拖拽功能用法一致,相关接口 onDragDown,onDragStart,onDragUpdate,onDragEnd,onDragCancel。
- 新增悬浮功能,相关接口onHover。
- 请确保电脑中只有一个flutter sdk,否则通过flutter运行鸿蒙真机会出现启动崩溃。
- 如果要在鸿蒙平板和2in1设备运行,请在ohos-entry-src-main-module.json5中添加。
部署步骤 #
- 下载源码。
- 打开命令行,进入 项目根目录\packages\uni_input\example目录
- 执行命令创建Flutter项目 flutter create .
- 配置鸿蒙开发环境
- 执行命令 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 | 拖拽取消触发回调 |
说明: 触控板双指捏合生效条件:
- OpenHarmony SDK: >= API 15
- 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 |
使用说明 #
- import引用交互hadss_uni_input
import 'package:hadss_uni_input/hadss_uni_input.dart';
- 滚动平移事件监听实例
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),
),
),
),
),
),
),
);
}
- 轻扫事件监听实例
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),
),
),
),
),
),
),
);
}
- 缩放事件监听实例
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),
),
),
),
),
),
),
);
}
- 旋转事件监听实例
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),
),
),
),
),
),
),
);
}
- 拖拽事件监听实例
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('拖拽取消'),
);
});
}
- 悬浮事件监听实例
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;
});
}
}
约束与限制 #
- OpenHarmony SDK: >= API 12.
- flutter sdk 版本要求:>= 3.7.12
使用过程中发现任何问题都可以提 Issue。
同时,也非常欢迎您提交 PR。
开源协议 #
本项目基于Apache License 2.0 ,请自由地享受和参与开源。