目的:实现android window里的View动画
实现:View动画一般情况下首先考虑的就是Tween(补间)、Frame(帧)动画,和api11后才支持的属性动画(ValueAnimator)。但是若是要实现简单的自定义绘制然后刷新的动画,以上方法就不适用,本文仅讨论自定义画笔绘制的刷新动画。
用到的方法就是自定义类继承View,重写onDraw方法,用postInvalidateDelayed延时通知UI线程invalidate(),然后实现动画。
步骤:
1. 自定义类继承View
class MyDrawView extends View{
...
// 定义一个开关量
protected boolean bePlay = false;
protected float progress = 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。
public MyLayout extends ViewGroup {
onFinishInflate(){
myDrawView = new MyDrawView(); //创建MyDrawView对象
}
某调用方法() {
myDrawView.bePlay = true;
// 可加入progress的自定制语句
myDrawView.invalidate(); //该处就调用了onDraw方法,由此就启动刷新动画。
}
}
自此可用Java代码来绘制View的刷新动画,但是效率方面还是有待考量的。希望能帮到大家。
补充说下笔者之前实现遇到的问题:
之前笔者在ui线程中使用类似循环判断进度值的方法,不断invalidate() 或在非UI线程循环postInvalidate() .导致的结果就是只能显示最后一次的invalidate效果。后来笔者用按钮来驱动一帧一帧刷新invalidate,就可以间断实现。
笔者判断UI线程需要在空闲的时候才能处理invalidate返回的绘制结果,从而刷新View。若UI线程一直被占用则无法处理,故上文中才使用postInvalidateDelayed(哪怕只有1ms)
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。