结束活动中的自定义共享元素转换

时间:2016-07-07 02:57:53

标签: android android-recyclerview android-transitions

我有全局应用程序中的Feed数据列表。 我使用此代码从RecyclerView

中的MainAcitivty转换
// selected item event
Intent intent = new Intent(this, DetailActivity.class);
intent.putExtra("item_feed_index", selectedItemIndex);
FeedViewHolder viewHolder = getViewHolderFromPosition(position);
Pair<View, String> pair1 = Pair.create(viewHolder.imageView, "TransitionName.Feed.Image");
Pair<View, String> pair2 = Pair.create(viewHolder.textView, "TransitionName.Feed.Text");
Pair<View, String> pair3 = Pair.create(viewHolder.button, "TransitionName.Feed.Button");
ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(this, pair1, pair2, pair3);
startActivity(intent, options.toBundle());

确实有效。但问题是在DetailActivity中,我有另一个垂直列表,用户可以向下/向上滚动以更改列表中的Feed项(也会更改滚动索引)。​​

DetailActivity按回来时,我希望退出动画转换执行正确的查看Feed索引。我怎样才能做到这一点?

这是onActivityResult中的代码MainActivity,它将循环滚动到正确的位置,但退出过渡动画不是正确的位置。

int currentFeedIndex = Application.getInstance().getCurrentViewingFeed();
if (currentFeedIndex > 0 && currentFeedIndex < adapter.getItemCount()) {
   if (gridLayoutManager != null) {
      gridLayoutManager.scrollToPositionWithOffset(currentFeedIndex + 1, 0);
   }
}

我正在寻找在运行退出动画之前更改配对列表的方法

更新:这是DetailActivity的布局,我在其中为视图指定转场名称

 <RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/imgFeed"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:transitionName="TransitionName.Feed.Image" />

    <TextView
        android:id="@+id/tvLogo"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:transitionName="TransitionName.Feed.Text"/>

    <Button
        android:transitionName="TransitionName.Feed.Button"
        android:id="@+id/btn"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="40dp"
        android:layout_below="@+id/tvLogo"/>
    </RelativeLayout>

2 个答案:

答案 0 :(得分:2)

关于来电者活动:

String itemId; //set your item id here

Intent intent = new Intent(this, DetailActivity.class);
intent.putExtra("item_feed_index", selectedItemIndex);
intent.putExtra("item_id", itemId);

String imageViewTransitionName = "TransitionName.Feed.Image." + itemId;
String textViewTransitionName = "TransitionName.Feed.Text." + itemId;
String buttonTransitionName = "TransitionName.Feed.Button." + itemId;

ViewCompat.setTransitionName(viewHolder.imageView, imageViewTransitionName);
ViewCompat.setTransitionName(viewHolder.textView, textViewTransitionName);
ViewCompat.setTransitionName(viewHolder.button, buttonTransitionName);

Pair<View, String> pair1 = Pair.create(viewHolder.imageView, imageViewTransitionName);
Pair<View, String> pair2 = Pair.create(viewHolder.textView, textViewTransitionName);
Pair<View, String> pair3 = Pair.create(viewHolder.button, buttonTransitionName);

ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(this, pair1, pair2, pair3);
startActivity(intent, options.toBundle());

然后在您的目的地Activity中,您只需从itemId获取Intent并为每个视图设置正确的转换名称。

String itemId = getIntent().getString("item_id");
String imageViewTransitionName = "TransitionName.Feed.Image." + itemId;
String textViewTransitionName = "TransitionName.Feed.Text." + itemId;
String buttonTransitionName = "TransitionName.Feed.Button." + itemId;

ViewCompat.setTransitionName(findViewById(R.id.imageView), imageViewTransitionName);
ViewCompat.setTransitionName(findViewById(R.id.textView), textViewTransitionName);
ViewCompat.setTransitionName(findViewById(R.id.button), buttonTransitionName);

答案 1 :(得分:1)

覆盖DetailActivity上的onBackPressed方法,如下所示:

@Override
public void onBackPressed() {
    supportFinishAfterTransition();
    super.onBackPressed();
}

另外,请确保您已在styles.xml

上指定退出转换