【Flutter】手势监测GestureDetector[ˈdʒestʃər dɪˈtektər]的属性介绍及应用
属性介绍
GestureWidget除key以外有39个属性,但大部分是成组出现的。大致分为以下几组:child、tap、longPress、drag、forcePress、pan、scale、behavior以及excludeFromSemantics,下边列出了其中比较常用的几个。
tap–点击事件
不同于Android中通过View.SetOnClickListener()来给组件添加点击事件,Flutter中绝大多数的组件是不能响应点击事件的。通常做法是在目标Widget外层包裹一个GestureDetector,这也就是child属性的作用,GestureDetector的大小等于子Widget的大小,也就是触控区域的大小。
- onTap() :发生点击。
- onDoubleTap():双击。
- onTapCancel():手指离开屏幕时,触控位置不在GestureDetector范围内。
- onTapDown(TapXXXDetails) :手指落在触控范围内时的回调,details参数中包含触控点的全局位置(相对于屏幕左上角)和本地位置(相对于触控区左上角)。
- onTapUp(TapXXXDetails):同上。
longPress–长按事件
- onLongPress() :手指在触控区停留一段时间,检测出长按(不用放手)。
- onLongPressStart(LongPressXXXDetails):同上,获得检测到长按时的触控点坐标(Global和Local)。
- onLongPressMoveUpdate(LongPressXXXDetails):检测到长按,手指在屏幕内(而非仅仅在触控区域内),得到触控点坐标。
- onLongPressUp() :检测到长按,手指离开屏幕时。
- onLongPressEnd(LongPressXXXDetails):同上,获得该点坐标。
drag–拖拽事件
- onVerticalDragDown(DragDownDetails) :实际上不用拖拽,当手指接触触控区,就会产生该回调,获得该点坐标。
- onVerticalDragStart(DragStartDetails):开始拖拽,details不仅包含该点坐标,而且记录了开始拖拽的时间戳。
- onVerticalDragUpdate(DragUpdateDetails):纵向拖拽过程中,参数不仅包含该点坐标,且记录了当前时间戳。可以与startDrag的时间戳联合使用。
- onVerticalDragEnd(DragEndDetails) :产生纵向拖拽,手指离开屏幕,获得该点坐标。
- onVerticalDragCancel():点击了触控区但没有产生拖拽,或者横向拖拽至触控区外。
- Horizontal横向,略。
forcePress–压感检测
哇咔咔,GestureDetector这么厉害,居然支持压力检测。
这里的压力是没有单位的,默认范围是startPressure0.0-peakPressure1.0代表从没有压力到最大压力。
- onForcePressStart(ForcePressDetails) :触碰屏幕且有一定压力,压力值大于startPressure,获得压力值和触控点坐标。
- onForcePressPeak(ForcePressDetails):触屏屏幕的压力大于peakPreasure,获得压力值和触控点坐标。
- onForcePressUpdate(ForcePressDetails):已经被检测到产生压力的情况下,在屏幕上滑动,或者在原地改变压力大小,亦或是两者都有。同时获得压力值和触控点坐标。
- onForcePressEnd(ForcePressDetails) :已检测到产生压力的情况下,手指离开屏幕。
然而,在所有的压力检测回调中都有这样一则注释:
/// Note that this callback will only be fired on
final GestureForcePressEndCallback onForcePressEnd;
也就是说,只有在具有压感屏的设备上,这些API才起作用。
pan-综合横向与纵向拖拽的拖拽事件
- onPanDown(DragDownDetails) :手指与屏幕接触时,获得该点坐标。
- onPanStart(DragStartDetails):手指开始在屏幕上移动。
- onPanCancel():
- 取消拖拽,暂未回调到该方法。