13

我的应用程序主屏幕包含图像的网格视图。当用户选择图像时,将使用共享元素转换启动详细活动,该转换将所选网格图像动画化为位于详细活动中 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);
    }

如果您运行应用程序并单击奶酪列表项,您将了解过渡动画如何将图像移动到目标活动视图中不正确(太高)的偏移量。动画完成后,图像将“变形”到正确的位置。

任何关于可能的变通办法的想法都将非常受欢迎。

4

2 回答 2

2

答案很简单,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 代码中进行更改。

于 2015-11-03T17:35:37.440 回答
-1

解决了!

如果有人在使用包含共享元素的协调器布局时遇到此错误,则在从先前的活动到包含协调器布局的活动的共享元素转换期间,这些共享元素在转换动画期间被错误地放置。这是设计支持库版本“com.android.support:design:22.2.0”中的一个错误

解决方案:

在 build.gradle(app)中将版本更改 “com.android.support:design:23.1.0”

一切都应按预期完美运行。这对我有用,经过大量研究后找到了这个解决方案。

于 2015-12-18T06:52:58.547 回答