【问题标题】:Android: Animating changes to GridView contentAndroid:对 GridView 内容进行动画更改
【发布时间】:2013-04-08 23:31:50
【问题描述】:

我有一个布局的 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 内容更改的示例。

感谢您的帮助。

【问题讨论】:

  • 您要添加什么类型的动画?添加 xml 属性“animateLayoutChanges = true”将为几乎任何视图提供一些基本的流体动画。
  • 这是我尝试的第一件事,不幸的是它不起作用。
  • 五月,我知道如何停止这个动画了。

标签: android


【解决方案1】:

Chet Haase 发布了一个关于如何正确处理 ListView 动画的精彩视频。基本概念可以应用于 GridViews。你可以找到视频here

如果您正在为 API 1.0+ 进行开发,您将无法使用视频中提到的引用动画功能(例如 ViewPropertyAnimator),除非您使用 NineOldAndroids

【讨论】:

    【解决方案2】:

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

    上面提到的 Chet Haase 的视频是关于对正在消失的 ListView 的单个子视图进行动画处理,而不是对所有其他周围的子视图进行动画处理以填补空白。

    而且,如果我理解正确的话,GridLayoutAnimationController 是关于孩子们填写时的交错动画(即第一次或整个列表的完整重新布局,从空开始),而不是就地动画添加或删除后周围子项的布局更改。所以,孩子们是通过淡入、滑入或旋转出现的吗?总是一次一个,从第一个到最后一个。

    最后,一个建议的解决方案:如果您不需要基于适配器的视图,您可以切换到 GridLayout 或 LinearLayout。这就是animateLayoutChanges="true" 将起作用的地方,以及“布局动画”演示始终使用的内容。 注意 LayoutTransition 需要最低 api 级别 11。而 GridLayout 需要 api14。

    【讨论】:

      【解决方案3】:

      在您对 GridView 进行任何更改后,例如 .remove() 你必须调用 mGrid.startLayoutAnimation();

      GridView 不会自动为您执行此操作。你必须手动触发它;-)

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2021-07-10
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-01-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多