-
Notifications
You must be signed in to change notification settings - Fork 1.9k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
[Android] Fix taps triggering while swiping (#7459)
* [Android] Fix taps triggering while swiping * Revert "[Android] Try to disambiguate taps from swipes (#7448)" This reverts commit 96054f4. * Update patch to match callstack/react-native-pager-view#961 * Make it symmetrical --------- Co-authored-by: Dan Abramov <[email protected]>
- Loading branch information
Showing
2 changed files
with
74 additions
and
40 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,72 @@ | ||
diff --git a/node_modules/react-native-pager-view/android/build/tmp/kotlin-classes/debug/com/reactnativepagerview/NestedScrollableHost.class b/node_modules/react-native-pager-view/android/build/tmp/kotlin-classes/debug/com/reactnativepagerview/NestedScrollableHost.class | ||
new file mode 100644 | ||
index 0000000..b64fccc | ||
Binary files /dev/null and b/node_modules/react-native-pager-view/android/build/tmp/kotlin-classes/debug/com/reactnativepagerview/NestedScrollableHost.class differ | ||
diff --git a/node_modules/react-native-pager-view/android/src/main/java/com/reactnativepagerview/NestedScrollableHost.kt b/node_modules/react-native-pager-view/android/src/main/java/com/reactnativepagerview/NestedScrollableHost.kt | ||
index 91d9946..87b58d0 100644 | ||
--- a/node_modules/react-native-pager-view/android/src/main/java/com/reactnativepagerview/NestedScrollableHost.kt | ||
+++ b/node_modules/react-native-pager-view/android/src/main/java/com/reactnativepagerview/NestedScrollableHost.kt | ||
@@ -8,6 +8,7 @@ import android.view.ViewConfiguration | ||
import android.widget.FrameLayout | ||
import androidx.viewpager2.widget.ViewPager2 | ||
import androidx.viewpager2.widget.ViewPager2.ORIENTATION_HORIZONTAL | ||
+import com.facebook.react.uimanager.events.NativeGestureUtil | ||
import kotlin.math.absoluteValue | ||
import kotlin.math.sign | ||
|
||
@@ -27,6 +28,7 @@ class NestedScrollableHost : FrameLayout { | ||
private var touchSlop = 0 | ||
private var initialX = 0f | ||
private var initialY = 0f | ||
+ private var nativeGestureStarted: Boolean = false | ||
private val parentViewPager: ViewPager2? | ||
get() { | ||
var v: View? = parent as? View | ||
@@ -57,17 +59,14 @@ class NestedScrollableHost : FrameLayout { | ||
} | ||
|
||
private fun handleInterceptTouchEvent(e: MotionEvent) { | ||
- val orientation = parentViewPager?.orientation ?: return | ||
- | ||
- // Early return if child can't scroll in same direction as parent | ||
- if (!canChildScroll(orientation, -1f) && !canChildScroll(orientation, 1f)) { | ||
- return | ||
- } | ||
+ val orientation = parentViewPager?.orientation | ||
|
||
if (e.action == MotionEvent.ACTION_DOWN) { | ||
initialX = e.x | ||
initialY = e.y | ||
- parent.requestDisallowInterceptTouchEvent(true) | ||
+ if (orientation != null) { | ||
+ parent.requestDisallowInterceptTouchEvent(true) | ||
+ } | ||
} else if (e.action == MotionEvent.ACTION_MOVE) { | ||
val dx = e.x - initialX | ||
val dy = e.y - initialY | ||
@@ -78,6 +77,10 @@ class NestedScrollableHost : FrameLayout { | ||
val scaledDy = dy.absoluteValue * if (isVpHorizontal) 1f else .5f | ||
|
||
if (scaledDx > touchSlop || scaledDy > touchSlop) { | ||
+ NativeGestureUtil.notifyNativeGestureStarted(this, e) | ||
+ nativeGestureStarted = true | ||
+ | ||
+ if (orientation == null) return | ||
if (isVpHorizontal == (scaledDy > scaledDx)) { | ||
// Gesture is perpendicular, allow all parents to intercept | ||
parent.requestDisallowInterceptTouchEvent(false) | ||
@@ -94,4 +97,14 @@ class NestedScrollableHost : FrameLayout { | ||
} | ||
} | ||
} | ||
+ | ||
+ override fun onTouchEvent(e: MotionEvent): Boolean { | ||
+ if (e.actionMasked == MotionEvent.ACTION_UP) { | ||
+ if (nativeGestureStarted) { | ||
+ NativeGestureUtil.notifyNativeGestureEnded(this, e) | ||
+ nativeGestureStarted = false | ||
+ } | ||
+ } | ||
+ return super.onTouchEvent(e) | ||
+ } | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters