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

来源:互联网 发布:运动服淘宝 编辑:程序博客网 时间:2024/05/22 07:03

模仿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() {@Overridepublic 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(){@Overridepublic 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);    }}


0 0
原创粉丝点击