AndroidはObjectAnimator、AnimatorSetのアニメーションを利用して弾球を描き、落下を加速させ、底部を押すと減速して弾を上げる...

18887 ワード

アトリビュートアニメーションの主なクラスの説明:
1.ValueAnimator:このクラスでは、アニメーションの計算値を実行し、ターゲットオブジェクトを設定する簡単なタイミングエンジンが用意されています.注意:このクラスでは、ObjectAnimatorが一般的に使用されますが、ObjectAnimatorに基づいて実行されるプロパティアニメーションはjavaの反射メカニズムに基づいて設定されるため、アニメーションのターゲットオブジェクトのプロパティを設定するにはgetterメソッドとsetterメソッドが必要です.
setDuration:アニメーションの時間を設定する
setInterpolator:減速機(DecelerateInterpolator)、アクセル(AccelerateInterpolator)などの挿入器を設定します.もちろんカスタマイズもできますが、カスタマイズするときはこの2つのクラスを継承するだけでいいので、ここでは議論しません.
setEveluator:評価者の設定
    1.ArgbEvaluator:この評価者は、ARGB色を表すタイプ間の補間整数値を実行するために使用することができる.
    2.FloatEvaluator:この評価者は浮動小数点値間の補間を実行するために使用できます.    3.Intovaluator:この評価者は、タイプint値間の補間を実行するために使用できます.    4.RectEvaluator:この評価者は、タイプ間の補間矩形値を実行するために使用できます.
setRepeatCount:アニメーションの繰り返し回数を設定します(intタイプの値です)
setRepeatMode:アニメーションモードの設定あにめーしょんもーどのせってい
start:アニメーションの開始
2.AnimatorSet:このクラスでは、特定のアニメーションのセットの順序を指定します.
主な方法は次のとおりです.
Play:コンストラクタオブジェクトを作成してコンストレイントを作成します.
PlayTogether:アニメーションのセットを同時に実行する設定
pase:実行中のアニメーションを一時停止
resume:一時停止後のアニメーションの再実行
isRunning:アニメーションが実行されているかどうかを判断します
isStarted:アニメーションが実行されているかどうかを判断します
start:アニメーションの開始
3.AnimatorSet.Builderアニメーションをコンストレイントするコンストラクタを作成する
after(Animator):前のアニメーションを実行した後にアニメーションを実行します.
after(long delay):nミリ秒遅延後にアニメーションを実行
before(Animator):前のアニメーションを実行する前にアニメーションを実行
with(Animator):前のアニメーションとともに実行
4.ShapeDrawable:モデルdrawable、作成時にグラフィックモデルを読み込む必要がある
 
以下に簡単なDemo例を用いて上記の状況をテストする(小球加速落下押圧後減速上弾)
一、BackgroundView.java
package cn.yw.lib.animation;

import android.animation.AnimatorSet;
import android.animation.ArgbEvaluator;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RadialGradient;
import android.graphics.Shader;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.OvalShape;
import android.view.MotionEvent;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.animation.AccelerateInterpolator;
import android.view.animation.DecelerateInterpolator;

/**
 *     ,      
 *       SurfaceView    View:
 *     1.      ,  SurfaceView   View,     SurfaceView       ,
 *  2.SurfaceView         ,           
 * 
 * 
 * @author yw-tony
 * 
 */
@SuppressLint("NewApi")
public class BackgroundView extends SurfaceView implements
        SurfaceHolder.Callback, Runnable {
    
    private SurfaceHolder holder;
    private ShapeHolder shapHolder;

    public BackgroundView(Context context) {
        super(context);
        this.holder = this.getHolder();
        this.holder.addCallback(this);
    }

    /**
     *       
     */
    private void createABall(float x, float y) {
        OvalShape oval = new OvalShape();
        //           50f,      
        oval.resize(50f, 50f);
        //      drawable
        ShapeDrawable drawable = new ShapeDrawable(oval);
        shapHolder = new ShapeHolder(drawable);
        int red = (int) (Math.random() * 255);
        int green = (int) (Math.random() * 255);
        int blue = (int) (Math.random() * 255);
        int color = 0xff000000 | red << 16 | green << 8 | blue;
        Paint paint = drawable.getPaint(); // new Paint(Paint.ANTI_ALIAS_FLAG);
        int darkColor = 0xff000000 | red / 4 << 16 | green / 4 << 8 | blue / 4;
        RadialGradient gradient = new RadialGradient(37.5f, 12.5f, 50f, color,
                darkColor, Shader.TileMode.CLAMP);
        //      
        paint.setShader(gradient);
        shapHolder.setPaint(paint);
        //         
        shapHolder.setX(x);
        shapHolder.setY(y);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() != MotionEvent.ACTION_DOWN
                && event.getAction() != MotionEvent.ACTION_MOVE) {
            return false;
        }
        //      
        createABall(event.getX(), event.getY());
        //     Y     
        float startY = shapHolder.getY();
        float endY = getHeight() - 50f;
        // int duration = (int)(500 * ((h - eventY)/h));
        //           500  
        int duration = 500;
        ValueAnimator bounceAnim = ObjectAnimator.ofFloat(shapHolder, "y",
                startY, endY);
        bounceAnim.setDuration(duration);
        //
        bounceAnim.setInterpolator(new AccelerateInterpolator());
        //          
        
        ValueAnimator squashAnim1 = ObjectAnimator.ofFloat(shapHolder, "x",
                  x      
                shapHolder.getX(), shapHolder.getX() - 25f);
        //                    
        squashAnim1.setDuration(duration / 4);
        squashAnim1.setRepeatCount(1);
        squashAnim1.setRepeatMode(ValueAnimator.REVERSE);
        //        
        squashAnim1.setInterpolator(new DecelerateInterpolator());
        ValueAnimator squashAnim2 = ObjectAnimator.ofFloat(shapHolder, "width",
                //        
                shapHolder.getWidth(), shapHolder.getWidth() + 50);
        squashAnim2.setDuration(duration / 4);
        squashAnim2.setRepeatCount(1);
        squashAnim2.setRepeatMode(ValueAnimator.REVERSE);
        //       
        squashAnim2.setInterpolator(new DecelerateInterpolator());
        //      
        ValueAnimator stretchAnim1 = ObjectAnimator.ofFloat(shapHolder, "y",
                endY, endY + 25f);
        stretchAnim1.setDuration(duration / 4);
        stretchAnim1.setRepeatCount(1);
        
        stretchAnim1.setInterpolator(new DecelerateInterpolator());
        stretchAnim1.setRepeatMode(ValueAnimator.REVERSE);
        ValueAnimator stretchAnim2 = ObjectAnimator.ofFloat(shapHolder,
                "height", shapHolder.getHeight(), shapHolder.getHeight() - 25);
        stretchAnim2.setDuration(duration / 4);
        stretchAnim2.setRepeatCount(1);
        stretchAnim2.setInterpolator(new DecelerateInterpolator());
        stretchAnim2.setRepeatMode(ValueAnimator.REVERSE);

        ValueAnimator bounceBackAnim = ObjectAnimator.ofFloat(shapHolder, "y",
                endY, startY);
        bounceBackAnim.setDuration(duration);
        //    
        bounceBackAnim.setInterpolator(new DecelerateInterpolator());
        
        //         
        AnimatorSet bouncer = new AnimatorSet();
        //              1
        bouncer.play(bounceAnim).before(squashAnim1);
        //      1         2
        bouncer.play(squashAnim1).with(squashAnim2);
        bouncer.play(squashAnim1).with(stretchAnim1);
        bouncer.play(squashAnim1).with(stretchAnim2);
        //                
        bouncer.play(bounceBackAnim).after(stretchAnim2);
        //      
        bouncer.start();
        return true;
    }

    private void drawBall() {
        Canvas canvas = null;
        try {
            canvas = holder.lockCanvas();
            if (canvas != null) {
                canvas.drawColor(Color.GRAY);
                canvas.save();
                //              
                if (shapHolder != null) {
                    canvas.translate(shapHolder.getX(), shapHolder.getY());
                    shapHolder.getShape().draw(canvas);
                }
                canvas.restore();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                //    
                if (holder != null) {
                    holder.unlockCanvasAndPost(canvas);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width,
            int height) {

    }

    @Override
    public void surfaceCreated(SurfaceHolder holder) {
        //      
        new Thread(this).start();
    }

    @Override
    public void surfaceDestroyed(SurfaceHolder holder) {

    }

    @Override
    public void run() {
        try {
            //      ,             boolean   ,        (back) ,    
            while (true) {
                drawBall();
                Thread.sleep(200);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

二、BackgroundViewActivity.java
package cn.yw.lib.animation;

import android.app.Activity;
import android.os.Bundle;

public class BackgroundViewActivity extends Activity{
    private BackgroundView view;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        view = new BackgroundView(this);
        setContentView(view);
    }

}