ASP源码.NET源码PHP源码JSP源码JAVA源码DELPHI源码PB源码VC源码VB源码Android源码
当前位置:首页 >> 低调看直播体育app软件下载 >> Android开发 >> 打造简易NineoldAndroids动画库,深入理解Android动画原理

打造简易NineoldAndroids动画库,深入理解Android动画原理(6/6)

来源:网络整理     时间:2015-11-15     关键词:队列,Exception,Git,Activity

本篇文章主要介绍了"打造简易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

    相关图片

    相关文章