Flutter使用GestureDetector工具实现手势缩放效果

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;
            });
          },
        ),
      ),
    );
  }
}
相关推荐
FungLeo8 分钟前
成为全栈·Flutter App 篇·Markdown 编辑器:编辑、预览与离开保护
flutter·移动开发·markdown编辑器·表单设计·成为全栈·草稿保存
FungLeo1 小时前
成为全栈·Flutter App 篇·会员中心:资料、密码、通知与私有数据缓存
flutter·dart·身份认证·数据隔离·成为全栈·会员中心
穆梓兰煊19 小时前
Flutter端云协同推理架构解析
flutter·github
FungLeo1 天前
成为全栈·Flutter App 篇·内置 WebView:网页历史、App 返回与外链安全
flutter·网络安全·移动开发·webview·路由管理·成为全栈
m0_738185821 天前
Flutter 鸿蒙化实战:volume_controller 适配 OpenHarmony,系统音量控制
flutter·华为·harmonyos·鸿蒙
FungLeo1 天前
成为全栈·Flutter App 篇·Flutter Markdown 阅读器:支持范围与渲染边界
flutter·markdown·dart·代码高亮·成为全栈·移动阅读
m0_738185821 天前
Flutter 鸿蒙化实战:webview_cookie_manager 适配 OpenHarmony,WebView Cookie 管理
flutter·华为·harmonyos·鸿蒙
FungLeo1 天前
成为全栈·Flutter App 篇·服务端目录与文章辅助阅读:锚点、上下篇、浏览量和阅读历史
flutter·锚点·阅读体验·成为全栈·markdown目录·api契约
恋猫de小郭1 天前
Flutter Android 改动:APK 不再允许通过 Intent 动态修改 Engine 参数
android·前端·flutter