我的应用程序主屏幕包含图像的网格视图。当用户选择图像时,将使用共享元素转换启动详细活动,该转换将所选网格图像动画化为位于详细活动中 CardView 中的配对图像。
在升级我的详细视图 XML 布局以包含 CoordinatorLayout 和 CollapsingToolbarLayout 后,共享元素转换将图像视图移动到详细活动(“进入”活动)中的错误位置。该框架似乎忽略了整个 AppBarLayout 和内部 CollapsingToobarLayout 的偏移量,并动画到包含目标图像视图的 CardView 上方没有 CollapsingToolBarLayout 时图像的大致位置。
通过在 activity_detail.xml 中的 3 个 CardView 中的任何一个中添加一个 ImageView(带有 transitionName),可以在 Chris Banes 的cheesesquare 示例应用程序中复制该问题:
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher"
android:transitionName="sharedImage" />
然后在 CheeseListFragment.java 的 onBindViewHolder 中设置共享元素转换,如下所示:
@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);
}
如果您运行应用程序并单击奶酪列表项,您将了解过渡动画如何将图像移动到目标活动视图中不正确(太高)的偏移量。动画完成后,图像将“变形”到正确的位置。
任何关于可能的变通办法的想法都将非常受欢迎。