如何使用flutter禁用移动应用程序中的多点触摸



此问题纯粹基于GestureDetector颤振。

例如:在应用程序中,实现了GestureDetector类,因此默认情况下它支持多点触摸,现在需要禁用这种多点触摸功能,这样才是最好的解决方案。

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

创建一个OnlyOnePointerRecognizerWidget小部件的实例,并将任何小部件作为子对象传递给它。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')
)

使用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(){}
}

听起来你想要一个MultiDragGestureRecognizer。您需要创建一个StatefulWidget来实例化MultiDragGestureRecognizer,然后让您的构建函数有一个Listener来将onPointerDown事件路由到识别器。我们可能会将该识别器添加到GestureDetector本身,或者提供一个封装该识别器的小部件,如果这是人们经常做的事情的话。更重要的是,我们可能应该记录这一点。为了这个目的,我将打开这个bug。颤振姿态库

最新更新