View的刷新动画实现

目的:实现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)

你可能感兴趣的:(view刷新动画)