From 9d095c16ee16178c5d4e4bc7d95d935de4b6c507 Mon Sep 17 00:00:00 2001 From: xiaodong <450468291@qq.com> Date: Sat, 14 Mar 2020 21:51:57 +0800 Subject: [PATCH] =?UTF-8?q?[plcs#8888]=20=E5=8D=95=E7=82=B9=E8=A7=A6?= =?UTF-8?q?=E6=91=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/widget/only_one_pointer_widget.dart | 55 +++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 lib/widget/only_one_pointer_widget.dart diff --git a/lib/widget/only_one_pointer_widget.dart b/lib/widget/only_one_pointer_widget.dart new file mode 100644 index 0000000..32ff7c9 --- /dev/null +++ b/lib/widget/only_one_pointer_widget.dart @@ -0,0 +1,55 @@ +import 'package:flutter/material.dart'; +import 'package:flutter/gestures.dart'; + +/** + * 单点触摸的方案:https://xbuba.com/questions/51712287 + */ +class OnlyOnePointerRecognizer extends OneSequenceGestureRecognizer { + int _p = 0; + + @override + void addAllowedPointer(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: { + OnlyOnePointerRecognizer: + GestureRecognizerFactoryWithHandlers( + () => OnlyOnePointerRecognizer(), + (OnlyOnePointerRecognizer instance) { + + }, + ), + }, + child: child, + ); + } +}