手势检测和触摸事件处理
手势检测和触摸事件处理
如何在Flutter中向 widget 添加手势识别器?
在 Xamarin.Forms 中,元素(Element)可能包含一个可供附加(attach)的单击事件。许多元素还包含一个与此事件关联的 命令。或者你可以使用 TapGestureRecognizer。在 Flutter 中有两种非常相似的方式:
- 如果 widget 支持事件发现(detection),那么可以将函数传递给它并在函数中处理它:
@override
Widget build(BuildContext context) {
return new RaisedButton(
onPressed: () {
print("click");
},
child: new Text("Button"));
}
- If the widget doesn’t support event detection, wrap thewidget in a GestureDetector and pass a function to the
onTapparameter.
如果 widget 不支持事件发现,则将 widget 封装在手势检测器(GestureDetector)中,并将函数传递给“onTap”参数。
<!-- skip -->
```dart
class SampleApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return new Scaffold(
body: new Center(
child: new GestureDetector(
child: new FlutterLogo(
size: 200.0,
),
onTap: () {
print(“tap”);
},
),
));
}
}
### 我如何处理 widget 上的其他手势?
在 Xamarin.Forms 中你可以在`VisualElement`中添加一个`手势识别器(GestureRecognizer)`。您通常只能使用 `TapGestureRecognizer`、`PinchGestureRecognizer` 和 `PanGestureRecognizer`,除非您构建了自己的实现。
在Flutter中,使用手势检测器,你可以监听到各种各样的手势,比如:
* 单击
* `onTapDown`
* 当指尖在特定位置与屏幕接触产生点击事件。
* `onTapUp`
* 当指尖触发的点击事件已经停止在特定位置与屏幕接触。
* `onTap`
* 一个点击事件已经发生
* `onTapCancel`
* 触发了 `onTapDown` 事件之后的指尖没有导致点击事件。
* 双击
* `onDoubleTap`
* 用户在同一位置连续快速点击屏幕两次。
* 长按
* `onLongPress`
* 指尖长时间保持与屏幕在同一位置的接触。
* 垂直拖动
* `onVerticalDragStart`
* 指尖与屏幕接触后,可能开始垂直移动。
* `onVerticalDragUpdate`
* 指尖与屏幕接触并在垂直方向上移动得更远。
* `onVerticalDragEnd`
* 指尖在之前与屏幕接触并垂直移动,当不再与屏幕接触时触发这个事件。当它停止与屏幕接触时,它会以特定的速度移动。
* 水平拖动
* `onHorizontalDragStart`
* 指尖与屏幕接触,开始水平移动时触发。
* `onHorizontalDragUpdate`
* 指尖与屏幕接触并在水平方向上移动得更远。
* `onHorizontalDragEnd`
* 指尖在之前与屏幕接触并水平移动,当不再与屏幕接触时会触发这个事件。当它停止与屏幕接触时,它正在以特定的速度移动。
下面的例子展示了一个`手势检测器`,它可以在双击下旋转 Flutter 的 logo:
AnimationController controller; CurvedAnimation curve;
@override void initState() { controller = new AnimationController(duration: const Duration(milliseconds: 2000), vsync: this); curve = new CurvedAnimation(parent: controller, curve: Curves.easeIn); }
class SampleApp extends StatelessWidget { @override Widget build(BuildContext context) { return new Scaffold( body: new Center( child: new GestureDetector( child: new RotationTransition( turns: curve, child: new FlutterLogo( size: 200.0, )), onDoubleTap: () { if (controller.isCompleted) { controller.reverse(); } else { controller.forward(); } }, ), )); } } ```
