最近想做一个自定义的动画效果,第一个想到的方式是继承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,什么什么的……