【问题标题】:Android animate() doesn't update the UIAndroid animate() 不更新 UI
【发布时间】:2013-07-29 17:00:55
【问题描述】:

我尝试自己实现SwipeListView 之类的东西。 因此,我必须在与 ListView 项目交互时对其进行动画处理。 我在拖动 ListView 项目时使用ViewPropertyAnimator API 来做到这一点:

ListView parent_list_view = ...;
View list_view_item = ...;
int destination = ...;
long animation_time = ...;

list_view_item.animate().translationX(destination).setDuration(animation_time)
    .setListener(new AnimatorListenerAdapter() {
        @Override
        public void onAnimationEnd(Animator animation) {
            System.out.println("animation ended");
            //...
            parent_list_view.invalidate();  //TODO: this can't be the solution
        }
    });

很遗憾,这并没有按预期工作。

如果没有使父 ListView 无效的行,我在 UI 中看不到任何变化,但一段时间后在控制台上获得“动画结束”输出。在下一次用户交互(例如触摸屏幕)时,项目直接跳转到目标位置(没有动画)。 我介绍了使父项无效的行,以使项目在完成动画后“自行”跳转到其目的地。 不过,这不是我想要的行为。

在我看来,该项目在执行动画时并未使其自身或父视图无效。因此,UI 没有更新,我看到了项目视图的旧状态。执行任何用户交互(例如触摸屏幕)时,视图会失效并正确重绘。

我现在对这个问题进行了一段时间的调查,但不知道在哪里继续寻找错误。我知道,如果没有所有代码,很难调试这个问题。对此我很抱歉,但目前提取相关部分会非常困难。尽管如此,所有关于这个问题的建议都受到高度赞赏。也许我只是忘记了一些愚蠢的事情......

【问题讨论】:

    标签: android animation user-interface view invalidation


    【解决方案1】:

    【讨论】:

    • 感谢您的帮助。我之前看过这个视频,但第二次看到它,给了我一个关于如何为我的问题实施更好的解决方法的提示。现在我将OnPreDrawListener 添加到我的父ListView 的ViewTreeObserver。在它的 onPreDraw() 方法中,如果动画由任何项目执行,我将调用 parent.invalidateViews()。我现在可以看到动画,但我怀疑它是否是最佳解决方案。更多想法?
    猜你喜欢
    • 2015-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-28
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    相关资源
    最近更新 更多