Skip to content

Commit 2142a8c

Browse files
committed
Always cancel scheduled press out
1 parent fdcc8cc commit 2142a8c

3 files changed

Lines changed: 9 additions & 7 deletions

File tree

packages/react-native-gesture-handler/android/src/main/java/com/swmansion/gesturehandler/react/RNGestureHandlerButtonViewManager.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,7 @@ class RNGestureHandlerButtonViewManager :
535535
}
536536

537537
private fun animatePressOut() {
538+
pendingPressOut?.let { handler.removeCallbacks(it) }
538539
val elapsed = SystemClock.uptimeMillis() - pressInTimestamp
539540

540541
if (elapsed >= pressAndHoldAnimationDuration) {
@@ -544,7 +545,6 @@ class RNGestureHandlerButtonViewManager :
544545
animateTo(defaultOpacity, defaultScale, defaultUnderlayOpacity, elapsed)
545546
} else {
546547
val remaining = tapAnimationDuration - elapsed
547-
pendingPressOut?.let { handler.removeCallbacks(it) }
548548
animateTo(activeOpacity, activeScale, activeUnderlayOpacity, remaining)
549549

550550
val runnable = Runnable {

packages/react-native-gesture-handler/apple/RNGestureHandlerButton.mm

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -275,6 +275,10 @@ - (void)handleAnimatePressIn
275275

276276
- (void)handleAnimatePressOut
277277
{
278+
if (_pendingPressOutBlock) {
279+
dispatch_block_cancel(_pendingPressOutBlock);
280+
}
281+
278282
NSTimeInterval elapsed = (CACurrentMediaTime() - _pressInTimestamp) * 1000.0;
279283
NSInteger pressAndHoldAnimationDuration = self.pressAndHoldAnimationDuration;
280284

@@ -296,9 +300,7 @@ - (void)handleAnimatePressOut
296300
} else {
297301
// Before minimum duration, finish press-in in remaining time then animate out in minDuration
298302
NSTimeInterval remaining = _tapAnimationDuration - elapsed;
299-
if (_pendingPressOutBlock) {
300-
dispatch_block_cancel(_pendingPressOutBlock);
301-
}
303+
302304
RNGHUIView *target = self.animationTarget ?: self;
303305
[self animateTarget:target toOpacity:_activeOpacity scale:_activeScale duration:remaining];
304306
if (_activeUnderlayOpacity != _defaultUnderlayOpacity) {

packages/react-native-gesture-handler/src/components/GestureHandlerButton.web.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,9 @@ export const ButtonComponent = ({
6565
}, [enabled, pressAndHoldAnimationDuration]);
6666

6767
const pressOut = React.useCallback(() => {
68+
if (pressOutTimer.current != null) {
69+
clearTimeout(pressOutTimer.current);
70+
}
6871
const elapsed = Date.now() - pressInTimestamp.current;
6972

7073
if (elapsed >= pressAndHoldAnimationDuration) {
@@ -77,9 +80,6 @@ export const ButtonComponent = ({
7780
} else {
7881
// Let the in-progress CSS press-in transition continue; schedule press-out after remaining time
7982
const remaining = tapAnimationDuration - elapsed;
80-
if (pressOutTimer.current != null) {
81-
clearTimeout(pressOutTimer.current);
82-
}
8383
pressOutTimer.current = setTimeout(() => {
8484
pressOutTimer.current = null;
8585
setCurrentDuration(tapAnimationDuration);

0 commit comments

Comments
 (0)