Skip to content

Commit e8c093d

Browse files
authored
feat(android): allow shared element transitions to work with ListView/CollectionView/Pager (#10411)
1 parent 22c21b7 commit e8c093d

File tree

2 files changed

+27
-18
lines changed

2 files changed

+27
-18
lines changed

packages/core/ui/transition/page-transition.android.ts

Lines changed: 24 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ function setTransitionName(view: ViewBase) {
7777
}
7878

7979
export class PageTransition extends Transition {
80-
constructor(duration?: number, curve?: any) {
80+
constructor(duration?: number, curve?: any, private pageLoadedTimeout: number = 0) {
8181
// disable custom curves until we can fix the issue with the animation not completing
8282
if (curve) {
8383
console.warn('PageTransition does not support custom curves at the moment. The passed in curve will be ignored.');
@@ -178,12 +178,10 @@ export class PageTransition extends Transition {
178178
const state = SharedTransition.getState(this.id);
179179
const pageEnd = state.pageEnd;
180180

181-
const { sharedElements, presented, presenting } = SharedTransition.getSharedElements(fromPage, toPage);
182-
const sharedElementTags = sharedElements.map((v) => v.sharedTransitionTag);
183-
if (SharedTransition.DEBUG) {
184-
console.log(` Page: ${state.activeType === SharedTransitionAnimationType.present ? 'Present' : 'Dismiss'}`);
185-
console.log(`1. Found sharedTransitionTags to animate:`, sharedElementTags);
186-
}
181+
//we can't look for presented right now as the toPage might not be loaded
182+
// and thus some views like ListView/Pager... might not have loaded their "children"
183+
// presented will be handled in loaded event of toPage
184+
const { presenting } = SharedTransition.getSharedElements(fromPage, toPage);
187185

188186
// Note: we can enhance android more over time with element targeting across different screens
189187
// const pageStart = state.pageStart;
@@ -215,16 +213,15 @@ export class PageTransition extends Transition {
215213
// independentView.opacity = 0;
216214
// }
217215
// }
218-
219-
toPage.once('loaded', () => {
220-
presented.filter((v) => sharedElementTags.includes(v.sharedTransitionTag)).forEach(setTransitionName);
221-
newFragment.startPostponedEnterTransition();
222-
});
223-
224-
sharedElements.forEach((v) => {
225-
setTransitionName(v);
226-
fragmentTransaction.addSharedElement(v.nativeView, v.sharedTransitionTag);
227-
});
216+
const onPageLoaded = () => {
217+
// add a timeout so that Views like ListView / CollectionView can have their children instantiated
218+
setTimeout(() => {
219+
const { presented } = SharedTransition.getSharedElements(fromPage, toPage);
220+
// const sharedElementTags = sharedElements.map((v) => v.sharedTransitionTag);
221+
presented.forEach(setTransitionName);
222+
newFragment.startPostponedEnterTransition();
223+
}, this.pageLoadedTimeout);
224+
};
228225

229226
fragmentTransaction.setReorderingAllowed(true);
230227

@@ -252,6 +249,16 @@ export class PageTransition extends Transition {
252249
newFragment.postponeEnterTransition();
253250
newFragment.setSharedElementEnterTransition(transitionSet);
254251
newFragment.setSharedElementReturnTransition(transitionSet);
252+
253+
presenting.forEach((v) => {
254+
setTransitionName(v);
255+
fragmentTransaction.addSharedElement(v.nativeView, v.sharedTransitionTag);
256+
});
257+
if (toPage.isLoaded) {
258+
onPageLoaded();
259+
} else {
260+
toPage.once('loaded', onPageLoaded);
261+
}
255262
}
256263
}
257264

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
import { Transition } from '.';
2-
export declare class PageTransition extends Transition {}
2+
export declare class PageTransition extends Transition {
3+
constructor(duration?: number, nativeCurve?: any /* UIViewAnimationCurve | string | CubicBezierAnimationCurve | android.view.animation.Interpolator | android.view.animation.LinearInterpolator */, pageLoadedTimeout?: number);
4+
}

0 commit comments

Comments
 (0)