【问题标题】:How to disable multi-touch in mobile application using flutter如何使用颤振在移动应用程序中禁用多点触控
【发布时间】:2019-01-13 16:31:12
【问题描述】:

这个问题纯粹是基于GestureDetectorflutter。

例如:在应用程序中,GestureDetector 类被实现,所以这里默认它支持多点触控,现在需要禁用这个多点触控,这可能是最好的解决方案。

GestureDetector参考链接:https://docs.flutter.io/flutter/widgets/GestureDetector-class.html

【问题讨论】:

标签: dart flutter multi-touch


【解决方案1】:

创建OnlyOnePointerRecognizerWidget 小部件的实例并将任何小部件作为子级传递给它。 OnlyOnePointerRecognizerWidget 只会识别一个指针。

import 'package:flutter/material.dart';
import 'package:flutter/gestures.dart';

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

【讨论】:

  • 绝对是最佳答案。
【解决方案2】:

使用 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。您需要创建一个实例化 MultiDragGestureRecognizer 的 StatefulWidget,然后让您的构建函数有一个侦听器,将 onPointerDown 事件路由到识别器。 我们可能会将该识别器添加到 GestureDetector 本身,或者提供一个包装该识别器的小部件,如果这是人们经常做的事情。 更重要的是,我们可能应该记录这一点。为此,我将打开此错误。 flutter gestures library

    【讨论】:

    • 此解决方案可能会有所帮助如果我会使用本机 android 代码,但您能否给我一个解决方案,说明如何在手势检测器颤动中停止多点触控。
    • @KarimMirazul 你想检测什么手势?
    • 我已经为绘图应用程序实现了gestureDetector,现在我想禁用多点触控功能。
    • @KarimMirazul 使用 MultiTapGestureRecognizer 和
    • @KarimMirazul MultiDragReconfinzer
    猜你喜欢
    • 2019-02-02
    • 1970-01-01
    • 2011-11-03
    • 1970-01-01
    • 2018-12-16
    • 1970-01-01
    • 2018-11-07
    • 2016-05-13
    • 2010-11-07
    相关资源
    最近更新 更多