在Android中,我们的事件可以拆分为三点,down、move、up,然后由这三点来决定是否移动,是否长按,是否双击等等功能,在flutter中也是一样
Listener({
Key key,
this.onPointerDown,
this.onPointerMove,
this.onPointerEnter,
this.onPointerExit,
this.onPointerHover,
this.onPointerUp,
this.onPointerCancel,
this.onPointerSignal,
this.behavior = HitTestBehavior.deferToChild,
Widget child,
})
onPointer监听系列的参数:
忽略onPointer:
如果需要忽略某个widget的点击事件我们可以使用IgnorePointer和AbsorbPointer来实现,区别是IgnorePointer本身不参与命中测试,而AbsorbPointer会参与命中测试,但是不会响应事件
上面说的Listener能完成的事情,我们用GestureDetector也可以做到,而且更方便,GestureDetector是Listener的语义化封装,上面我们说的单击,双击长按这些功能,在GestureDetector中能够很方便的使用,但是在Listener中还需要自己计算
单击:onTap
双击:onDoubleTap (用户点击ontap时会有200ms的延迟来判断是否时双击)
长按:onLongPress
拖动(滑动):flutter的拖动效果很好做,如果用Android来做就没这么舒服了
Stack(
children: [
Positioned(
top: _top,
left: _left,
child: GestureDetector(
child: Container(
child: Text(
"更多",
style: TextStyle(color: Colors.white),
),
decoration: BoxDecoration(color: Colors.blue),
padding: EdgeInsets.all(10.0),
),
onTapDown: (event){
print("点击下了");
},
onPanUpdate: (DragUpdateDetails event){
print(event.delta.dx);
setState(() {
_left+=event.delta.dx;
_top+=event.delta.dy;
});
},
),
)
],
)
效果如下:
单一滑动:单一滑动就是指定一个方向去滑动,我们把上面的方法改动一下,换一个回调,onVerticalDragUpdate这个回调限制垂直滑动,当然有限制垂直滑动就会有限制水平滑动
Stack(
children: [
Positioned(
top: _top,
left: _left,
child: GestureDetector(
child: Container(
child: Text(
"更多",
style: TextStyle(color: Colors.white),
),
decoration: BoxDecoration(color: Colors.blue),
padding: EdgeInsets.all(10.0),
),
onTapDown: (event){
print("点击下了");
},
onVerticalDragUpdate: (DragUpdateDetails event){
print(event.delta.dy);
setState(() {
_left+=event.delta.dx;
_top+=event.delta.dy;
});
},
),
)
]
效果如下,你会发现我在setState中去设置了left也没有用,因为我接收到的event.delta.dx就是0.0
缩放:我们如果想要达到widget缩放可以使用onScaleUpdate回调,然后在回调中去重新刷新widget的宽高
Center(
child: GestureDetector(
child: Image.asset(
"./images/lake.jpg",
width: _widget,
height: _height,
),
onScaleUpdate: (ScaleUpdateDetails details) {
setState(() {
_widget = 200.0 * details.scale.clamp(.5, 10.0);//设置其最小缩放倍数和最大放大倍数
_height = 300.0 * details.scale.clamp(.5, 10.0);
print(_widget);
});
},
),
)
效果如下:
Flutter还给我们提供了很多其他的手势识别器,我们如果有需要可以直接去看GestureDetector的构造