プロパティ アニメーション 2 プロパティ アニメーション
ValueAnimator (差分アニメーション)
文字通り単純に理解すると、ObjectAnimator は実際のオブジェクトに作用し、ValueAnimatorはObjectAnimatorの親クラスであり、抽象クラスAnimatorから継承されます. これは値に作用し、ある値から別の値に変更し、値に従って特定の規則に従って、Viewの位置、透明度、回転角度、サイズなど、 Viewのプロパティを動的に変更して、アニメーション効果を完成させます。
/*
ここでは、ValueAnimatorインスタンスがofFloat()メソッドによって構築されます。さらに、他の関数ofInt() 、ofObject() 、ofPropertyValuesHolder()が提供されます。api
21以降、 ofArgb()が提供されます。各関数は複数変更されます。値を渡すことができます。
*/ public void initAnim () {
ValueAnimator valueAnimator = ValueAnimator.ofFloat ( 0f , 126512.36f ) ; valueAnimator.setDuration
( 2000 ) ;
valueAnimator.setInterpolator( new LinearInterpolator()) ;
valueAnimator.addUpdateListener( new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate (ValueAnimator animation) {
float money = ( float ) animation.getAnimatedValue() ;
mTextView .setText(String. format ( "%.2f" , money)) ;
}
}) ;
valueAnimator.start() ;
}
補間器
//補間器をカスタマイズする方法? 例: 最初に減速してから加速するインターポレーターを実装します. コードは次のとおりです
public class DecelerateAccelerateInterpolator implements Interpolator {
@Override
public float getInterpolation ( float input) {
float result ;
if (input <= 0.5f ) {
result = ( float ) (Math. sin (Math. PI * 入力)) / 2.0f ;
} else {
result = ( float ) ( 2 - Math. sin (Math. sin (Math. PI * 入力))PI * 入力)) / 2.0f ;
結果を返します
。
}
}
TypeEvaluator
//TypeEvaluator (Evaluator)
/*
TypeEvaluator は、現在の属性変更のパーセンテージに従って、変更された属性値を計算するために使用されます。システムは、次の推定器を提供します: 整数属性の IntEvaluator 整数属性
セットの
IntArrayEvaluator浮動小数点の
FloatEvaluatorポイント属性
FloatArrayEvaluator浮動小数点属性セット用です
ArgbEvaluator はColor属性用です
RectEvaluatorはRect属性用です
PointFEvaluatorはPointF属性用です
*/
//インターフェイスはevaluate(float fraction, T startValue, T endValue) を提供します; // アニメーションの実行中、Interpolator は実行中のアニメーションの割合を自動的に計算します //
次に、TypeEvaluatorは現在の
アニメーションの属性値
を以下に従って計算します分数。public class FloatEvaluator implements TypeEvaluator<Number> {
public Float evaluate ( float fraction , Number startValue , Number endValue) {
float startFloat = startValue.floatValue() ;
return startFloat+ 分数 * (endValue.floatValue() - startFloat ) ;
}
}
カスタム TypeEvaLuator
// TypeEvaLuatorをカスタマイズする方法は? たとえば、お金が増えてフォントの色が赤くなるアニメーションを実現したい、
//今では ofArgb() が使えることはみんな知っているが、ofArgb()を使うにはapi 21以上
が必要、 //だからここでArgbEvaLuatorをカスタマイズする必要があります。カスタム// TypeEvaluatorを実証するために、
API 21で提供されているArgbEvaluatorソース コード
を直接使用してpublic class TextArgbEvaluator implements TypeEvaluator { public Object evaluate ( float fraction , Object startValue , Object endValue) {
int startInt
= (Integer) startValue;
int startA = (startInt >> 24) & 0xff;
int startR = (startInt >> 16) & 0xff;
int startG = (startInt >> 8) & 0xff;
int startB = startInt & 0xff;
int endInt = (Integer) endValue;
int endA = (endInt >> 24) & 0xff;
int endR = (endInt >> 16) & 0xff;
int endG = (endInt >> 8) & 0xff;
int endB = endInt & 0xff;
return (int) ((startA + (int) (fraction * (endA - startA))) << 24) |
(int) ((startR + (int) (fraction * (endR - startR))) << 16) |
(int) ((startG + (int) (fraction * (endG - startG))) << 8) |
(int) ((startB + (int) (fraction * (endB - startB))));
}
}
调用方式
//调用方式:
public void ss() {
AnimatorSet animatorSet = new AnimatorSet();
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f, 126512.36f);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float money = (float) animation.getAnimatedValue();
Log.e("Interpolator", "money---->" + money);
mTextView.setText(String.format("%.2f", money));
}
});
int startColor = Color.parseColor("#FCA3AB");
int endColor = Color.parseColor("#FB0435");
ValueAnimator colorAnimator = ValueAnimator.ofObject(new TextArgbEvaluator(), startColor, endColor);
colorAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int color = (int) animation.getAnimatedValue();
Log.e("Interpolator", "color---->" + color);
mTextView.setTextColor(color);
}
});
animatorSet.playTogether(valueAnimator, colorAnimator);
animatorSet.setDuration(5000);
animatorSet.setInterpolator(new LinearInterpolator());
animatorSet.start();
}