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

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

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

本篇文章主要介绍了"打造简易NineoldAndroids动画库,深入理解Android动画原理",主要涉及到队列,Exception,Git,Activity方面的内容,对于Android开发感兴趣的同学可以参考一下: 简介NineoldAndroids是Github上一个着名的动画库,简单来说,NineOldAndroids是一个向下兼容的动画库,主要是使低于API 11的系...

顾名思义,CPropertyValuesHolder就是持有属性和值得一个类。
CPropertyValuesHolder是动画库中的一个核心类,但是在本简易库削减了其功能,因为我们只需要实现值得变化,没有针对具体的属性,例如scale,rotate等,所以不需要提供View属性修改的方法。
其实这个类,是为ObjectAnimator做了比较大的准备,但是本篇文章不涉及。
我们关注的是,这个类持有CKeyFrameSet。

publicclassCPropertyValuesHolderimplementsCloneable {/**
     * 属性名称
     */
    String mPropertyName;
    /**
     * 关键帧集合
     */
    CKeyframeSet mKeyframeSet = null;
    privatestaticfinal CTypeEvaluator sIntEvaluator = new IntCEvaluator();
    privatestaticfinal CTypeEvaluator sFloatEvaluator = new FloatCEvaluator();
    private CTypeEvaluator mEvaluator = sIntEvaluator;
    /**
     * 属性值
     */private Object mAnimatedValue;
    /**
     * 属性值类型 
     */
    Class mValueType;

    privateCPropertyValuesHolder(String propertyName) {
        mPropertyName = propertyName;
    }

    /**
     * 返回一个属性值类型为int的CPropertyValuesHolder
     * @param propertyName
     * @param values
     * @return
     */publicstatic CPropertyValuesHolder ofInt(String propertyName, int... values) {
        returnnew IntCPropertyValuesHolder(propertyName, values);
    }

    /**
     * 属性值类型为int的CPropertyValuesHolder
     */static class IntCPropertyValuesHolder extends CPropertyValuesHolder {
        IntCKeyframeSet mIntKeyframeSet;
        publicIntCPropertyValuesHolder(String propertyName, int... values) {
            super(propertyName);
            setIntValues(values);
        }

        @OverridepublicvoidsetIntValues(int... values) {
            super.setIntValues(values);
            mIntKeyframeSet = (IntCKeyframeSet) mKeyframeSet;
        }
    }

    /**
     * 返回当前属性值
     * @return
     */
    Object getAnimatedValue() {
        return mAnimatedValue;
    }

    /**
     * 设置属性值类型,这里具体到int类型
     * 对于每个Int类型值,例如100,200,1000
     * 生成一个CKeyFrame关键帧对象,并且将这些对象包装成一个set集合
     * @param values
     */publicvoidsetIntValues(int... values) {
        mValueType = int.class;
        mKeyframeSet = CKeyframeSet.ofInt(values);
    }

    void init() {
        if (mEvaluator == null) {
            // We already handle int and float automatically, but not their Object// equivalents
            mEvaluator = (mValueType == Integer.class) ? sIntEvaluator :
                    (mValueType == Float.class) ? sFloatEvaluator :
                            null;
        }
        if (mEvaluator != null) {
            // KeyframeSet knows how to evaluate the common types - only give it a custom// evaluator if one has been set on this class
            mKeyframeSet.setEvaluator(mEvaluator);
        }
    }

    /**
     * 让CKeyframeSet通过关键帧计算属性值
     * @param fraction
     */void calculateValue(float fraction) {
        mAnimatedValue = mKeyframeSet.getValue(fraction);
    }
}

1.5、CValueAnimator.ofInt(1000,2000,3000);到底做了什么?

相关图片

相关文章