Переходы разделяемых элементов не работают в сочетании с координатором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);
}
Если вы запустите приложение и нажмите на элемент списка сыра, вы увидите, как
переходная анимация перемещает изображение в неправильное (слишком высокое) смещение в
вид активности назначения. После завершения анимации изображение появится
"деформировать" в правильное положение.
Любые мысли о возможных обходах очень приветствуются.
Ответы
Ответ 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 >
Все должно работать идеально по назначению. Это сработало для меня, нашел это решение после многих исследований.