android - 多个共享元素

标签 android shared-element-transition

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

Shared Elements Situation

在我的第一个 Activity View 中,我设置了一个 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());

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

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 有效!
然而,这打破了 exitTransition 从 2 --> 1

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

提前致谢

最佳答案

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

因此,让我们保持从第一个 Activity 到第二个的过渡,因为它按预期工作。让我们看一下第二个 Activity:我们只需要发送 View 的 transitionName,我们希望将其作为 Intent 的额外内容来共享> 到第三个 Activity,然后将此值以编程方式 分配给第三个 Activity 中的共享 View 。

下面是我们第二个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,它创建了共享的转换,并使用具有 transitionNameIntent 开始了新的 Activity 共享 View 的 作为额外的。

然后在 third Activity 中,我刚刚从 Intent 中获取了这个额外的内容并将其设置为 transitionName 共享 View :

@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);
    }
}

结果我们得到了这样的东西(我使用了爆炸过渡来更好地看到 Activity 之间的区别):

enter image description here

希望对您有所帮助,并且与您想要的完全一样! :)

关于android - 多个共享元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37491282/

相关文章:

android - 共享元素更新图片来源

android - 确定动画后 ImageView 共享元素的最终大小

Android TabLayout, Activity 选项卡始终位于中心,就像在 Play Newsstand 应用中一样

android - ArrayAdapter 的 getView 和 AndroidAnnotations

java - Eclipse自定义程序构建链——添加源文件

android - 将 SharedElement Activity 转换与自定义 View 一起使用

android - 在 Android Studio 中使用 Java 8

android - 有没有办法防止 AlertDialog 因输入无效而关闭?

android - Recyclerview 和 Detailsfragment : elevation, 层次结构之间的共享元素转换,bringToFront

android - 从 RecyclerView 到 Activity 的共享元素转换不起作用