Android 多个共享元素
我在足球应用程序中遇到以下情况。Android 多个共享元素,android,shared-element-transition,Android,Shared Element Transition,我在足球应用程序中遇到以下情况。 我们希望实现所有这些活动之间的共享元素 在第一个活动的我的视图持有者中,我为比赛设置了一个android:transitionName,它对应于第二个活动上的相同transitionName <!-- item_viewholder (first activity) --> <CustomViewContainingImageViewAndTextView android:id="@+id/item_match_homet
我们希望实现所有这些活动之间的共享元素 在第一个
活动
的我的视图持有者中,我为比赛设置了一个android:transitionName
,它对应于第二个活动
上的相同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" />
现在,这个转换很好,但如果我想了解更深入的细节,该怎么办。显示所选团队的统计信息,我也想在那里共享转换 当将包含图像视图和文本视图的
自定义视图单击到新的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());
此转换名称对应于第三个活动
<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" />
但是Entertransformation失败,exitTransition工作
但是,这会将exitTransition从2-->1中断
视力。
希望有人能花点时间来解决这个问题
提前感谢毫无疑问,问题是因为您正在将要共享的视图的转换名称
从第二个活动
更改为第三个。但是您只需将transitionName
保留在第二个Activity
中,而根据我们希望从第二个Activity
中共享的内容,更改第三个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" />
因此,让我们保持从第一个活动
到第二个活动的过渡,因为它按预期工作。让我们看看第二个活动
:我们只需要将视图的转换名
,作为意图的额外部分
发送给第三个活动
,然后以编程方式将该值分配给第三个活动
中的共享视图
<!-- 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" />
下面是我们第二次活动的代码:
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
作为额外的共享视图开始新的活动
然后在第三个活动中
我刚刚从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);
}
}
因此,我们有了类似的东西(我使用了explode transition来更好地了解活动之间的差异):
希望这对您有所帮助,并且完全符合您的要求!:) 我自己也有这个疑问,但我觉得上面的答案有点让人困惑。简单地说,如果您有多个共享元素要设置动画,您可以根据需要创建视图和转换名称的“对”。以下是此示例的示例代码:
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());
嘿,伙计!我喜欢你的解决方案,但是我的第三个活动中的imageView是一个片段和一个recyclerview。因此,我必须为我的活动提供转换名称,将其传递给我的片段,将其传递给我的适配器,将其传递给我的视图持有者。真麻烦…是的,或者您可以将其保存在SharedReferences
或数据库中,然后在您的ViewHolder
/适配器中提取它。或者您可以在某个地方将其设置为静态
变量。或者您甚至可以将其设置为模型中的一个字段(即团队
类,这是最简单的方法),然后再次在onBindViewHolder
中提取。无论如何,您需要在运行时设置它,因为在单击它之前,您不知道将共享什么:)您可以发布此代码吗?不知怎的,我无法复制你所呈现的。