【问题标题】:Managing Animator lifecycle from within custom view in custom list adapter从自定义列表适配器的自定义视图中管理 Animator 生命周期
【发布时间】:2016-06-06 03:58:15
【问题描述】:

我有一个自动动画的自定义视图。它使用AnimatorSetonAnimationEnd() 中调用Animator.start() 以便无休止地重复。这会在创建视图时自动启动。

这些视图用于ListAdapter(实际上是SackOfViewsAdapter,因此不会进行回收)。因此,管理何时取消(或暂停)动画非常重要。

也许动画师应该向适配器注册,然后Activity 应该调用该适配器上的某个方法来取消任何动画?

另一个想法是在onAnimationEnd() 中检查View isShowing() 是否(即如果没有显示,则不要重新启动动画)但是当View 重新出现时这会导致问题。

这对我来说似乎有点 hacky,所以如果有更好的解决方案,我很感兴趣。

另外,如果动画师暂停会怎样?估计不会被垃圾回收吧?

【问题讨论】:

  • View#onDetachedFromWindow ?
  • 这似乎很好地解决了问题,谢谢。我想在onAttachedToWindow 中开始动画以保持对称性并处理视图重新附加到窗口的情况是有意义的。虽然它并不完美,因为动画仍然需要在Activity.onPause 中停止/暂停,这意味着动画师仍然需要以某种方式进行跟踪。哦,我猜onWindowVisibilityChanged 会解决这个问题。

标签: android android-animation android-custom-view


【解决方案1】:

如果您使用简单的ListAdapter,您只需在适配器的getView 中启动动画并丢弃其他所有内容。当一个新的单元格出现在屏幕上时,它将显示一个新开始的动画,并且当单元格被重新使用时,无需取消离开屏幕的单元格上的动画。

【讨论】:

  • 谢谢,是的,对于普通的 ListAdapter 来说确实如此,但在我的情况下,使用 SackOfViewsAdapter 对我来说更有利,所以我需要处理这种情况。关于适配器的整个事情在这里有点误导。当这些动画师可能嵌套在视图层次结构中时,我真的在寻找一种管理动画生命周期的方法。
【解决方案2】:

注意:感谢pskink's comment 指路。

看起来View#onWindowVisibilityChangedView#onDetachedFromWindow 是去这里的最佳方式。在前者中,暂停/恢复动画制作(根据可见性是否为View#VISIBLE)。在后者中,取消动画师。

根据您的用例,也许还可以在 View#onAttachedToWindow 中启动动画师。

我不会将此标记为已接受,以防万一有人有更好的解决方案。

【讨论】:

    【解决方案3】:
    @Override
    public void onVisibilityAggregated(boolean isVisible) {
        super.onVisibilityAggregated(isVisible);
        if (isVisible) {} //Animator.start() 
        else {} //Animator.cancel()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-31
      • 2012-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多