Я создаю холст для рисования с флаттером, для которого я хочу использовать жесты масштаба (для масштабирования, панорамирования и вращения) и панорамирования (для рисования пальцами), но флаттер не позволяет этого, так как Масштаб является надмножеством панорамирования. , Есть ли обходной путь для этого?
Я попытался создать свой собственный распознаватель жестов для определения количества указателей на экране, чтобы, если два указателя соприкасались с экраном в течение короткого промежутка времени (давайте скажем, 1 секунду) Масштаб берет на себя, иначе панорамирование начинает работать с 1-го указателя, который коснулся экрана. Я использую пакет matrix_gesture_detector для масштабирования.
Вот мой код для распознавателя пользовательских жестов
class ScaleAndPanRecognizer extends OneSequenceGestureRecognizer {
var manager = GestureArenaManager();
final Function onPanDown;
final Function onPanUpdate;
final Function onPanEnd;
ScaleAndPanRecognizer({
@required this.onPanDown,
@required this.onPanUpdate,
@required this.onPanEnd,
});
int numPointers = 0;
int timeFrame = 1;
int pointer1;
int pointer2;
var time1;
var time2;
var position1;
@override
void addPointer(PointerDownEvent event) {
print(numPointers);
if (numPointers == 0) {
pointer1 = event.pointer;
print(pointer1);
position1 = event.localPosition;
manager.hold(pointer1); //hold the assignment for this pointer for now
startTrackingPointer(pointer1);
numPointers += 1;
time1 = DateTime.now();
} else if (numPointers == 1) {
pointer2 = event.pointer;
print(pointer2);
resolvePointer(pointer2, GestureDisposition.rejected);
time2 = DateTime.now();
var diff = time2.difference(time1);
print(diff);
if (diff <= Duration(seconds: timeFrame)) {
manager.release(pointer1);
resolvePointer(pointer1, GestureDisposition.rejected);
} else {
resolvePointer(pointer1, GestureDisposition.accepted);
manager.release(pointer1);
onPanDown(position1);
}
numPointers = 0;
}
}
@override
void handleEvent(PointerEvent event) {
if (event is PointerMoveEvent) {
onPanUpdate(event.localPosition);
}
if (event is PointerUpEvent) {
onPanEnd();
stopTrackingPointer(event.pointer);
}
}
@override
String get debugDescription => 'only one pointer recognizer';
@override
void didStopTrackingLastPointer(int pointer) {}
}