嵌套共享元素的转换没有从预期位置开始

5

TL;DR:为什么这个转换没有从预期的位置开始?也就是 CardView 所在的位置。

enter image description here

平台/依赖:Android Studio 1.0-RC2,目标 SDK 21,最小 SDK 21,AppCompat-21.0.2,CardView-21.0.2,RecyclerView-21.0.2。

测试环境:Genymotion Nexus 5 Lollipop 预览版

代码(简化版)

我有三个共享元素:

源码:

<CardView
    android:transitionName="cardView">
    <ImageView
      android:transitionName="imageView">
    <TextView
      android:transitionName="textView">

目标:

<RelativeLayout
    android:transitionName="cardView">
    <ImageView
      android:transitionName="imageView">
    <TextView
      android:transitionName="textView">

请注意,转换名称是以编程方式添加的。这是因为CardView保存在RecyclerView上,并且有许多副本。我尝试使用与XML实例相同的名称,但也不起作用。

ReciclerView.Adapter执行此操作:

@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {
    //...
    ViewCompat.setTransitionName(viewHolder.mCardView, "cardViewTransition" + position);
    ViewCompat.setTransitionName(viewHolder.mImageView, "imageTransition" + position);
    ViewCompat.setTransitionName(viewHolder.mTextView, "textTransition" + position);
    //...
}

HomeActivity执行以下操作:

@Override
protected void onCreate(Bundle savedInstanceState) {
    getWindow().requestFeature(android.view.Window.FEATURE_CONTENT_TRANSITIONS);
    getWindow().requestFeature(android.view.Window.FEATURE_ACTIVITY_TRANSITIONS);
    // ..
    mRecyclerView.addOnItemTouchListener(
        new RecyclerItemClickListener(this, new RecyclerItemClickListener.OnItemClickListener() {
            @Override public void onItemClick(View view, int position) {
                Intent intent = new Intent(selfContext, DetailActivity.class);

                View imageView = view.findViewById(R.id.imageView);
                TextView textView = (TextView)view.findViewById(R.id.textView);

                Bundle extras = new Bundle();
                extras.putInt("position", position);
                extras.putString("text", textView.getText().toString());
                intent.putExtras(extras);
                String name = ViewCompat.getTransitionName(view);
                ActivityOptionsCompat options =
                    ActivityOptionsCompat.makeSceneTransitionAnimation(selfContext
                            ,Pair.create(view, ViewCompat.getTransitionName(view))
                            ,Pair.create(imageView, ViewCompat.getTransitionName(imageView))
                            ,Pair.create((View)textView, ViewCompat.getTransitionName(textView))
                    );
                ActivityCompat.startActivity(selfContext, intent, options.toBundle());
            }
        })
    );
    ///...
}

DetailActivity承担以下职责:

@Override
protected void onCreate(Bundle savedInstanceState) {
    getWindow().requestFeature(android.view.Window.FEATURE_CONTENT_TRANSITIONS);
    getWindow().requestFeature(android.view.Window.FEATURE_ACTIVITY_TRANSITIONS);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_detail);

    // ...

    Bundle extras = getIntent().getExtras();
    int mPositionRef = extras.getInt("position");
    View base = findViewById(R.id.detail_layout);
    View image = findViewById(R.id.imageView);
    TextView text = (TextView) findViewById(R.id.txtLabel);
    text.setText(extras.getString("text"));

    ViewCompat.setTransitionName(base, "cardViewTransition" + mPositionRef);
    ViewCompat.setTransitionName(image, "imageTransition" + mPositionRef);
    ViewCompat.setTransitionName(text, "textTransition" + mPositionRef);

}

我已经调试过了,分享的元素在源和目标中具有相同的名称。

问题(再次提出)

为什么这个转换不是从预期的位置开始的呢?也就是说,卡片视图所在的位置。

完整的示例在GitHub上。


Lollipop存在一个已知的bug,与嵌套共享元素有关(即同时添加视图组和其子元素作为共享元素),因此可能与此有关(来源:https://dev59.com/NF8d5IYBdhLWcg3wvkSN)。 - Alex Lockwood
尝试仅将ImageViewTextView作为共享元素添加(而不是父相对布局容器)。 - Alex Lockwood
@AlexLockwood 是的!今天你是我的英雄。 - rnrneverdies
好的,听起来那个答案对你有用。 :) 我会将其作为答案添加而不是评论...除非你还有其他问题。 - Alex Lockwood
还有,不错的“英雄”双关语。:P - Alex Lockwood
2个回答

2

将ImageView和TextView作为共享元素添加仍然存在相同的问题。有任何帮助吗? - TaRan LaYal

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接