跟甜同学一起搞一个退场动画,第一次播放没问题,第二次播放就发现有个view会先闪出来一下,然后再执行从0到1的alpha动画。但是代码里明明已经用setVisibility(INVISIBLE)隐藏这个view了,为什么没有生效呢?Google了一下,有人说要调一下clearAnimation(),试了一下果然好了。。。
那么为什么加上这句就好了呢?得去看看framework的代码了,首先看一下View的clearAnimation():
public void clearAnimation() {
if (mCurrentAnimation != null) {
mCurrentAnimation.detach();
}
mCurrentAnimation = null;
invalidateParentIfNeeded();
}主要就是把mCurrentAnimation这个变量置空。这个变量是protected类型的,外面使用的话要通过getAnimation()这个接口:
public Animation getAnimation() {
return mCurrentAnimation;
}搜了一下发现ViewGroup的dispatchDraw()里用到了这个方法来判断是否要drawChild(),如果getAnimation()不为空,即使mViewFlags不是VISIBLE也要画:
protected void dispatchDraw(Canvas canvas) {
... ...
if ((flags & FLAG_USE_CHILD_DRAWING_ORDER) == 0) {

在Android开发中遇到一个view在动画后无法正确隐藏的问题,通过调用clearAnimation()解决了setVisibility(INVISIBLE)无效的情况。文章探讨了动画结束时setFillAfter(true)导致的问题,并解释了clearAnimation()的作用。
最低0.47元/天 解锁文章
1825

被折叠的 条评论
为什么被折叠?



