又一个对时间的映射
( 如作用于UI时:形态(x,y,z),颜色等:Measure,Layout,(on)Draw(); )
属性动画:(反射)getPropertyInitialValue(),setProperty(ObjectAnimator时) //‘估值器’
ValueAnimator(时刻捕捉器).ofObject(估值器:值变方式).setDuration().start() // (Interpolator(插值器,控制值变速率:属性动画(Animator.setInterpolator()),默认InterpolatorAccelerateDecelerateInterpolator).getInterpolation(float input:[0,1])){return fraction[0,1];//值变进度} ---> (估值器类型:Object)TypeEvaluator.evaluate(float fraction,估值器 startValue,估值器 endValue)//值域
ValueAnimator.getAnimatedFraction()/ (Object:估值器类型)getAnimatedValue()
ValueAnimator.addListener(AnimatorListener{start; cancel; repeat; end; }) //低频捕捉
ValueAnimator.addUpdateListener()//高频 (s)=插值器(值变进度)的变化频率: 变化域内有效元素个数(变化次数/帧数)/duration=平均变化频率(线性插值器)
如V里@Override protected void onDraw(Canvas canvas) {
if (currentPoint == null) {
currentPoint = new Point(RADIUS, RADIUS);
drawCircle(canvas);
startAnimation();
} else {
drawCircle(canvas);
}
}
void drawCircle(Canvas canvas) {
float x = currentPoint.getX();
float y = currentPoint.getY();
canvas.drawCircle(x, y, RADIUS, mPaint);
}
void startAnimation(){
ValueAnimator anim = ValueAnimator.ofObject(new TypeEvaluator(){
@Override public Object evaluate(float fraction, Object startValue, Object endValue) {
Point startPoint = (Point) startValue;
Point endPoint = (Point) endValue;
float x = startPoint.getX() + fraction * (endPoint.getX() - startPoint.getX());
float y = startPoint.getY() + fraction * (endPoint.getY() - startPoint.getY());
Point point = new Point(x, y);
return point;
} } , new Point(getWidth() / 2, RADIUS), new Point(getWidth() / 2, getHeight() - RADIUS));
anim.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
currentPoint = (Point) animation.getAnimatedValue();
invalidate();//
}
});
anim.setInterpolator(new BounceInterpolator());//AccelerateInterpolator(2f),
anim.setDuration(3000);
anim.start();}
AnimatorSet().(play before with after )
ViewPropertyAnimator: V.animate().alpha(0f)...;//V专用
KeyFrame
KeyFrameSet
PropertyValuesHolder
Tween动画(父容器不断的绘制 view:父view每一帧都会重建,每次都是触发父view invalidate(区域),重建Canvas;view第一帧重建,动画启动时,View#invalidate设置了PFLAG_INVALIDATED标志,后续动画不会再重建;其它同级view不会重建Canvas,onDraw不会触发):矩阵变换 (Alpha)Animation(initialize(); applyTransformation(float interpolatedTime, Trasformation t(){t.getMatrix();Camera....}; ).setAnimationListener(start;repeat; end;)//低频 V.clearAnimation()
LayoutAnimation to VP: 依次作用于其子V。interval/delay,order
A.overridePendingTransition();//在start或finish后
FragmentTransaction.setCustomAnimations();
自定义ViewPager页面切换动画setPageTransformer(boolean, PageTransformer)
android:animateLayoutChanges="true",LinearLayout中添加View的动画,支持通过setLayoutTransition()自定义
AnimationDrawable.start;