mirror of
https://github.com/bggRGjQaUbCoE/PiliPlus.git
synced 2026-05-19 23:54:01 +08:00
@@ -1,5 +1,7 @@
|
||||
import 'package:flutter/gestures.dart';
|
||||
import 'package:flutter/material.dart' show TransformationController;
|
||||
|
||||
typedef IsBoundaryAllowed =
|
||||
bool Function(Offset? initialPosition, OffsetPair lastPosition);
|
||||
|
||||
class ImageHorizontalDragGestureRecognizer
|
||||
extends HorizontalDragGestureRecognizer {
|
||||
@@ -7,14 +9,22 @@ class ImageHorizontalDragGestureRecognizer
|
||||
super.debugOwner,
|
||||
super.supportedDevices,
|
||||
super.allowedButtonsFilter,
|
||||
required this.width,
|
||||
required this.transformationController,
|
||||
});
|
||||
|
||||
Offset? _initialPosition;
|
||||
|
||||
double width;
|
||||
final TransformationController transformationController;
|
||||
IsBoundaryAllowed? isBoundaryAllowed;
|
||||
|
||||
int? _pointer;
|
||||
|
||||
@override
|
||||
void addPointer(PointerDownEvent event) {
|
||||
if (_pointer == event.pointer) {
|
||||
return;
|
||||
}
|
||||
_pointer = event.pointer;
|
||||
super.addPointer(event);
|
||||
}
|
||||
|
||||
@override
|
||||
void addAllowedPointer(PointerDownEvent event) {
|
||||
@@ -22,24 +32,6 @@ class ImageHorizontalDragGestureRecognizer
|
||||
_initialPosition = event.position;
|
||||
}
|
||||
|
||||
bool _isBoundaryAllowed() {
|
||||
if (_initialPosition == null) {
|
||||
return true;
|
||||
}
|
||||
final storage = transformationController.value.storage;
|
||||
final scale = storage[0];
|
||||
if (scale <= 1.0) {
|
||||
return true;
|
||||
}
|
||||
final double xOffset = storage[12];
|
||||
final double boundaryEnd = width * scale;
|
||||
final int xPos = (boundaryEnd + xOffset).round();
|
||||
return (boundaryEnd.round() == xPos &&
|
||||
lastPosition.global.dx > _initialPosition!.dx) ||
|
||||
(width.round() == xPos &&
|
||||
lastPosition.global.dx < _initialPosition!.dx);
|
||||
}
|
||||
|
||||
@override
|
||||
bool hasSufficientGlobalDistanceToAccept(
|
||||
PointerDeviceKind pointerDeviceKind,
|
||||
@@ -47,6 +39,12 @@ class ImageHorizontalDragGestureRecognizer
|
||||
) {
|
||||
return globalDistanceMoved.abs() >
|
||||
computeHitSlop(pointerDeviceKind, gestureSettings) &&
|
||||
_isBoundaryAllowed();
|
||||
(isBoundaryAllowed?.call(_initialPosition, lastPosition) ?? true);
|
||||
}
|
||||
|
||||
@override
|
||||
void dispose() {
|
||||
isBoundaryAllowed = null;
|
||||
super.dispose();
|
||||
}
|
||||
}
|
||||
|
||||
23
lib/common/widgets/gesture/image_tap_gesture_recognizer.dart
Normal file
23
lib/common/widgets/gesture/image_tap_gesture_recognizer.dart
Normal file
@@ -0,0 +1,23 @@
|
||||
import 'package:flutter/gestures.dart'
|
||||
show TapGestureRecognizer, PointerDownEvent;
|
||||
|
||||
class ImageTapGestureRecognizer extends TapGestureRecognizer {
|
||||
ImageTapGestureRecognizer({
|
||||
super.debugOwner,
|
||||
super.supportedDevices,
|
||||
super.allowedButtonsFilter,
|
||||
super.preAcceptSlopTolerance,
|
||||
super.postAcceptSlopTolerance,
|
||||
});
|
||||
|
||||
int? _pointer;
|
||||
|
||||
@override
|
||||
void addPointer(PointerDownEvent event) {
|
||||
if (_pointer == event.pointer) {
|
||||
return;
|
||||
}
|
||||
_pointer = event.pointer;
|
||||
super.addPointer(event);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user