Подтвердить что ты не робот

Переходы разделяемых элементов не работают в сочетании с координаторомLayout и CollapsingToolbarLayout

Главный экран моего приложения содержит вид сетки изображений. Когда пользователь выбирает изображение, активность детали начинается с использования общего элемента переход, который анимирует выбранное изображение сетки на сопряженное изображение, расположенное в CardView в подробном действии.

После обновления моего подробного представления XML-макета включить координаторLayout вдоль с CollapsingToolbarLayout, переход общего элемента перемещает изображение просмотр неправильного местоположения в подробном действии (активность "enter"). структура, похоже, отражает смещение всего AppBarLayout и внутреннего CollapsingToobarLayout и оживляет приблизительную позицию изображения было бы, если бы не было CollapsingToolBarLayout над CardView, что содержит изображение целевого изображения.

Проблема может быть дублирована в приложении cheesesquare примера Chris Banes, добавив ImageView (с именем перехода) к любому из трех карт в Activity_detail.xml:

<ImageView
 android:id="@+id/imageView"
 android:layout_width="wrap_content"
 android:layout_height="wrap_content"
 android:src="@mipmap/ic_launcher"
 android:transitionName="sharedImage" />

а затем установите общий переход элемента в onBindViewHolder в CheeseListFragment.java следующим образом:

@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
        holder.mBoundString = mValues.get(position);
        holder.mTextView.setText(mValues.get(position));

        holder.mView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Context context = v.getContext();
                Intent intent = new Intent(context, CheeseDetailActivity.class);
                intent.putExtra(CheeseDetailActivity.EXTRA_NAME, holder.mBoundString);

                holder.mImageView.setTransitionName("sharedImage");                        
                ActivityOptionsCompat options = ActivityOptionsCompat.
                        makeSceneTransitionAnimation(
                                getActivity(v.getContext()),
                                            holder.mImageView,                     
                                            "sharedImage");
                ActivityCompat.StartActivity((MyActivity) context, intent, options.toBundle());
            }
        });

        Glide.with(holder.mImageView.getContext())
                .load(Cheeses.getRandomCheeseDrawable())
                .fitCenter()
                .into(holder.mImageView);
    }

Если вы запустите приложение и нажмите на элемент списка сыра, вы увидите, как переходная анимация перемещает изображение в неправильное (слишком высокое) смещение в вид активности назначения. После завершения анимации изображение появится "деформировать" в правильное положение.

Любые мысли о возможных обходах очень приветствуются.

4b9b3361

Ответ 1

Ответ прост, маска cheesesquare activity_detail.xml, вкратце, выглядит так...

<android.support.design.widget.CoordinatorLayout 
    android:fitsSystemWindows="true"
    ...>

    <android.support.design.widget.AppBarLayout
        android:fitsSystemWindows="true"
        ...>

        <android.support.design.widget.CollapsingToolbarLayout
            android:fitsSystemWindows="true"
            ...>

            <ImageView
                android:fitsSystemWindows="true"
                ... />

            <android.support.v7.widget.Toolbar
                ... />

        </android.support.design.widget.CollapsingToolbarLayout>

     </android.support.design.widget.AppBarLayout>

     <android.support.v4.widget.NestedScrollView
         app:layout_behaviour="@string/appbar_scrolling_view_behaviour"
         ...>

</android.support.design.widget.CoordinatorLayout>

Что не так в этом макете, так это то, что свойство android: fitsSystemWindows должно распространяться по цепочке макетов по всем контейнерам, а в опубликованном демонстрационном приложении это свойство отсутствует для NestedScrollView. Изменение NestedScrollView на

     <android.support.v4.widget.NestedScrollView
         app:layout_behaviour="@string/appbar_scrolling_view_behaviour"
         android:fitsSystemWindows="true"
         ...>

устраняет проблему. Вероятно, это должно быть изменено в демо-коде Github.

Ответ 2

Решено!

Если кто-то сталкивается с этой ошибкой, в которой они используют компоновку координатора, которые состоят из разделяемых элементов, которые при переходе общего элемента из предыдущего действия в действие, содержащее макет координатора, попадают неправильно во время переходной анимации. Это ошибка в версии библиотеки поддержки дизайна "com.android.support:design:22.2.0"

Решение:

Измените версию на "com.android.support:design:23.1.0" в build.gradle(app) p >

Все должно работать идеально по назначению. Это сработало для меня, нашел это решение после многих исследований.