1、使用属性动画
ObjectAnimator animator = ObjectAnimator.ofFloat(view, "x", 0f, 360f);
animator.setDuration(1000);
animator.start();
以上是使用属性动画的简单例子,从start方法开始执行
2、ObjectAnimator.start
//ObjectAnimator.start
public void start() {
AnimationHandler.getInstance().autoCancelBasedOn(this);
super.start();
}
//ValueAnimator.start
public void start() {
start(false);
}
private void start(boolean playBackwards) {
if (Looper.myLooper() == null) {
throw new AndroidRuntimeException("Animators may only be run on Looper threads");
}
//一大段代码做状态设置,省略了
....
addAnimationCallback(0); //见3
if (mStartDelay == 0 || mSeekFraction >= 0 || mReversing) {
startAnimation();
if (mSeekFraction == -1) {
setCurrentPlayTime(0);
} else {
setCurrentFraction(mSeekFraction);
}
}
}
主要是设置下状态属性,addAnimationCallback(0)跟踪进去
3、ValueAnimator.addAnimationCallback
private void addAnimationCallback(long delay) {
if (!mSelfPulse) {
return;
}
//见4、5
getAnimationHandler().addAnimationFrameCallback(this, delay);
//这里的参数this是AnimationFrameCallback接口的实现,ValueAnimator实现了该接口
}
4、getAnimationHandler
public AnimationHandler getAnimationHandler() {
return AnimationHandler.getInstance();
}
public static AnimationHandler getInstance() {
if (sAnimatorHandler.get() == null) {
sAnimatorHandler.set(new AnimationHandler());
}
return sAnimatorHandler.get();
}
主要是获取当前线程的AnimationHandler实例
5、AnimationHandler.addAnimationFrameCallback
public void addAnimationFrameCallback(final AnimationFrameCallback callback, long delay) {
if (mAnimationCallbacks.size() == 0) {
// 见6
getProvider().postFrameCallback(mFrameCallback);//注意mFrameCallback
}
if (!mAnimationCallbacks.contains(callback)) {
mAnimationCallbacks.add(callback);
}
if (delay > 0) {
mDelayedCallbackStartTime.put(callback, (SystemClock.uptimeMillis() + delay));
}
}
//mFrameCallback的实现
private final Choreographer.FrameCallback mFrameCallback = new Choreographer.FrameCallback() {
@Override
public void doFrame(long frameTimeNanos) {
doAnimationFrame(getProvider().getFrameTime());
if (mAnimationCallbacks.size() > 0) {
getProvider().postFrameCallback(this);
}
}