如何在使用Flutter的移动应用中禁用多点触控

12
这个问题纯粹基于Flutter中的GestureDetector。例如,在应用程序中,实现了GestureDetector类,因此默认情况下它支持多点触控,现在需要禁用这种多点触控,那么最好的解决方案是什么?GestureDetector参考链接:https://docs.flutter.io/flutter/widgets/GestureDetector-class.html

阅读此教程 - Roman Soviak
1
@user7856586 - 该教程是从 StackOverflow 上的一个问题创建的(在文章末尾列出了它作为参考)。 - tim-montague
3个回答

29
创建一个 OnlyOnePointerRecognizerWidget 实例,并将任何 Widget 作为其子对象传递给它。 OnlyOnePointerRecognizerWidget 将只识别一个指针。
import 'package:flutter/material.dart' show
  StatelessWidget, Widget, BuildContext, RawGestureDetector,
  GestureRecognizerFactory, GestureRecognizerFactoryWithHandlers
;
import 'package:flutter/gestures.dart' show
  OneSequenceGestureRecognizer, PointerDownEvent, GestureDisposition,
  PointerEvent
;
    
class OnlyOnePointerRecognizer extends OneSequenceGestureRecognizer {
  int _p = 0;

  @override
  void addPointer(PointerDownEvent event) {
    startTrackingPointer(event.pointer);

    if (_p == 0) {
      resolve(GestureDisposition.rejected);
      _p = event.pointer;
    } else {
      resolve(GestureDisposition.accepted);
    }
  }
    
  @override
  String get debugDescription => 'only one pointer recognizer';
    
  @override
  void didStopTrackingLastPointer(int pointer) {}
    
  @override
  void handleEvent(PointerEvent event) {
    if (!event.down && event.pointer == _p) {
      _p = 0;
    }
  }
}
    
class OnlyOnePointerRecognizerWidget extends StatelessWidget {
  final Widget? child;

  OnlyOnePointerRecognizerWidget({ this.child });

  @override
  Widget build(BuildContext context) {
    return RawGestureDetector(
      gestures: <Type, GestureRecognizerFactory>{
        OnlyOnePointerRecognizer: GestureRecognizerFactoryWithHandlers<OnlyOnePointerRecognizer>(
          () => OnlyOnePointerRecognizer(),
          (OnlyOnePointerRecognizer instance) {}
        )
      },
      child: child
    );
  }
}

实现示例:

OnlyOnePointerRecognizerWidget(
  child: Text('test')
)

3
绝对是最佳答案。 - Daniel Oliveira
需要写40行代码才能禁用多点触控?难道没有现成的包吗? - tim-montague
2
@tim-montague 我猜包里的代码行数会比40多一点 :) - Igor Gor
@IgorGor 有没有办法重新启用我已经禁用了的小部件的子级别的多点触控功能? - Ryan Heitner
@Ryan Heitner 我认为最好的方法是检查屏幕是否需要多点触控,然后相应地将其包装在 onlyOnePointerRecognizer 中。 - Igor Gor

5
使用ImmediateMultiDragGestureRecognizer()修复了问题,下面的代码展示了我们如何使用它。
child: RawGestureDetector(
              behavior: HitTestBehavior.opaque,
              gestures: <Type, GestureRecognizerFactory>{
                ImmediateMultiDragGestureRecognizer:
                    GestureRecognizerFactoryWithHandlers<
                        ImmediateMultiDragGestureRecognizer>(
                  () => ImmediateMultiDragGestureRecognizer(),
                  (ImmediateMultiDragGestureRecognizer instance) {
                    instance..onStart = _handleOnStart;
                  },
                ),
              },
    Drag _handleOnStart(Offset position) {
   if (count < 1) {
     setState(() {
       count++;
     });
     return _DragHandler(_handleDragUpdate, _handleDragEnd);
}
return null;
  }

  void _handleDragUpdate(DragUpdateDetails update) {
    //code is here
  }

  void _handleDragEnd(DragEndDetails details) {
    //code is here
   }
   setState(() {
    count = 0;
   });
   }


   class _DragHandler extends Drag {
  _DragHandler(this.onUpdate, this.onEnd);

  final GestureDragUpdateCallback onUpdate;
  final GestureDragEndCallback onEnd;

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

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

3
看起来你需要一个 MultiDragGestureRecognizer,你需要创建一个 StatefulWidget 来实例化 MultiDragGestureRecognizer,然后在 build function 中添加 Listener,将 onPointerDown 事件路由到识别器。 如果这是人们经常使用的功能,我们可能可以将该识别器添加到 GestureDetector 本身中,或者提供一个包装该识别器的小部件。 更重要的是,我们应该记录这一点。为此目的,我将保留此 bug。 flutter 手势库

这个解决方案可能对我使用原生Android代码有所帮助,但是你能否给我一个解决方案,如何在GestureDetector Flutter中停止多点触控。 - Karim Mirazul
@KarimMirazul,您想检测什么手势? - Saige Zhang
我已经为绘图应用程序实现了gestureDetector,现在我想禁用多点触控功能。 - Karim Mirazul
@KarimMirazul 使用MultiTapGestureRecognizer和 - Saige Zhang
@KarimMirazul MultiDragReconfinzer - Saige Zhang

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接