本篇文章主要介绍了"打造简易NineoldAndroids动画库,深入理解Android动画原理",主要涉及到队列,Exception,Git,Activity方面的内容,对于Android开发感兴趣的同学可以参考一下:
简介NineoldAndroids是Github上一个着名的动画库,简单来说,NineOldAndroids是一个向下兼容的动画库,主要是使低于API 11的系...
/**
* 根据当前时间,计算运行百分比,然后调用animateValue更新当前属性值
* @param currentTime
* @return
*/boolean animationFrame(long currentTime) {
boolean done = false;
if (mPlayingState == STOPPED) {
mPlayingState = RUNNING;
if (mSeekTime < 0) {
mStartTime = currentTime;
} else {
mStartTime = currentTime - mSeekTime;
// Now that we're playing, reset the seek time
mSeekTime = -1;
}
}
switch (mPlayingState) {
case RUNNING:
case SEEKED:
float fraction = mDuration > 0 ? (float)(currentTime - mStartTime) / mDuration : 1f;
if (fraction >= 1f) {//百分比大于1,结束动画
done = true;
fraction = Math.min(fraction, 1.0f);
}
animateValue(fraction);
break;
}
return done;
}
这个方法会根据当前时间,判断动画是否已经结束,如果是,返回true,这些动画就会进入sEndingAnims队列,做最后的结束通知工作。
否则,其实就是调用了自己的CPropertyValuesHolder计算当前属性值
/**
* 根据百分比,更新属性值
* @param fraction
*/void animateValue(float fraction) {
fraction = mInterpolator.getInterpolation(fraction);
mCurrentFraction = fraction;
int numValues = mValues.length;
for (int i = 0; i < numValues; ++i) {
mValues[i].calculateValue(fraction);//让CPropertyValuesHolder计算属性值
}
//通知监听器,属性值更新if (mUpdateListeners != null) {
int numListeners = mUpdateListeners.size();
for (int i = 0; i < numListeners; ++i) {
mUpdateListeners.get(i).onAnimationUpdate(this);
}
}
}
3、新的属性值计算结束
走完两个case,新的属性值就计算出来了,我们通过getAnimatedValue()就可以拿到
/**
* 获取当前属性值
* @return
*/public Object getAnimatedValue() {
if (mValues != null && mValues.length > 0) {
return mValues[0].getAnimatedValue();
}
// Shouldn't get here; should always have values unless ValueAnimator was set up wrongreturnnull;
}
那么怎么让动画继续计算下一个属性值呢?
注意最后
// If there are still active or delayed animations, call the handler again
// after the frameDelay
//如果还有活动的动画,在默认每帧间隔时间以后,再次调用,更新属性值
if (callAgain && (!animations.isEmpty())) {
sendEmptyMessageDelayed(ANIMATION_FRAME, Math.max(0, sFrameDelay -
(AnimationUtils.currentAnimationTimeMillis() - currentTime)));
}
也就是在规定的帧间隔以后,AnimationHandler给自己再次发送一个ANIMATION_FRAME消息,进行下一次属性值的计算。
最后,如上面所说,animationFrame()返回true,才真正结束动画!
写在最后
到此为止,我要介绍的内容就说完了。
大家只要了解关键帧CKeyframe,CPropertyValuesHolder,估值算法CTypeEvaluator,以及使用handler循环计算动画值的原理
就应该可以了解到NineoldAndroids动画库设计的核心。
文章以及将NineoldAndroids的代码做了很多精简,就是希望大家可以明白本质,如果还有疑问的地方,可以下载我的测试代码,运行感受一下下。
也可以给我留言,一起探讨。
源码下载地址(manimation包是我精简过的代码,animation,util,view三个包中的,是NineoldAndroids的代码,大家可以对比看看)。
').addClass('pre-numbering').hide();
$(this).addClass('has-numbering').parent().append($numbering);
for (i = 1; i <= lines; i++) {
$numbering.append($('
').text(i));
};
$numbering.fadeIn(1700);
});
});
以上就介绍了打造简易NineoldAndroids动画库,深入理解Android动画原理,包括了队列,Exception,Git,Activity方面的内容,希望对Android开发有兴趣的朋友有所帮助。
本文网址链接:http://www.codes51.com/article/detail_219638_6.html