Android:onAnimationStart 和 onAnimationEnd 为自定义 LinearLayout 执行了两次

Android: onAnimationStart and onAnimationEnd are getting executed twice for custom LinearLayout

我在发布这个问题之前进行了搜索 and here

问题已回答,但即使我使用 ObjectAnimatorAnimatorListener 问题仍然存在。因此发布这个问题。

我已扩展 LinearLayout 以创建自定义视图。在 activity 中显示此视图时,我添加了淡入淡出动画来显示此视图。此视图的动画完成后 onAnimationEnd,有一些业务逻辑只需执行一次。由于 onAnimationEnd 方法执行了两次,应用程序崩溃了。代码如下所示。

Animation animation = AnimationUtils.loadAnimation(getContext(), animResource);
animation.setDuration(animDuration);
animation.setAnimationListener(new Animation.AnimationListener() {
    @Override
    public void onAnimationStart(Animation animation) {
        Log.e(TAG, "onAnimationStart: ");
    }

    @Override
    public void onAnimationEnd(Animation animation) {
        Log.e(TAG, "onAnimationEnd: ");
        // my business logic goes here
    }

    @Override
    public void onAnimationRepeat(Animation animation) {
        Log.e(TAG, "onAnimationRepeat");
    }
});
linearLayout.startAnimation(animation);

我发现 logcat 中的错误日志语句 onAnimationStart:onAnimationEnd: 显示了两次。

12-04 17:33:16.899 16980-16980/com.myapp E/Anim: onAnimationStart: android.view.animation.AnimationSet@87af0ac
12-04 17:33:17.229 16980-16980/com.myapp E/Anim: onAnimationEnd: com.myapp.views.CustomLinearLayout@518a944

12-04 17:33:17.690 16980-16980/com.myapp E/Anim: onAnimationStart: android.view.animation.AnimationSet@87af0ac
12-04 17:33:18.097 16980-16980/com.myapp E/Anim: onAnimationEnd: com.myapp.views.CustomLinearLayout@518a944

谁能告诉我我做错了什么?

提前致谢!!

终于想通了,解决了问题。

我认为视图已准备好在视图生命周期的 onLayout 方法中对最终用户可见。因此,我重写了 onLayout 方法并将动画逻辑保留在其中。

@Override
public void onLayout(boolean changed, int left, int top, int right, int bottom) {
    if (changed) {
        // Added animation logic
    }
}

当我调试代码时,我发现 onLayout 方法在我的案例中被调用了两次。谷歌搜索后,我发现它被多次调用以根据其所有父视图定位此视图。

如果 if (changed) 条件被移除,它将被调用 5 次。

我从 onLayout 方法中删除了动画逻辑并 activity 自己处理了它。现在,它正在按预期工作。

所以,我了解到在 onLayout 方法中不建议启动或设置动画到视图。

希望我的理解是正确的。如果我的理解有误,请指正。