当前位置: 首页 > article >正文

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

GestureDetector是Flutter内部处理用户手势操作的一个小工具。

如果想要实现缩放效果需要利用到其中两个方法

onScaleStart :当用户触碰屏幕并开始缩放的时候

onScaleUpdate:当用户正在执行缩放时候

ScaleUpdateDetails 是作为函数参数进行传递的,它有以下属性 

1、scale 表示上一帧的缩放比例

2、focalPoint 缩放手势中心点坐标

3、pointerCount 当前触控点数量(小于一个点说明没有用手势缩放)

这里主要用到scale这个参数。

示例:

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;
            });
          },
        ),
      ),
    );
  }
}


http://www.kler.cn/a/471733.html

相关文章:

  • C++二十三种设计模式之工厂方法模式
  • 力扣-数据结构-15【算法学习day.86】
  • 前端如何处理后端传入的复杂数据格式
  • 常见的显示器分辨率及其对应的像素数量
  • 短诗《腊八粥》
  • 【python】Luhn算法验证身份证号码的程序
  • Linux初识——基本指令
  • [Qt] 多元素控件 | 容器类控件 | 布局管理器layout
  • Qt信号槽相关语法
  • MATLAB语言的正则表达式
  • 代码随想录day39 动态规划7
  • Oracle Dataguard(主库为单节点)配置详解(4):将主库复制到备库并启动同步
  • Golang学习笔记_19——Stringer
  • jQuery的基本使用学习笔记
  • 梯度下降方法
  • Three.js 基础概念:构建3D世界的核心要素
  • 使用Paddledetection进行模型训练【Part1:环境配置】
  • ue5动画重定向,一键重定向。ue4小白人替换成ue5
  • k8s排错集:zk集群的pod报错 Init:CrashLoopBackOff无法启动
  • springboot参数注解