Android:onAnimationStart 和 onAnimationEnd 为自定义 LinearLayout 执行了两次
Android: onAnimationStart and onAnimationEnd are getting executed twice for custom LinearLayout
我在发布这个问题之前进行了搜索 and here。
问题已回答,但即使我使用 ObjectAnimator
和 AnimatorListener
问题仍然存在。因此发布这个问题。
我已扩展 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
方法中不建议启动或设置动画到视图。
希望我的理解是正确的。如果我的理解有误,请指正。
我在发布这个问题之前进行了搜索
问题已回答,但即使我使用 ObjectAnimator
和 AnimatorListener
问题仍然存在。因此发布这个问题。
我已扩展 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
方法中不建议启动或设置动画到视图。
希望我的理解是正确的。如果我的理解有误,请指正。