在viewpager片段内的recyclerview项到viewpager片段之间共享元素过渡

时间:2018-07-13 04:35:53

标签: android android-fragments android-recyclerview android-viewpager transition

我有两个活动MainAcitityDetailActivityMainActivityrecyclerview的片段中包含viewpager。当我单击项目时,它将转到DetailActivity,并在viewpagerDetailAcitivty的片段内显示详细信息。

问题是:

  1. 当我单击transition中的recyclerview项并转到MainActivity时,我想添加DetailActivity

  2. 当我从DetailActivity返回到MainActivity时,我希望它的过渡会出现在我在viewpager刷过的那个项目上。

我该如何实现?

注意:

-MainAcitivtyDetailAcitivty都包含viewpager

谢谢!

1 个答案:

答案 0 :(得分:0)

您将需要用唯一的transitionName标记两个视图。

ViewCompat.setTransitionName(imageView, "some_unique_transitionName");

使用此新信息开始新活动

ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(activity, imageView, ViewCompat.getTransitionName(imageView));

activity.startActivity(intent, options.toBundle());

现在,关于新活动: 根据您打开下一个活动的方式以及视图层次结构的复杂程度,您可能会可能在onCreate期间使用supportPostponeEnterTransition();,并在设置之后的某个时间supportStartPostponedEnterTransition();使用。我会让你阅读文档

除此之外,找到需要动画的新活动的视图并在其上设置过渡名称

activityImage.setTransitionName(transitionName);

让它撕裂。

您可能需要修改的其他内容可能包括动画持续时间,插值器等。

 getWindow().getSharedElementEnterTransition().setDuration(200);
    getWindow().getSharedElementReturnTransition().setDuration(200)
            .setInterpolator(new DecelerateInterpolator());

而且,您的活动的进入/退出转换(您将需要此操作)

    Fade fade = new Fade();
    fade.excludeTarget(android.R.id.statusBarBackground, true);
    fade.excludeTarget(android.R.id.navigationBarBackground, true);
    getWindow().setEnterTransition(fade);
    getWindow().setExitTransition(fade);

请记住,共享元素过渡遍历整个视图层次结构以查找源视图和目标视图,并且只有在目标活动完全放置好之后,框架反向过渡才能为您提供您想要实现的错觉,如果是,层次结构很复杂,或者活动需要花费一些时间来建立(取决于网络),因此您可能需要进行一些修改。