Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix scrollview momentum not stopping on scrollTo/scrollToEnd for horizontal scrollviews #39529

Closed
wants to merge 2 commits into from
Closed

Fix scrollview momentum not stopping on scrollTo/scrollToEnd for horizontal scrollviews #39529

wants to merge 2 commits into from

Conversation

Almouro
Copy link
Contributor

@Almouro Almouro commented Sep 19, 2023

Summary:

Motivation

My main motivation for this is using nested horizontal Flashlists inside a vertical Flashlist.
Like a RecyclerView, since my horizontal lists get recycled, if I scroll say the first horizontal list and scroll down, then when this list gets recycled it continues scrolling even if the content is new:

nested-list-recycling

To handle this, I want to call scrollTo everytime a new row appears to reset the scroll offset, however I've realized this doesn't stop the scroll momentum

The bug

When scrolling and calling scrollTo, scroll momentum should be stopped and we should scroll to where scrollTo asked for.
All credit goes to @tomekzaw for #36104 who fixed it for vertical scrollviews

I realized we had the same issue for

  • horizontal scroll views
  • when calling scrollToEnd
Vertical scrollview (working ✅) Horizontal scrollview (before fix, not stopping ❌) Horizontal scrollview (after fix ✅)
vertical-scrolltoffset-working horizontal-scrolloffset-bug horizontal-scrolloffset-fixed

Based on #38728 I kept all those calls to abortAnimation on the View Manager

Changelog:

[ANDROID] [FIXED] - Fixed horizontal ScrollView momentum not stopping when calling scrollTo programmatically
[ANDROID] [FIXED] - Fixed ScrollView momentum not stopping when calling scrollToEnd programmatically

Test Plan:

My test code is this
Basically:

  • a scrollview with a few elements
  • some buttons to trigger a scrollTo

To reproduce the bug, I scroll then click one of the buttons triggering a scrollTo

I added react-native@nightly to my project, and copy pasted packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll folder from this branch to try out my fixes

Then tested the following scenarios on Android:

List layout Method Not animated Animated
horizontal scrollTo horizontal-scrollTo-no horizontal-scrollto-yes
horizontal scrollToEnd horizontal-scrolltoend-no horizontal-scrolltoend-yes
vertical scrollTo vertical-scrollto-no vertical-scrollto-yes
vertical scrollToEnd vertical-scrolltoend-no vertical-scrolltoend-yes

@facebook-github-bot facebook-github-bot added CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. Shared with Meta Applied via automation to indicate that an Issue or Pull Request has been shared with the team. labels Sep 19, 2023
@analysis-bot
Copy link

analysis-bot commented Sep 19, 2023

Platform Engine Arch Size (bytes) Diff
android hermes arm64-v8a 8,333,652 -31
android hermes armeabi-v7a n/a --
android hermes x86 n/a --
android hermes x86_64 n/a --
android jsc arm64-v8a 9,573,367 +87
android jsc armeabi-v7a n/a --
android jsc x86 n/a --
android jsc x86_64 n/a --

Base commit: 3b5bea0
Branch: main

@github-actions
Copy link

github-actions bot commented Sep 19, 2023

Warnings
⚠️ One hour and a half have passed and the E2E jobs haven't finished yet.

Generated by 🚫 dangerJS against 6b6c066

@lunaleaps
Copy link
Contributor

This makes sense to me! Is there something we can add to RNTester to showcase the behavior?

@lunaleaps lunaleaps self-assigned this Sep 19, 2023
@facebook-github-bot
Copy link
Contributor

@ryancat has imported this pull request. If you are a Meta employee, you can view this diff on Phabricator.

@Almouro
Copy link
Contributor Author

Almouro commented Sep 20, 2023

@lunaleaps I'm realizing there was already an example for this inside the RN Tester, I hadn't thought to check 😅

Before fix ❌ After fix ✅
rntester-beforefix rntester-afterfix

@facebook-github-bot facebook-github-bot added the Merged This PR has been merged. label Sep 20, 2023
@facebook-github-bot
Copy link
Contributor

@ryancat merged this pull request in 2f86aaf.

ShevO27 pushed a commit to ShevO27/react-native that referenced this pull request Sep 26, 2023
…zontal scrollviews (facebook#39529)

Summary:
### Motivation
My main motivation for this is using nested horizontal `Flashlists` inside a vertical `Flashlist`.
Like a `RecyclerView`, since my horizontal lists get recycled, if I scroll say the first horizontal list and scroll down, then when this list gets recycled it continues scrolling even if the content is new:

![nested-list-recycling](https://github.com/facebook/react-native/assets/4534323/f75a2a9b-6ab5-4554-811f-8d85ddfb81de)

To handle this, I want to call `scrollTo` everytime a new row appears to reset the scroll offset, however I've realized this doesn't stop the scroll momentum

### The bug

When scrolling and calling `scrollTo`, scroll momentum should be stopped and we should scroll to where `scrollTo` asked for.
All credit goes to tomekzaw for facebook#36104 who fixed it for vertical scrollviews

I realized we had the same issue for
- horizontal scroll views
- when calling `scrollToEnd`

| Vertical scrollview (working ✅) | Horizontal scrollview (before fix, not stopping ❌) | Horizontal scrollview (after fix ✅)|
|--------|--------|--|
| ![vertical-scrolltoffset-working](https://github.com/facebook/react-native/assets/4534323/884d95ce-9b09-47aa-99a7-99ca579a8fc4)|![horizontal-scrolloffset-bug](https://github.com/facebook/react-native/assets/4534323/0065a9d0-f905-4354-9caa-29a0a1f914ba)|![horizontal-scrolloffset-fixed](https://github.com/facebook/react-native/assets/4534323/ab49c356-23e8-464a-83a9-c4632b9d673e)|

Based on  facebook#38728 I kept all those calls to `abortAnimation` on the View Manager

## Changelog:

[ANDROID] [FIXED] - Fixed horizontal ScrollView momentum not stopping when calling scrollTo programmatically
[ANDROID] [FIXED] - Fixed ScrollView momentum not stopping when calling scrollToEnd programmatically

Pull Request resolved: facebook#39529

Test Plan:
My test code is [this](https://gist.github.com/Almouro/3ffcfbda8e2239e64bee93985e243000)
Basically:
- a scrollview with a few elements
- some buttons to trigger a `scrollTo`

To reproduce the bug, I scroll then click one of the buttons triggering a `scrollTo`

I added `react-native@nightly` to my project, and copy pasted `packages/react-native/ReactAndroid/src/main/java/com/facebook/react/views/scroll` folder from this branch to try out my fixes

Then tested the following scenarios on Android:

| List layout  | Method | Not animated | Animated|
|--------|--------|--|--|
| horizontal | scrollTo | ![horizontal-scrollTo-no](https://github.com/facebook/react-native/assets/4534323/bda87a19-43cf-4fe9-9340-f70a3d5cd6a4)| ![horizontal-scrollto-yes](https://github.com/facebook/react-native/assets/4534323/8628d7ff-ee28-4185-81d1-1783f0fd990f) |
| horizontal | scrollToEnd  |![horizontal-scrolltoend-no](https://github.com/facebook/react-native/assets/4534323/594bb539-cb27-4234-8a8f-74d5b2bbe25f) | ![horizontal-scrolltoend-yes](https://github.com/facebook/react-native/assets/4534323/7366abcd-95fb-42ab-89e1-38fd4b10d966)|
| vertical | scrollTo | ![vertical-scrollto-no](https://github.com/facebook/react-native/assets/4534323/54555250-d4df-4bc2-b20f-46c706e8c726)|![vertical-scrollto-yes](https://github.com/facebook/react-native/assets/4534323/0c109f81-0bbd-475b-90f1-f1467317c799) |
| vertical | scrollToEnd  | ![vertical-scrolltoend-no](https://github.com/facebook/react-native/assets/4534323/f48c8196-8f2f-4d98-b750-91c067d1a063) | ![vertical-scrolltoend-yes](https://github.com/facebook/react-native/assets/4534323/04bb06dc-7e20-40de-a40d-e1da1fec491a)|

Reviewed By: javache

Differential Revision: D49437886

Pulled By: ryancat

fbshipit-source-id: 358c9b0eed7dabcbc9b87a15d1a757b414ef514b
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
CLA Signed This label is managed by the Facebook bot. Authors need to sign the CLA before a PR can be reviewed. Merged This PR has been merged. Shared with Meta Applied via automation to indicate that an Issue or Pull Request has been shared with the team.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

4 participants