Skip to content

Commit

Permalink
Fix Android HorizontalScrollView fling when content length less than …
Browse files Browse the repository at this point in the history
…ScrollView length (#43563)

Summary:
Pull Request resolved: #43563

Fixes #42874

## Sumary

D9405703 added some custom logic for Flings, to support FlatList scenarios where content is being added on the fly, during Fling animation. This works by allowing start Fling to not have bounds, then correcting/cancelling Fling when overscroll happens over a bound that would normally be allowed.

This has some math to try to determine max content length, and will clamp to this when scrolling over it. This logic is incorrect when content length is less than scrollview length, and we end up snapping to a negative offset.

This change adds clamping, so that we don't snap to negative position in horizontal scroll view. This clamping was already indirectly present on vertical scroll view. https://www.internalfb.com/code/fbsource/[b43cdf9b2fec71f5341ec8ff2d47e28a066f052e]/xplat/js/react-native-github/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java?lines=609

## Test Plan

Above issue no longer reproes. Flinging while content is being added to horizontal FlatList still works correctly.

Changelog:
[Android][Fixed] - Fix Android HorizontalScrollView fling when content length less than ScrollView length

Reviewed By: javache

Differential Revision: D55108818

fbshipit-source-id: 7cf0065f9f92832cc2606d1c7534fc150407b9c9
  • Loading branch information
NickGerleman authored and facebook-github-bot committed Mar 21, 2024
1 parent 623bbe6 commit 7d180d7
Showing 1 changed file with 1 addition and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -808,7 +808,7 @@ protected void onOverScrolled(int scrollX, int scrollY, boolean clampedX, boolea
// more information.

if (!mScroller.isFinished() && mScroller.getCurrX() != mScroller.getFinalX()) {
int scrollRange = computeHorizontalScrollRange() - getWidth();
int scrollRange = Math.max(computeHorizontalScrollRange() - getWidth(), 0);
if (scrollX >= scrollRange) {
mScroller.abortAnimation();
scrollX = scrollRange;
Expand Down

0 comments on commit 7d180d7

Please sign in to comment.