我在足球申请中有以下情况 我们希望在所有这些活动之间实现共享元素。
在我的观看者的第一个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());
现在这种过渡工作正常,但如果我想要更深入的细节怎么办呢 显示有关所选团队的统计信息,我也希望在那里进行共享转换?
我尝试在transitionName
点击新CustomViewContainingImageViewAndTextView
时以编程方式设置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对应于第三个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" />
然而,enterTransition失败,但exitTransition工作!
但是这会将exitTransition从2 - >中断1
视力。 希望有人花一些时间来解决这个问题。
提前致谢
答案 0 :(得分:12)
毫无疑问,问题在于您要将要从第二个transitionName
分享的视图的Activity
更改为第三个。但是,您只需将transitionName
保留在第二个Activity
中,但在第三个 transitionName
&{39} {{{}中更改视图Activity
1}}方法,根据我们想要从第二个onCreate
分享的内容。
因此,让我们保持从第一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);
因此,我在这里所做的只是为两个团队创建了相同的OnClickListener
,这创建了共享转换,并且使用Intent
共享视图作为额外的transitionName
开始新活动。
然后在第三个 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);
}
}
结果我们有这样的事情(我已经使用爆炸过渡来更好地看到活动之间的差异):
希望有所帮助并且完全一样! :)
答案 1 :(得分:5)
我自己有这个疑问,但我觉得上面的答案有点令人困惑。简单地说,如果您有多个共享元素进行动画处理,您可以创建View&amp;的“Pair”对。 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());