目的:实现androidwindow里的View动画

实现:View动画一般情况下首先考虑的就是Tween(补间)、Frame(帧)动画,和api11后才支持的属性动画(ValueAnimator)。但是若是要实现简单的自定义绘制然后刷新的动画,以上方法就不适用,本文仅讨论自定义画笔绘制的刷新动画。

用到的方法就是自定义类继承View,重写onDraw方法,用postInvalidateDelayed延时通知UI线程invalidate(),然后实现动画。

步骤:

1.自定义类继承View

classMyDrawViewextendsView{

...

//定义一个开关量

protectedbooleanbePlay=false;

protectedfloatprogress=0f;//进度值,此处定义为0f~1f

//重写onDraw

@Override

onDraw(){

if(bePlay){

//用paint在Canvas上,画自己需要的简单图形,当然也可以结合Bitmap取图片变形等。

//progress赋下一次的进度值

if(progress<=1f){

this.postInvalidateDelayed(10);//延时10ms,此部分自己控制

}else{

progress=0f;

bePlay=false;

}

}

}

...

}

2.在需要用到的地方,创建该View。

publicMyLayoutextendsViewGroup{

onFinishInflate(){

myDrawView=newMyDrawView();//创建MyDrawView对象

}

某调用方法(){

myDrawView.bePlay=true;

//可加入progress的自定制语句

myDrawView.invalidate();//该处就调用了onDraw方法,由此就启动刷新动画。

}

}

自此可用Java代码来绘制View的刷新动画,但是效率方面还是有待考量的。希望能帮到大家。

补充说下笔者之前实现遇到的问题:

之前笔者在ui线程中使用类似循环判断进度值的方法,不断invalidate()或在非UI线程循环postInvalidate().导致的结果就是只能显示最后一次的invalidate效果。后来笔者用按钮来驱动一帧一帧刷新invalidate,就可以间断实现。

笔者判断UI线程需要在空闲的时候才能处理invalidate返回的绘制结果,从而刷新View。若UI线程一直被占用则无法处理,故上文中才使用postInvalidateDelayed(哪怕只有1ms)