两个RecyclerViews之间的活动转换

时间:2015-10-04 09:48:03

标签: android transition transitions android-transitions

我使用RecyclerViewGridLayout动画到另一个RecyclerView。它显示的图像像一个画廊。

RecyclerView显示文件夹的前3个元素,子@Override public void onBindViewHolder(FolderViewHolder holder, int position) { holder.transitionPairs.clear(); for (int i = 0; i < 3; i++) { ImageView iv = holder.getIconView(i); Image image = mItems.get(position).getImages().get(i); holder.transitionPairs.add(new Pair(iv, image.getTransitionName())); } 显示网格中的完整内容...

主适配器

@Override
public void onBindViewHolder(ImageViewHolder holder, int position) {

    ViewCompat.setTransitionName(holder.icon, mItems.get(position).getTransitionName());
}

子适配器

Intent intent = new Intent(getActivity(), ImagesActivity.class);
        intent.putExtra("folderIndex", pos);
        intent.putExtra("folder", item);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            ActivityOptionsCompat options = ActivityOptionsCompat.makeSceneTransitionAnimation(getActivity(), vh.getTransitionPairs().toArray(new Pair[vh.getTransitionPairs().size()]));
            getActivity().startActivity(intent, options.toBundle());
        }
       else
            getActivity().startActivity(intent);
  • 两个适配器都设置了相同的转换名称,它是从图像uri生成的,所以它肯定是唯一的

我启动子视图如下:

ViewHolder

转换对保存在ViewHolder中,并且只要ViewHolders被绑定就会生成转换对,正如您在上面的undo=True代码中所看到的那样

问题

显示子视图没有动画,返回动画...

2 个答案:

答案 0 :(得分:4)

抱歉,但这是对转换框架的记录限制。

https://developer.android.com/intl/es/training/transitions/overview.html#Limitations

  

限制

     

本节列出了转换框架的一些已知限制:    - 扩展AdapterView的类(如ListView)以与转换框架不兼容的方式管理其子视图。如果您尝试基于AdapterView为视图设置动画,则设备显示可能会挂起。

我知道它陈述ListView但对RecyclerView来说是一样的。一旦布局了视图,动画框架必须捕获transitionName值,ListViewRecyclerView需要额外的时间来获取适配器,创建子视图,布置那些屏幕上的子视图,然后将它们绑定到数据。过渡框架不能看到&#34;那些意见。

我对你的最好建议是假装&#34;假的&#34;适配器中的项目在布局的实际活动中膨胀,只是为了进行转换,然后在onStart上设置此视图转到GONE

修改

基于OP(Having issues using Android 5.0 Activity transitions onto an activity with a ViewPager)提供的链接,我已经结束了开发我自己但非常相似的解决方案。

在我自己的项目中,我有一个GridLayoutManager,每个屏幕大约有7个元素,并且动画到一个LinearLayoutManager,每个视图大多有1个(但有时你可以看到之前或之后的角落)。

在关联的响应中,解决方案是使用Activity.postponeEnterTransition()Activity.startPostponedEnterTransition()以及OnPreDrawListener来正确传递所有转换。

要记住的重要事实是视图必须附加到窗口以供转换框架捕获它。所以我使用OnAttachStateChangeListener来调度转换,而不是OnPreDraw。这应该使它变得微妙平滑过渡。

// somewhere on the `onBind` code I put that
itemView.addOnAttachStateChangeListener(listener);

// and this is the listener
private final View.OnAttachStateChangeListener listener = new View.OnAttachStateChangeListener() {
         @Override public void onViewAttachedToWindow(View v) {
            activity.startPostponedEnterTransition();
            v.removeOnAttachStateChangeListener(this);
         }

         @Override public void onViewDetachedFromWindow(View v) {
            v.removeOnAttachStateChangeListener(this);
         }
      };

它对我来说很好。

答案 1 :(得分:0)

1 - 确保您的RecyclerView具有正确的视图

2 - 使用setEnterSharedElementCallback添加SharedElementCallback并覆盖&#34; onMapSharedElements&#34;。

3 - 将缺少的视图添加到sharedElements地图(直接从适配器或RecyclerView获取)。

    setEnterSharedElementCallback(new SharedElementCallback() {
        @Override
        public void onMapSharedElements(List<String> names, Map<String, View> sharedElements) {
            sharedElements.put("bla", recyclerView.findViewWithTag("bla"));
            super.onMapSharedElements(names, sharedElements);
        }
    });