多个共享元素

tim*_*tim 14 android shared-element-transition

我在足球应用程序中有以下情况.
我们希望在所有这些活动之间实现共享元素.

共享元素情况

在我的第一个Activity匹配器的视图中,我设置了一个android:transitionName对应于第二个上的相同transitionName Activity.

<!-- 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" />
Run Code Online (Sandbox Code Playgroud)

我开始第二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());
Run Code Online (Sandbox Code Playgroud)

现在这种过渡工作正常,但如果我想要更深入的细节怎么办呢.
显示有关所选团队的统计信息,我也希望在那里进行共享转换?

当我点击新的transitionName时,我尝试以编程方式设置.CustomViewContainingImageViewAndTextViewtransitionName

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());
Run Code Online (Sandbox Code Playgroud)

这个transitionName对应于ImageView第三个Activity

<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" />
Run Code Online (Sandbox Code Playgroud)

但是,enterTransition失败了,但exitTransition正常工作!
但是这会将exitTransition从2 - > 1中断

视线.希望有人花一些时间来解决这个问题.

提前致谢

rom*_*4ek 12

毫无疑问,问题在于您要更改transitionName要从第二Activity到第三分享的视图.但是,你应该简单地记住这transitionName在第二Activity,但改变transitionName视图的第三个 ActivityonCreate方法,根据我们想从第二个分享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);
Run Code Online (Sandbox Code Playgroud)

所以我在这里所做的只是创建相同的OnClickListener两支球队,这将创建共享的过渡,并开始与新的活动IntenttransitionName共享视图作为一个额外的.

然后在第三, 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

结果我们有这样的东西(我使用爆炸过渡来更好地看到活动之间的差异):

在此输入图像描述

希望有所帮助和你想要的完全相同!:)


Moh*_*tar 8

我本人对此表示怀疑,但我觉得上面的答案有点令人困惑。简单地说,如果要制作多个共享元素,可以根据需要创建View&transitionName的“对”。这是一个示例代码:

    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());
Run Code Online (Sandbox Code Playgroud)