最近想做一个自定义的动画效果,第一个想到的方式是继承Animation,利用它的applyTransformation这个方法来实现,其实也可以自己写线程,定时抛一个事件来处理,其实是一样的,只是直接继承这个很方便。

// 先定义一下动画
Animation myAnimation = new Animation() {
    @Override
    protected void applyTransformation(float interpolatedTime, Transformation t) {
        // interpolatedTime: [0.0, 1.0] 表示动画执行进度
        // 利用这个值,做一点自己想做的事情就好了
    }
};

myAnimation.setDuration(500);
someView.startAnimation(myAnimation);

理论上来说,这样调用完就ok了,接下来系统会调用applyTransformation来做我想做的事情,结果却不起作用。

我还试了一下将上面这一坨代码放到post(Runnable)去执行,结果依然不行。

在三观都快崩溃的时候,发现,我整个someView好像是invisible的,可能和这个有关,我就换了一个别的View来start这个动画。

诶!就TM好了……

其实这里不管什么view来startAnimation都是一样的,只是想借用Animation的applyTransformation来做一些事情。

但是没想到startAnimation的时候,如果这个View是不可见的,或者是gone的,就会导致传进去的Animation对象不执行。嗯,这是一个坑。

看了一下View里面的源码,发现确实有一些地方判断了如果不是visible的,那么就不调用invalidate方法,也就不会去处理Animation的事情。

以后startAnimation的时候,一定要选一个总是可见的View哦,比如topBar,什么什么的……


krosshj
152 声望16 粉丝

Developer, Gamer, Artist