View的刷新动画实现
目的:实现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)
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。