Android 2.x自定义属性动画ValueAnimator

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gaoyucindy/article/details/38873749

模仿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);
	    }
}


猜你喜欢

转载自blog.csdn.net/gaoyucindy/article/details/38873749