Fix Inverted Horizontal ScrollView on Android (#23233)

Summary:
ScrollView (as well as FlatList) used with horizontal={true} and inverted={true} do not scroll as expected due to a known Android P bug.

Fixes #22710. This is pretty much a clone of PR #21117, applied to a horizontal ScrollView.

[Android] [Fixed] - Fix Inverted Horizontal ScrollView on Android

1. Create a test application with a FlatList with horizontal={true} inverted={true}.
2. Fill it with data
3. Scroll and release your finger
Pull Request resolved: https://github.com/facebook/react-native/pull/23233

Differential Revision: D13915911

Pulled By: cpojer

fbshipit-source-id: d32c82e6d9076f5ffdf342fcd71bd921e9c8a97b
This commit is contained in:
Davide Mainas
2019-02-01 03:59:23 -08:00
committed by Facebook Github Bot
parent e4364faa3c
commit 32cb9ec49c

View File

@@ -286,8 +286,18 @@ public class ReactHorizontalScrollView extends HorizontalScrollView implements
@Override
public void fling(int velocityX) {
// Workaround.
// On Android P if a ScrollView is inverted, we will get a wrong sign for
// velocityX (see https://issuetracker.google.com/issues/112385925).
// At the same time, mOnScrollDispatchHelper tracks the correct velocity direction.
//
// Hence, we can use the absolute value from whatever the OS gives
// us and use the sign of what mOnScrollDispatchHelper has tracked.
final int correctedVelocityX = (int)(Math.abs(velocityX) * Math.signum(mOnScrollDispatchHelper.getXFlingVelocity()));
if (mPagingEnabled) {
flingAndSnap(velocityX);
flingAndSnap(correctedVelocityX);
} else if (mScroller != null) {
// FB SCROLLVIEW CHANGE
@@ -302,7 +312,7 @@ public class ReactHorizontalScrollView extends HorizontalScrollView implements
mScroller.fling(
getScrollX(), // startX
getScrollY(), // startY
velocityX, // velocityX
correctedVelocityX, // velocityX
0, // velocityY
0, // minX
Integer.MAX_VALUE, // maxX
@@ -316,9 +326,9 @@ public class ReactHorizontalScrollView extends HorizontalScrollView implements
// END FB SCROLLVIEW CHANGE
} else {
super.fling(velocityX);
super.fling(correctedVelocityX);
}
handlePostTouchScrolling(velocityX, 0);
handlePostTouchScrolling(correctedVelocityX, 0);
}
@Override