android - Flutter - 多个手势,无需抬起手指

我正在尝试创建以下效果:当用户在空白屏幕上长按时,会出现一个矩形。在不抬起手指的情况下,我希望用户能够拖动矩形的边缘之一(例如,垂直)。

我能够分别实现这些效果(长按、释放、拖动),但我需要在不抬起手指的情况下拥有它们。

目前,我的代码如下所示:

 @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onPanStart: startDrag,
      onPanUpdate: onDrag,
      onPanEnd: endDrag,
      child: CustomPaint(
        painter: BoxPainter(
          color: BOX_COLOR,
          boxPosition: boxPosition,
          boxPositionOnStart: boxPositionOnStart ?? boxPosition,
          touchPoint: point,
        ),
        child: Container(),
      ),
    );
  }

这个实现了边缘的拖动,基于this tutorial .

为了使元素在长按时出现,我使用了 Opacity 小部件。

@override
  Widget build(BuildContext context) {
    return new GestureDetector(
      onLongPress: () {
        setState(() {
          this.opacity = 1.0;
        });
      },
      child: new Container(
        width: width,
        height: height,
        child: new Opacity(
          opacity: opacity,
          child: PhysicsBox(
            boxPosition: 0.5,
          ),
        ),
      ),
    );
  }

最佳答案

如果有人仍然感兴趣,我可以使用 DelayedMultiDragGestureRecognizer 类实现所需的行为。

代码如下所示:

  void onDrag(details) {
    // Called on drag update
  }

  void onEndDrag(details) {
    // Called on drag end
  }

  @override
  Widget build(BuildContext context) {
    return new RawGestureDetector(
      gestures: <Type, GestureRecognizerFactory>{
        DelayedMultiDragGestureRecognizer:
            new GestureRecognizerFactoryWithHandlers<
                DelayedMultiDragGestureRecognizer>(
          () => new DelayedMultiDragGestureRecognizer(),
          (DelayedMultiDragGestureRecognizer instance) {
            instance
              ..onStart = (Offset offset) {
                /* More code here */
                return new ItemDrag(onDrag, endDrag);
              };
          },
        ),
      },
    );
  }

ItemDrag 是 Fl​​utter Drag 类的扩展类:

class ItemDrag extends Drag {
  final GestureDragUpdateCallback onUpdate;
  final GestureDragEndCallback onEnd;

  ItemDrag(this.onUpdate, this.onEnd);

  @override
  void update(DragUpdateDetails details) {
    super.update(details);
    onUpdate(details);
  }

  @override
  void end(DragEndDetails details) {
    super.end(details);
    onEnd(details);
  }
}

https://stackoverflow.com/questions/50824208/

相关文章:

flutter - 需要不同屏幕纵横比和纵向和横向模式的聊天屏幕背景图片

firebase - 如何使用 Firebase 在 Flutter 中进行电话身份验证?

android - 如何在 Flutter 中禁用发布版本中的所有日志 [debugPrint()]

android-studio - Flutter - 尝试运行 Flutter 应用程序时模拟器未启

firebase - 如何在 Flutter 中设置不同的 firebase 环境

dart - 使用 Flutter 进行底部导航

flutter - 在 ListView 中的键盘上方滚动 TextFormField

android - Flutter中如何解析json数据并显示在Listview中?

dart - 如何删除 RadioListTile 上的内部填充,以便可以连续使用 3 个 Radi

firebase - flutter |如何将数据添加到 Firestore 中的现有文档