Переход от вложенных общих элементов не начинается с ожидаемого места

TL; DR Почему этот переход не начинается с ожидаемого места?

То есть, место, где находится CardView.

Введите описание изображения здесь

Платформа / Deps: Android Studio 1.0-RC2, TargetSdk 21, MinSdk 21, AppCompat-21.0.2, CardView-21.0.2, RecyclerView-21.0.2.

Протестировано: Genymotion Nexus 5 Lollipop Preview

Кодекс (упрощенный)

У меня есть три общих элемента:

Источник:

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

У меня есть отлаженные и разделяемые элементы с одинаковыми именами в источнике и получателе.

Вопрос (снова)

Почему этот переход не начинается с ожидаемого места? То есть, место, где находится CardView.

Полный образец в GitHub

В Lollipop имеется известная ошибка, связанная с вложенными общими элементами (т.е. одновременное добавление как группы представлений, так и одного из ее дочерних элементов в качестве общих элементов), поэтому она может быть связана с этим (source: Glitch при анимации вложенных представлений в Общий элемент Переход активности? ).

Попробуйте только добавить ImageView и TextView в качестве общих элементов (а не в родительский контейнер относительного размещения).