Clarify more hacks
This commit is contained in:
@@ -88,15 +88,23 @@ export const Pager = forwardRef<PagerRef, React.PropsWithChildren<Props>>(
|
|||||||
'worklet'
|
'worklet'
|
||||||
let {position, offset} = e
|
let {position, offset} = e
|
||||||
if (offset !== 0) {
|
if (offset !== 0) {
|
||||||
|
// Normalize so that we always track the offset according to the
|
||||||
|
// last settled page from the application point of view.
|
||||||
const offsetFromPage = offset + (position - dragPage.value)
|
const offsetFromPage = offset + (position - dragPage.value)
|
||||||
dragProgress.set(offsetFromPage)
|
dragProgress.set(offsetFromPage)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onPageScrollStateChanged(e: PageScrollStateChangedNativeEventData) {
|
onPageScrollStateChanged(e: PageScrollStateChangedNativeEventData) {
|
||||||
'worklet'
|
'worklet'
|
||||||
|
if (dragState.get() === 'idle' && e.pageScrollState === 'settling') {
|
||||||
|
// This is a programmatic scroll on Android.
|
||||||
|
// Stay "idle" to match iOS and avoid confusing downstream code.
|
||||||
|
return
|
||||||
|
}
|
||||||
dragState.set(e.pageScrollState)
|
dragState.set(e.pageScrollState)
|
||||||
parentOnPageScrollStateChanged?.(e.pageScrollState)
|
parentOnPageScrollStateChanged?.(e.pageScrollState)
|
||||||
if (e.pageScrollState === 'idle') {
|
if (e.pageScrollState === 'idle') {
|
||||||
|
// This is a good time to update the last known settled page.
|
||||||
const page = pendingPage.get()
|
const page = pendingPage.get()
|
||||||
dragPage.set(page)
|
dragPage.set(page)
|
||||||
dragProgress.set(0)
|
dragProgress.set(0)
|
||||||
@@ -105,8 +113,12 @@ export const Pager = forwardRef<PagerRef, React.PropsWithChildren<Props>>(
|
|||||||
},
|
},
|
||||||
onPageSelected(e: PagerViewOnPageSelectedEventData) {
|
onPageSelected(e: PagerViewOnPageSelectedEventData) {
|
||||||
'worklet'
|
'worklet'
|
||||||
|
// We don't usually emit the "page selected" event here because it fires
|
||||||
|
// prematurely on Android. We'll emit it in the idle state handler above.
|
||||||
pendingPage.set(e.position)
|
pendingPage.set(e.position)
|
||||||
if (dragState.value === 'idle') {
|
if (dragState.value === 'idle') {
|
||||||
|
// However, if we already *are* idle, this event is caused by the initial state.
|
||||||
|
// Let's fire it here since there will be no scroll state change event later.
|
||||||
const page = e.position
|
const page = e.position
|
||||||
dragPage.set(page)
|
dragPage.set(page)
|
||||||
dragProgress.set(0)
|
dragProgress.set(0)
|
||||||
|
|||||||
Reference in New Issue
Block a user