本篇文章主要介绍了"打造简易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);到底做了什么?