模仿3.0的ValueAnimator动画写的属性动画,实现基本功能
使用方法与ValueAnimator相同,直接上源码了!
import android.os.Handler;
import android.os.Message;
import android.view.animation.AccelerateDecelerateInterpolator;
import android.view.animation.Interpolator;
/**
* 属性动画-精简版...
* @author gy
* @date 2014-5-8下午3:01:51
*/
public class ValueAnim {
private static final int SPACETIME=20;
private static final int STATE_START=0;
private static final int SATTE_END=1;
private static final int STATE_UPDATE=2;
private long duration;//动画时长
private Interpolator interpolator;
private AnimationListener listener;
private AnimatorUpdateListener updateListener;
private float start,end;//开始结束数值
public ValueAnim()
{
this(0, 0);
}
public ValueAnim(float start,float end)
{
this(start,end,new AccelerateDecelerateInterpolator());
}
public ValueAnim(float start,float end,Interpolator interpolator)
{
this.start=start;
this.end=end;
this.interpolator=interpolator;
}
public void setDuration(long duration) {
this.duration = duration;
}
public void setInterpolator(Interpolator interpolator) {
this.interpolator = interpolator;
}
public void setAnimListener(AnimationListener listener) {
this.listener = listener;
}
/**
* function: 开始值
*
* @param start
*
* @ author:gaoyu 2014-8-14 下午3:33:36
*/
public void setStart(float start) {
this.start = start;
}
public void setEnd(float end) {
this.end = end;
}
public void setAnimatorUpdateListener(AnimatorUpdateListener updateListener) {
this.updateListener = updateListener;
}
public void start()
{
new Thread(runnable).start();
}
Runnable runnable=new Runnable() {
@Override
public void run() {
handler.sendMessage(handler.obtainMessage(STATE_START));
long time=0;
float currentValue;
float total=end-start;//变化的总量
while (time<duration) {
//计算当前时间相对总时间的值
float in=(float)time/duration;
//根据interpolator获得处理过的相对值
float out=interpolator.getInterpolation(in);
//开始值+相对值*总量->当前时间的值
currentValue=start+total*out;
//通知更新
handler.sendMessage(handler.obtainMessage(STATE_UPDATE, currentValue));
//增加时间
time+=SPACETIME;
try {
Thread.sleep(SPACETIME);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//结束
currentValue=end;
handler.sendMessage(handler.obtainMessage(STATE_UPDATE, currentValue));
handler.sendMessage(handler.obtainMessage(SATTE_END));
}
};
Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case STATE_START:
if (listener!=null) {
listener.onAnimationStart(ValueAnim.this);
}
break;
case SATTE_END:
if (listener!=null) {
listener.onAnimationEnd(ValueAnim.this);
}
break;
case STATE_UPDATE:
if (updateListener!=null) {
updateListener.onAnimationUpdate((Float) msg.obj);
}
break;
}
}
};
/**
* function: 动画更新监听
*
* @ author:gaoyu
*/
public interface AnimatorUpdateListener {
void onAnimationUpdate(float currentValue);
}
/**
* function: 动画开始结束监听
*
* @ author:gaoyu
*/
public interface AnimationListener {
void onAnimationStart(ValueAnim animation);
void onAnimationEnd(ValueAnim animation);
}
}