Android:onAnimationStart和onAnimationEnd对于自定义LinearLayout被执行两次

时间:2018-12-04 11:46:02

标签: android android-animation

我已发布herehere这个问题之前进行过搜索。

问题已得到回答,但是即使我将ObjectAnimatorAnimatorListener一起使用,问题仍然存在。因此发布这个问题。

我已扩展LinearLayout以创建自定义视图。在活动中显示此视图时,我添加了淡入淡出的动画以显示该视图。此视图的动画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);

我观察到onAnimationStart:中的错误日志语句onAnimationEnd:logcat被显示两次。

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

有人可以告诉我我在做什么错吗?

提前谢谢!

1 个答案:

答案 0 :(得分:0)

最后,我找出并解决了这个问题。

我认为视图已准备好以视图生命周期的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方法中删除了动画逻辑,并自行处理了它的活动。现在,它正在按预期工作。

因此,我了解到在onLayout方法中不建议开始或将动画设置为视图。

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