多个共享元素

我在足球应用程序里面有以下情况。
我们想要实现所有这些活动之间的共享元素。

共享元素的情况

在我的第一个Activity的比赛我的看法,我已经设置了一个android:transitionName对应于第二个Activity相同的transitionName。

 <!-- item_viewholder (first activity) --> <CustomViewContainingImageViewAndTextView android:id="@+id/item_match_hometeam" android:layout_width="wrap_content" android:layout_height="wrap_content" android:transitionName="@string/transition_morph_match_header_homeTeam" /> <!-- header (second activity) --> <CustomViewContainingImageViewAndTextView android:id="@+id/item_match_hometeam_header" android:layout_width="wrap_content" android:layout_height="wrap_content" android:transitionName="@string/transition_morph_match_header_homeTeam" /> 

我开始第二个Activity

 final String awayTeamTransition = activityContext.getString(R.string.transition_morph_match_header_awayTeam); final String homeTeamTransition = activityContext.getString(R.string.transition_morph_match_header_homeTeam); final ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation( activityContext, Pair.create(homeTeam, homeTeamTransition), Pair.create(awayTeam, awayTeamTransition)); activityContext.startActivity(intent, options.toBundle()); 

现在这个转换工作正常,但如果我想要更深入的细节。
显示关于select的团队的统计数据,我也想在那里共享转换?

我尝试以CustomViewContainingImageViewAndTextView单击新的transitionName时以编程方式设置transitionName

 final String teamViewTransition = activityContext.getString(R.string.transition_morph_teamview_to_detail); //teamView is the view that was clicked. ViewCompat.setTransitionName(teamView, teamViewTransition); final ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation( activityContext, Pair.create(teamView, teamViewTransition)); activityContext.startActivity(teamInfoActivityIntent, options.toBundle()); 

这个transitionName对应于第三个Activity上的ImageView

 <ImageView android:id="@+id/team_info_header_logo" android:layout_width="wrap_content" android:layout_height="wrap_content" android:transitionName="@string/transition_morph_teamview_to_detail" /> 

但是,enterTransition失败,但exitTransition工作!
然而这打破了从2 – > 1退出转换

视线。 希望有人需要一些时间来解决这个问题。

提前致谢

Solutions Collecting From Web of "多个共享元素"

毫无疑问,问题是因为您正在更改要从第二个Activity分享到第三个视图的transitionName 。 但是你应该简单地在第二个Activity保留transitionName ,但是根据我们想要从第二个Activity分享的内容,在第三个 ActivityonCreate方法中改变视图的transitionName

所以让我们继续从第一个Activity到第二个Activity ,因为它按预期工作。 我们来看第二个Activity :我们只需要发送视图的transitionName ,我们想将其作为额外的Intent分享给第三个Activity ,然后以编程方式将这个值分配给第三个Activity中的共享视图。

所以这里是我们的第二个 Activity的代码:

 View homeTeam = findViewById(R.id.home_team_detail); View awayTeam = findViewById(R.id.away_team_detail); View.OnClickListener onTeamClickListener = new View.OnClickListener() { @Override public void onClick(View v) { Activity activityContext = MultipleElementsDetail.this; final ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation( activityContext, Pair.create(v, v.getTransitionName())); startActivity(new Intent(activityContext, SingleElementDetail.class) .putExtra("shared_element_transition_name", v.getTransitionName()), options.toBundle()); } }; homeTeam.setOnClickListener(onTeamClickListener); awayTeam.setOnClickListener(onTeamClickListener); 

所以我在这里所做的就是为两个团队创build相同的OnClickListener ,创build共享转换,并使用具有共享视图的transitionNameIntent开始新的活动。

然后在第三个 Activity我只是从Intent得到这个额外的东西,并将其设置为共享视图的transitionName

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_single_element_detail); View team = findViewById(R.id.team_single); String transitionName = getIntent().getStringExtra("shared_element_transition_name"); if (!TextUtils.isEmpty(transitionName)) { ViewCompat.setTransitionName(team, transitionName); } } 

因此,我们有这样的事情(我用爆炸过渡,以更好地看到活动之间的差异):

在这里输入图像说明

希望有所帮助,完全一样你想要的! 🙂

我自己有这个疑问,但我觉得上面的答案有点混乱。 简单地说,如果您有多个共享元素进行animation制作,您可以根据需要创buildView&transitionName的“Pair”。 这里是一个示例代码:

  Pair statusAnim = Pair.create(holder.getOrderStatusView(), "track_job_status"); Pair driverBundleAnim = Pair.create(holder.getDriverProfileBundle(), "driver_profile_bundle"); ActivityOptions transitionActivityOptions = ActivityOptions.makeSceneTransitionAnimation((Activity) context, statusAnim, driverBundleAnim); context.startActivity(new Intent(context, TrackingActivity.class), transitionActivityOptions.toBundle());