zoukankan      html  css  js  c++  java
  • animation of android (3)

    视图动画,只有view可以使用。

    在android3.0以后,属性动画。

    ValueAnimation 可以记录属性变化的过程,所以他的对象是任何object。

    所以ValueAnimation 的真正目的就是对object的某个值做一系列根据setInterpolator的值变化函数。

    而ValueAnimation 有AnimatorUpdateListener的回调,以每个10ms的间隔,反馈随着时间的变化值。

    具体代码如下:

    package com.joyfulmath.animatatorsamples;
    
    import android.animation.ValueAnimator;
    import android.animation.ValueAnimator.AnimatorUpdateListener;
    import android.content.Context;
    import android.graphics.Canvas;
    import android.graphics.Paint;
    import android.graphics.Paint.Align;
    import android.graphics.Paint.FontMetrics;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.View;
    import android.view.animation.BounceInterpolator;
    
    public class ValueAnimationView extends View {
    
        private static final String TAG = "ValueAnimationView";
        private Context mContext = null;
        private Paint mPaint = null;
        private float mX = 0;
        float topY = 0;  
        private ValueAnimator mValueAnimator = null;
        public ValueAnimationView(Context context) {
            this(context, null);
        }
    
        public ValueAnimationView(Context context, AttributeSet attrs) {
            this(context, attrs, 0);
        }
    
        public ValueAnimationView(Context context, AttributeSet attrs, int defStyle) {
            super(context, attrs, defStyle);
            Log.d(TAG, "ValueAnimationView");
            mContext = context;
        }
        
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            Log.d(TAG, "onDraw:mX	"+mX);
            canvas.drawColor(0xffffff00);
            canvas.save();
            canvas.translate(0, 0);
            canvas.drawText(TAG, mX, mX-topY, mPaint);
            canvas.restore();
        }
    
        @Override
        protected void onAttachedToWindow() {
            super.onAttachedToWindow();
            Log.d(TAG, "onAttachedToWindow");
            mPaint = new Paint();
            mPaint.setTextSize(18);
            mPaint.setTextAlign(Align.LEFT);
            mPaint.setColor(0xffff0000);
            mPaint.setAntiAlias(true);
            FontMetrics fontMetrics = mPaint.getFontMetrics();
            topY = fontMetrics.top;  
            float ascentY = fontMetrics.ascent;  
            float descentY = fontMetrics.descent;  
            float bottomY = fontMetrics.bottom; 
            Log.d(TAG, "onAttachedToWindow fontMetrics  topY:" + topY
                    + "	 ascentY:" + ascentY + "	 descentY:" + descentY
                    + "	 bottomY:" + bottomY);
        }
    
        @Override
        protected void onDetachedFromWindow() {
            super.onDetachedFromWindow();
        }
        
        public void createAnimator()
        {
            if(mValueAnimator == null)
            {
                mValueAnimator = ValueAnimator.ofFloat(0.0f, 50.0f);
                mValueAnimator.setDuration(1000);
                mValueAnimator.setInterpolator(new BounceInterpolator());
                mValueAnimator.addUpdateListener(new AnimatorUpdateListener() {
                    
                    @Override
                    public void onAnimationUpdate(ValueAnimator animation) {
                        mX = (Float) animation.getAnimatedValue();
                        invalidate();
                    }
                });
            }
    
        }
        
        public void startValueAmimator()
        {
            Log.d(TAG, "startValueAmimator");
            createAnimator();
            mValueAnimator.start();
        }
    }

    上面的代码,是自定义view,实现动画的一个基础。

    关键就是每次OnDraw的时候,获取objcet动画的属性。

    而触发条件就是:

                mValueAnimator.addUpdateListener(new AnimatorUpdateListener() {
                    
                    @Override
                    public void onAnimationUpdate(ValueAnimator animation) {
                        mX = (Float) animation.getAnimatedValue();
                        invalidate();//触发onDraw
                    }
                });
            }

    所以valueObjcet的关键就是会在动画过程中改变object的属性,以此来决定如何通过这个变化来实现动画。

  • 相关阅读:
    Arctic Network POJ
    Journey CodeForces
    Free Goodies UVA
    MU Puzzle HDU
    Balance POJ
    1sting 大数 递推
    最大报销额 暴力。。
    洛谷P2826 LJJ的数学课
    2018年12月29日
    2018年12月28日
  • 原文地址:https://www.cnblogs.com/deman/p/4395842.html
Copyright © 2011-2022 走看看