首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我想知道如何用GestureDetector来检测手指数

我想知道如何用GestureDetector来检测手指数
EN

Stack Overflow用户
提问于 2022-06-15 08:55:19
回答 1查看 515关注 0票数 1

我正在制作一个白板应用程序,我将通过GestureDetector实现绘图和缩放功能。

每个测试都进行得很好,但是如果我同时使用这两种方法,onScaleUpdate()中只使用Zoom函数,而不会输出绘图函数。

所以我要实现它,如果我触摸两个手指,我只能使用缩放函数,如果我触摸一个,我只能使用绘图函数。你能分辨出用手势探测器触摸的手指数吗?

或者还有别的好办法?

以下是我的代码的一部分

代码语言:javascript
复制
 GestureDetector(
  onScaleStart: (details) {
    Tool tool = context.read<DrawProvider>().tool;
    double seletedPenWidth = context.read<DrawProvider>().seletedPenWidth;
    Color seletedPenColor = context.read<DrawProvider>().seletedPenColor;

    RenderBox box = context.findRenderObject() as RenderBox;

    // zoom test
    context.read<DrawProvider>().onScaleStart(details);

    // Use Pen
    if (tool == Tool.pen) {
      Offset point = box.globalToLocal(details.focalPoint);
      point = Offset(point.dx, point.dy);

      currentLine = DrawingModel(
        pointList: [point],
        color: seletedPenColor,
        width: seletedPenWidth,
      );

    } else {
      // TODO Other Tool
    }
  },

  onScaleUpdate: (details) {
    Tool tool = context.read<DrawProvider>().tool;
    double seletedPenWidth = context.read<DrawProvider>().seletedPenWidth;
    Color seletedPenColor = context.read<DrawProvider>().seletedPenColor;

    RenderBox box = context.findRenderObject() as RenderBox;

    // zoom test
    context.read<DrawProvider>().onScaleUpdate(details);

    if (tool == Tool.pen) {
      Offset point =
          box.globalToLocal(details.focalPoint);
      point = Offset(point.dx, point.dy);

      List<Offset> path = List.from(currentLine!.pointList!)..add(point);

      currentLine = DrawingModel(
        pointList: path,
        color: seletedPenColor,
        width: seletedPenWidth,
      );

      currentLineStreamController.add(currentLine!);
    }
  },

  onScaleEnd: (details) {
    Tool tool = context.read<DrawProvider>().tool;

    // zoom test
    context.read<DrawProvider>().onScaleEnd(details);

    if (tool == Tool.pen) {
      allLines = List.from(allLines)..add(currentLine!);
      linesStreamController.add(allLines);
    }
}

provider.dart,变焦函数

代码语言:javascript
复制
  Offset _offset = Offset.zero;
  Offset _initialFocalPoint = Offset.zero;
  Offset _sessionOffset = Offset.zero; 
  double _scale = 1.0;
  double _initialScale = 1.0;

 void onScaleStart(ScaleStartDetails details) {
    // TODO if use move tool
    // _initialFocalPoint = details.focalPoint;
    _initialScale = _scale;
    notifyListeners();
  }

  void onScaleUpdate(ScaleUpdateDetails details) {
    // TODO if use move tool
    // _sessionOffset = details.focalPoint - _initialFocalPoint;
    _scale = _initialScale * details.scale;
    notifyListeners();
  }

  void onScaleEnd(ScaleEndDetails details) {
    // TODO if use move tool
    // _offset += _sessionOffset;
    _sessionOffset = Offset.zero;

    notifyListeners();
  }

白板屏幕小部件

代码语言:javascript
复制
          Transform.translate(
            offset: _offset + _sessionOffset,
            child: Transform.scale(
              scale: _scale, 
              child: buildAllPaths(allLines: allLines), // drawing screen
            ),
          ),
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-15 16:10:20

details.pointerCount中使用onScaleUpdateonScaleStart中的onScaleStart

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72628482

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档