Флаттер - несколько жестов без поднятия пальца - PullRequest
0 голосов
/ 12 июня 2018

Я пытаюсь создать следующий эффект: когда пользователь долго нажимает на пустой экран, появляется прямоугольник.Не поднимая палец, я хочу, чтобы пользователь мог перетаскивать один из краев прямоугольника (например, по вертикали).

Я могу добиться этих эффектов отдельно (долгое нажатие, отпускание, перетаскивание), но мне нужно иметь их, не поднимая палец.

В настоящее время мой код выглядит следующим образом:

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

Это обеспечивает перетаскивание края и основано на этомучебное пособие .

Чтобы элемент отображался при долгом нажатии, я использую виджет 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,
          ),
        ),
      ),
    );
  }

1 Ответ

0 голосов
/ 17 июля 2018

Если кому-то все еще интересно, я смог добиться желаемого поведения с помощью класса DelayedMultiDragGestureRecognizer.

Код выглядит так:

@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 - этокласс, расширяющий класс Flutter 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);
  }
}
...