diff --git a/android/src/main/java/com/reactnativepagerview/NestedScrollableHost.kt b/android/src/main/java/com/reactnativepagerview/NestedScrollableHost.kt index 91d99461..87b58d0f 100644 --- a/android/src/main/java/com/reactnativepagerview/NestedScrollableHost.kt +++ b/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) + } }