我有一个GridView布局,可以动态添加或删除到网格中。
在iOS中,GridView项目的本机行为是网格中的其他项目滑入已删除项目的位置,或者在添加新项目时滑动以腾出空间。
然而,在Android上,行为仅适用于即时弹出屏幕的更改。我尝试使用GridView适配器中的一些技巧为每个getView()调用添加自定义动画,但这最终导致了一些问题:
Android GridView loading the 0 indexed item in a later index's slot when data set changes
我尝试让各个视图控制动画而不是适配器的getView()方法,但最终结果是相同的。
我也尝试过使用GridLayoutAnimationController,如下所示:
Animation animation = AnimationUtils.loadAnimation(mActivity, R.anim.grid_item_fadein);
GridLayoutAnimationController controller = new GridLayoutAnimationController(animation, .2f, .2f);
mGrid.setLayoutAnimation(controller);
这适用于所有GridView内容的初始加载,但对该内容的任何更改都会像默认情况一样立即弹出。
我觉得这是一个非常简单的功能,应该有一种更简单的方法。我在网上搜索时看到的最好的是a library,它可以激活在网格中交换位置的GridView项目,但这不是我想要的(在同一个库中,当你从中移除一个项目时)网格通过删除我想要避免的相同即时效果发生。)
关于SO的一个常见答案我也看到过“看看APIDemos,有很多例子。”但据我所知,实际上没有动画GridView内容更改的示例。
感谢任何帮助,谢谢。
答案 0 :(得分:7)
Chet Haase推出了一个关于如何正确处理ListView动画的精彩视频。基本概念可以应用于GridViews。您可以找到视频here。
如果您正在为API 1.0+进行开发,除非使用ViewPropertyAnimator,否则您将无法使用视频提及的引用动画功能(例如NineOldAndroids)。
答案 1 :(得分:4)
我认为对于AdapterViews,ViewGroup的LayoutTransition不起作用。查看源代码,ViewGroup确保调用addView
和removeView
时发生其他子代的转换动画,但派生的AdapterView不使用这些方法,因为它依赖于适配器来提供视图
Chet Haase上面提到的视频是关于动画正在消失的ListView的单个子视图的动画,而不是动画所有其他周围的子视图,以填补空白。
并且,如果我理解正确的话,GridLayoutAnimationController是关于孩子们填写的交错动画(即第一次或整个列表的完全重新布局,从空开始),而不是就地制作动画添加或删除后周围儿童的布局更改。所以,孩子们是通过淡入,滑入还是旋转而出现的 - 总是一次一个,从头到尾。
最后,建议的解决方案:如果您不需要基于适配器的视图,则可以切换到GridLayout或LinearLayout。这就是animateLayoutChanges="true"
将起作用的地方,以及“布局动画”演示总是使用的内容。
注意LayoutTransition需要最低api级别11.而GridLayout需要api14。
答案 2 :(得分:4)
对GridView进行任何更改后,例如.remove() 你必须调用 mGrid.startLayoutAnimation();
GridView不会自动为您完成。你必须手动触发它; - )
答案 3 :(得分:2)
我发现这个资源链接非常有助于处理其他布局视图的动画,例如LinearLayout等: http://developer.android.com/training/animation/layout.html 希望这可以提供帮助。 您还可以查看https://github.com/nhaarman/ListViewAnimations获取灵感