mirror of
https://github.com/zhigang1992/react-native.git
synced 2026-04-23 20:01:01 +08:00
Workaround a wrong fling direction for inverted ScrollViews on Android P (#21117)
Summary: This is a safe workaround to an issue in Android P: https://issuetracker.google.com/issues/112385925 It is based on a fact that even though `fling` receive a wrong sign in `velocityY`, `mOnScrollDispatchHelper.getYFlingVelocity()` still returns a fling direction. Fixes #19434 Pull Request resolved: https://github.com/facebook/react-native/pull/21117 Differential Revision: D13082740 Pulled By: hramos fbshipit-source-id: 1b28586d2c7bdcae4a111d3cead4a0455cebb99a
This commit is contained in:
committed by
Facebook Github Bot
parent
984eef8f9e
commit
b971c5beb8
@@ -309,8 +309,18 @@ public class ReactScrollView extends ScrollView implements ReactClippingViewGrou
|
||||
|
||||
@Override
|
||||
public void fling(int velocityY) {
|
||||
// Workaround.
|
||||
// On Android P if a ScrollView is inverted, we will get a wrong sign for
|
||||
// velocityY (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 correctedVelocityY = (int)(Math.abs(velocityY) * Math.signum(mOnScrollDispatchHelper.getYFlingVelocity()));
|
||||
|
||||
|
||||
if (mPagingEnabled) {
|
||||
flingAndSnap(velocityY);
|
||||
flingAndSnap(correctedVelocityY);
|
||||
} else if (mScroller != null) {
|
||||
// FB SCROLLVIEW CHANGE
|
||||
|
||||
@@ -326,7 +336,7 @@ public class ReactScrollView extends ScrollView implements ReactClippingViewGrou
|
||||
getScrollX(), // startX
|
||||
getScrollY(), // startY
|
||||
0, // velocityX
|
||||
velocityY, // velocityY
|
||||
correctedVelocityY, // velocityY
|
||||
0, // minX
|
||||
0, // maxX
|
||||
0, // minY
|
||||
@@ -339,9 +349,9 @@ public class ReactScrollView extends ScrollView implements ReactClippingViewGrou
|
||||
|
||||
// END FB SCROLLVIEW CHANGE
|
||||
} else {
|
||||
super.fling(velocityY);
|
||||
super.fling(correctedVelocityY);
|
||||
}
|
||||
handlePostTouchScrolling(0, velocityY);
|
||||
handlePostTouchScrolling(0, correctedVelocityY);
|
||||
}
|
||||
|
||||
private void enableFpsListener() {
|
||||
|
||||
Reference in New Issue
Block a user