TypeEvaluator
TypeEvaluator<T> interface 计算类型值 支持泛型
方法:T evaluate(float fraction, T startValue, T endValue)
就是用来计算属性值的,即可计算任意类型的值。
fraction 表示时间的比率。
实现类有: ArgbEvaluator ARGB颜色计算器
FloatEvaluator float型计算器
IntEvaluator int计算器
Interpolator
TimeInterpolator 时间插入器 接口,反应动画的运动速率。getInterpolation()根据一定算法,返回时间比率
Interpolator interface 继承自TimeInterpolator
AnimatorUpdateListener
onAnimationUpdate(ValueAnimator animation) { value = ()animation.getAnimatedValue();//此即为计算器和时间插值器计算结果值 }
复杂写法TypeEvaluator
@Override public void closeMenu() { FuzeLog.d(TAG, "closeMenu"); final ViewGroup.LayoutParams params = (ViewGroup.LayoutParams)themeGridView.getLayoutParams(); ViewProperty start = new ViewProperty(); start.scaleX = 1; start.scaleY = 1; start.TransX = 0; start.TransY = 0; ViewProperty end = new ViewProperty(); end.scaleX = 1.25f; end.scaleY = 1.25f; end.TransX = -236;//221-(599-1142*0.125) end.TransY = 68;//115-(161-919*0.125) ValueAnimator anim = ValueAnimator.ofObject(viewEvaluator,start,end);//ValueAnimator.ofFloat(1,1.25f); anim.setDuration(300); anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { ViewProperty value = (ViewProperty)animation.getAnimatedValue(); themeGridView.setScaleX(value.scaleX); themeGridView.setScaleY(value.scaleY); themeGridView.setTranslationX(value.TransX); themeGridView.setTranslationY(value.TransY); } }); anim.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { params.height = 770;//965/1.25 } @Override public void onAnimationRepeat(Animator animation) { } @Override public void onAnimationEnd(Animator animation) { } @Override public void onAnimationCancel(Animator animation) { } }); anim.start(); } class ViewProperty{ float scaleX; float scaleY; int TransX; int TransY; } private TypeEvaluator<ViewProperty> viewEvaluator = new TypeEvaluator<ViewProperty>() { @Override public ViewProperty evaluate(float fraction, ViewProperty startValue, ViewProperty endValue) { float cScaleX =startValue.scaleX + (endValue.scaleX - startValue.scaleX)*fraction; float cScaleY =startValue.scaleY + (endValue.scaleY - startValue.scaleY)*fraction; int cTransX = startValue.TransX + (int)((endValue.TransX - startValue.TransX)*fraction); int cTransY = startValue.TransY + (int)((endValue.TransY - startValue.TransY)*fraction); ViewProperty cVP = new ViewProperty(); cVP.scaleX = cScaleX; cVP.scaleY = cScaleY; cVP.TransX = cTransX; cVP.TransY = cTransY; return cVP; } };