我使用RecyclerView
从GridLayout
动画到另一个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);
我启动子视图如下:
ViewHolder
转换对保存在ViewHolder
中,并且只要ViewHolders
被绑定就会生成转换对,正如您在上面的undo=True
代码中所看到的那样
问题
显示子视图没有动画,返回动画...
答案 0 :(得分:4)
https://developer.android.com/intl/es/training/transitions/overview.html#Limitations
限制
本节列出了转换框架的一些已知限制: - 扩展AdapterView的类(如ListView)以与转换框架不兼容的方式管理其子视图。如果您尝试基于AdapterView为视图设置动画,则设备显示可能会挂起。
我知道它陈述ListView
但对RecyclerView来说是一样的。一旦布局了视图,动画框架必须捕获transitionName
值,ListView
和RecyclerView
需要额外的时间来获取适配器,创建子视图,布置那些屏幕上的子视图,然后将它们绑定到数据。过渡框架不能看到&#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);
}
});