【问题标题】:Multiple Shared Elements多个共享元素
【发布时间】:2017-03-31 00:30:17
【问题描述】:

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

在我的第一个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());

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

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

的 exitTransition

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

提前致谢

【问题讨论】:

    标签: android shared-element-transition


    【解决方案1】:

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

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

    所以这里是我们的secondActivity的代码:

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

    因此我们得到了这样的结果(我使用了爆炸过渡来更好地查看活动之间的差异):

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

    【讨论】:

    • 嘿伙计!我喜欢您的解决方案,但是我在第三个活动中的 imageView 位于片段和回收站视图中。因此,我必须将我的转换名称提供给我的活动,将它传递给我的片段,将它传递给我的适配器,将它传递给我的查看器。好麻烦……
    • 是的,或者您可以将其保存在SharedPreferences 或数据库中,然后将其提取到您的ViewHolder/Adapter 中。或者您可以在某处将其设置为static 变量。或者您甚至可以将其设置为模型中的字段(即Team 类,这将是最简单的方法),然后再次提取onBindViewHolder。无论如何,您需要在运行时设置它,因为在单击它之前您不知道将共享什么:)
    • 你能贴出代码吗?不知何故,我无法重现您展示的内容。
    【解决方案2】:

    我自己也有这个疑问,但我觉得上面的答案有点令人困惑。简而言之,如果您有多个共享元素要制作动画,您可以根据需要创建 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());
    

    【讨论】:

      猜你喜欢
      • 2020-04-29
      • 1970-01-01
      • 1970-01-01
      • 2020-05-09
      • 1970-01-01
      • 2021-06-29
      • 2018-07-14
      • 1970-01-01
      • 2016-04-23
      相关资源
      最近更新 更多