105 lines
2.5 KiB
Dart
105 lines
2.5 KiB
Dart
import 'package:flutter/gestures.dart';
|
|
|
|
class MultiTouchGestureRecognizer extends MultiTapGestureRecognizer {
|
|
MultiTouchGestureRecognizerCallback onMultiTap;
|
|
var numberOfTouches = 0;
|
|
|
|
MultiTouchGestureRecognizer() {
|
|
this
|
|
..onTapDown = addTouch
|
|
..onTapUp = removeTouch
|
|
..onTapCancel = cancelTouch
|
|
..onTap = captureDefaultTap;
|
|
}
|
|
|
|
void addTouch(int pointer, TapDownDetails details) {
|
|
numberOfTouches++;
|
|
onMultiTap(numberOfTouches, true);
|
|
}
|
|
|
|
void removeTouch(int pointer, TapUpDetails details) {
|
|
numberOfTouches--;
|
|
onMultiTap(numberOfTouches, false);
|
|
}
|
|
|
|
void cancelTouch(int pointer) {
|
|
numberOfTouches = 0;
|
|
}
|
|
|
|
void captureDefaultTap(int pointer) {}
|
|
}
|
|
|
|
typedef MultiTouchGestureRecognizerCallback = void Function(
|
|
int touchCount, bool addOrRemove);
|
|
|
|
typedef OnUpdate(DragUpdateDetails details);
|
|
|
|
class CustomMultiDrag extends Drag {
|
|
CustomMultiDrag({this.events, this.offset});
|
|
|
|
List<PointerDownEvent> events;
|
|
Offset offset;
|
|
|
|
@override
|
|
void update(DragUpdateDetails details) {
|
|
var n = events.length;
|
|
print('$n $details');
|
|
}
|
|
|
|
@override
|
|
void end(DragEndDetails details) {
|
|
super.end(details);
|
|
}
|
|
}
|
|
|
|
typedef OnDisposeState();
|
|
|
|
// clone _ImmediatePointerState
|
|
class CustomPointerState extends MultiDragPointerState {
|
|
final OnDisposeState onDisposeState;
|
|
CustomPointerState(Offset initialPosition, PointerDeviceKind kind,
|
|
{this.onDisposeState})
|
|
: super(initialPosition, kind);
|
|
|
|
@override
|
|
void checkForResolutionAfterMove() {
|
|
assert(pendingDelta != null);
|
|
if (pendingDelta.distance > computeHitSlop(kind))
|
|
resolve(GestureDisposition.accepted);
|
|
}
|
|
|
|
@override
|
|
void accepted(GestureMultiDragStartCallback starter) {
|
|
starter(initialPosition);
|
|
}
|
|
|
|
@override
|
|
void dispose() {
|
|
onDisposeState.call();
|
|
super.dispose();
|
|
}
|
|
}
|
|
|
|
// clone ImmediateMultiDragGestureRecognizer
|
|
class CustomMultiDragGestureRecognizer
|
|
extends MultiDragGestureRecognizer<CustomPointerState> {
|
|
var events = List<PointerDownEvent>();
|
|
|
|
/// Create a gesture recognizer for tracking multiple pointers at once.
|
|
CustomMultiDragGestureRecognizer({
|
|
Object debugOwner,
|
|
PointerDeviceKind kind,
|
|
}) : super(debugOwner: debugOwner, kind: kind);
|
|
|
|
@override
|
|
CustomPointerState createNewPointerState(PointerDownEvent event) {
|
|
events.add(event);
|
|
return CustomPointerState(event.position, event.kind, onDisposeState: () {
|
|
events.remove(event);
|
|
});
|
|
}
|
|
|
|
@override
|
|
String get debugDescription => 'custom_multidrag';
|
|
}
|