Skip to content

Commit

Permalink
Fix Inverted Horizontal ScrollView on Android (facebook#23233)
Browse files Browse the repository at this point in the history
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 facebook#22710. This is pretty much a clone of PR facebook#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: facebook#23233

Differential Revision: D13915911

Pulled By: cpojer

fbshipit-source-id: d32c82e6d9076f5ffdf342fcd71bd921e9c8a97b
  • Loading branch information
dmainas authored and facebook-github-bot committed Feb 1, 2019
1 parent 2d4afc1 commit bb8c014
Showing 1 changed file with 14 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -286,8 +286,18 @@ public boolean onTouchEvent(MotionEvent ev) {

@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

Expand All @@ -302,7 +312,7 @@ public void fling(int velocityX) {
mScroller.fling(
getScrollX(), // startX
getScrollY(), // startY
velocityX, // velocityX
correctedVelocityX, // velocityX
0, // velocityY
0, // minX
Integer.MAX_VALUE, // maxX
Expand All @@ -316,9 +326,9 @@ public void fling(int velocityX) {

// END FB SCROLLVIEW CHANGE
} else {
super.fling(velocityX);
super.fling(correctedVelocityX);
}
handlePostTouchScrolling(velocityX, 0);
handlePostTouchScrolling(correctedVelocityX, 0);
}

@Override
Expand Down

0 comments on commit bb8c014

Please sign in to comment.