Android:animation改变GridView内容

我有一个GridView的布局,可以dynamic添加或删除到网格。

在iOS中,GridView项目的原生行为是将网格中的其他项目滑入移除项目的位置,或者在添加新项目时滑动以腾出空间。

然而,在Android上,行为只是为了立即在屏幕上popup更改。 我尝试在GridView的适配器中使用一些技巧为每个getView()调用添加自定义animation,但最终导致了一些在这里看到的问题:

当数据集更改时,Android GridView将索引项目加载到索引后面的插槽中

我试图让各个视图控制animation,而不是适配器的getView()方法,但最终结果是相同的。

我也尝试使用GridLayoutAnimationController,像这样:

Animation animation = AnimationUtils.loadAnimation(mActivity, R.anim.grid_item_fadein); GridLayoutAnimationController controller = new GridLayoutAnimationController(animation, .2f, .2f); mGrid.setLayoutAnimation(controller); 

这适用于所有GridView内容的初始加载,但对该内容的任何更改只是即时popup,就像默认情况下一样。

我觉得这是一个非常简单的function,应该有一个更简单的方法来做到这一点。 从网上search中看到的最好的是一个库 ,它激活GridView项目,交换网格中的地方,但这不是我正在寻找(在同一个库中,当您通过删除从网格中删除一个项目我试图避免发生同样的即时效应)。

我也看到了一个常见的答案:“看看APIDemos,有很多例子。” 但据我所知,实际上没有animationGridView内容变化的例子。

任何帮助表示赞赏,谢谢。

Chet Haase提出了一个关于如何正确处理ListViewanimation的好video。 基本概念可以应用于GridViews。 你可以在这里findvideo。

如果您正在开发API 1.0+,除非使用NineOldAndroid,否则将无法使用video提到的引用animationfunction(如ViewPropertyAnimator )。

我认为对于AdapterViews,ViewGroup的LayoutTransition将不起作用。 查看源代码,ViewGroup确保调用addViewremoveView发生其他子addView的转换animation,但派生的AdapterView不使用这些方法,因为它依赖于提供视图的适配器。

上面提到的Chet Haase的video是关于一个正在消失的ListView的单个子视图的animation,而不是animation化所有其他周围的子视图来填补空白。

而且,如果我理解正确的话,GridLayoutAnimationController是关于填充(即第一次或整个列表的完整重新布局,从空开始)的交错animation,而不是animation就地布局更改周围的孩子添加或删除后。 那么,孩子们是通过逐渐淡入,滑入还是旋转而出现的 – 从一开始到最后一直都是这样。

最后,build议解决scheme:如果您不需要基于适配器的视图,则可以切换到GridLayout或LinearLayout。 这就是animateLayoutChanges="true"的地方,“布局animation”演示总是使用什么。 注意LayoutTransition需要最小api级别11.而GridLayout需要api14。

在对.remove()做GridView的修改之后,你必须调用mGrid.startLayoutAnimation()。

GridView不会自动为你做。 你必须手动触发它;-)

我发现这个资源链接对处理其他布局视图(如LinearLayout等)的animation非常有帮助: http : //developer.android.com/training/animation/layout.html希望这可以帮助。 你也可以看看https://github.com/nhaarman/ListViewAnimations获取灵感;