Flutter提供了很多处理触摸事件的控件,例如InkWell
和InkResponse
可以处理点击、双击、长按等事件,将它们包裹在需要响应触摸事件的控件外部就可以了,而且InkWell
和InkResponse
还会添加一个水波纹的点击效果,InkResponse
还可以设置水波纹的形状。但是,InkWell
和InkResponse
都不会做任何的渲染工作,它们只是更新了父级Material Widget。一个简单的例子就是image,如果你将一个image用InkWell
包裹住,那么你会发现,水波纹效果不见了。这是因为水波纹是被绘制在image的下层的,所以被遮挡住了。如果想要水波纹可见,那么请使用Ink.Image
。
但是如果你想要捕捉更多的触摸事件,比如用户的拖拽行为,那么你就必须使用GestureDetector
来实现了。
什么是GestureDetector
最基本的解释就是:一个处理各种 touch event 的 stateless widget。GestureDetector是一个纯粹的用来处理手势的控件,没有任何UI上的表现(不像Ink那样会有水波纹的触摸反馈)。
下面的表格是GestureDetector
提供的各种 callbacks 和对这些回调的简单解释:
Property/Callback | Description |
---|---|
onTapDown | 用户每次和屏幕交互时都会被调用 |
onTapUp | 用户停止触摸屏幕时触发 |
onTap | 短暂触摸屏幕时触发 |
onTapCancel | 用户触摸了屏幕,但是没有完成Tap的动作时触发 |
onDoubleTap | 用户在短时间内触摸了屏幕两次 |
onLongPress | 用户触摸屏幕时间超过500ms时触发 |
onVerticalDragDown | 当一个触摸点开始跟屏幕交互,同时在垂直方向上移动时触发 |
onVerticalDragStart | 当触摸点开始在垂直方向上移动时触发 |
onVerticalDragUpdate | 屏幕上的触摸点位置每次改变时,都会触发这个回调 |
onVerticalDragEnd | 当用户停止移动,这个拖拽操作就被认为是完成了,就会触发这个回调 |
onVerticalDragCancel | 用户突然停止拖拽时触发 |
onHorizontalDragDown | 当一个触摸点开始跟屏幕交互,同时在水平方向上移动时触发 |
onHorizontalDragStart | 当触摸点开始在水平方向上移动时触发 |
onHorizontalDragUpdate | 屏幕上的触摸点位置每次改变时,都会触发这个回调 |
onHorizontalDragEnd | 水平拖拽结束时触发 |
onHorizontalDragCancel | onHorizontalDragDown没有成功完成时触发 |
onPanDown | 当触摸点开始跟屏幕 |