GestureDetector是Flutter内部处理用户手势操作的一个小工具。
如果想要实现缩放效果需要利用到其中两个方法
onScaleStart :当用户触碰屏幕并开始缩放的时候
onScaleUpdate:当用户正在执行缩放时候
ScaleUpdateDetails 是作为函数参数进行传递的,它有以下属性
1、scale 表示上一帧的缩放比例
2、focalPoint 缩放手势中心点坐标
3、pointerCount 当前触控点数量(小于一个点说明没有用手势缩放)
这里主要用到scale这个参数。
示例:
Dart
class ScalePage extends StatefulWidget {
const ScalePage({super.key});
@override
State<StatefulWidget> createState() {
return GestureDetectorPageTest();
}
}
class GestureDetectorPageTest extends State<ScalePage> {
double _scale = 1.0;
double _startScale = 1.0;
bool ifScale = false;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("手势处理工具GestureDetector"),
),
body: Container(
color: Colors.amber,
width: MediaQuery.of(context).size.width,
height: MediaQuery.of(context).size.height,
child: GestureDetector(
child: Transform.scale(
scale: _scale,
child: const Image(image: AssetImage('images/a.png')),
),
onScaleStart: (e) {
_startScale = _scale;
},
onScaleUpdate: (e) {
setState(() {
_scale = _startScale * e.scale;
//clamp 表示缩放最大不超过原图的两倍,最小不小于原图的0.5倍
_scale = _scale.clamp(0.5, 2.0);
});
},
onScaleEnd: (e) {
},
onDoubleTap: () {
setState(() {
if (ifScale) {
_scale = _startScale * 2;
} else {
_scale = _startScale / 2;
}
_scale = _scale.clamp(0.5, 2.0);
ifScale = !ifScale;
});
},
),
),
);
}
}