天上掉宝石(属性动画+组合属性动画)

注意:其中播放多个动画使用的是AnimatorSet不是AnimationSet

AnimatorSet 和 AnimationSet 都是动画集合

AnimationSet 使用的是 Animation 子类、AnimatorSet 使用的是 Animator 的子类

Animation:一般动画,改变的是View的显示内容,View不会变(如ImageView平移,ImageView的位置不会改变,改变的是ImageView中的图片位置)

Animator:属性动画,改变的是View的属性(如ImageView平移,ImageView的x,y将会改变)

package prictise.lxm.prictise;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.animation.ValueAnimator;
import android.app.Activity;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.RadialGradient;
import android.graphics.Shader;
import android.graphics.drawable.ShapeDrawable;
import android.graphics.drawable.shapes.OvalShape;
import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.MotionEvent;
import android.view.View;
import android.view.Window;
import android.view.WindowManager;
import android.view.animation.AccelerateInterpolator;
import android.widget.ImageView;
import android.widget.LinearLayout;
import java.util.ArrayList;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        setContentView(R.layout.activity_main);
        //添加动画视图
        LinearLayout linerMain = (LinearLayout)findViewById(R.id.linea_main);
        linerMain.addView(new MyAnimationView(this));

    }

    /**
     * 球类
     */
    class ShapeHolder{
        float x =0,y=0;
        int alpha=255;

        public float getX() {
            return x;
        }

        public void setX(float x) {
            this.x = x;
        }

        public float getY() {
            return y;
        }

        public void setY(float y) {
            this.y = y;
        }

        public int getAlpha() {
            return alpha;
        }

        public void setAlpha(int alpha) {
            this.alpha = alpha;
        }

        public ShapeDrawable getShapeDrawable() {
            return shapeDrawable;
        }

        public void setShapeDrawable(ShapeDrawable shapeDrawable) {
            this.shapeDrawable = shapeDrawable;
        }

        ShapeDrawable shapeDrawable;
        public ShapeHolder(ShapeDrawable shapeDrawable){
            this.shapeDrawable = shapeDrawable;
        }

    }

    /**
     * 动画
     */
    class MyAnimationView extends View implements ValueAnimator.AnimatorUpdateListener{

        final int BALL_SIZE = 30;
        final int FULL_TIME = 1000;//从屏幕顶端落到屏幕第所用时间ms
        ArrayList<ShapeHolder> shapeHolders = new ArrayList<ShapeHolder>(); //球集合
        public MyAnimationView(Context context) {
            super(context);
            setBackgroundColor(Color.WHITE);
        }

        //记录上一次画球的位置
        float oldDrawX;
        float oldDrawY;
        final int MOVE_LENGTH = 40; //移动多少位置后画球
        /**
         * 在手指点击,或移动位置位置掉球
         * @param event
         * @return
         */
        public boolean onTouchEvent(MotionEvent event){
            if(event.getAction() == MotionEvent.ACTION_MOVE){ //移动时,按条件画图
                float dx = event.getX() - oldDrawX;
                float dy = event.getY() - oldDrawY;
                double moveLength = Math.sqrt( dx*dx + dy*dy);
                if(moveLength < MOVE_LENGTH){ //移动位置太短,不画球
                    return true;
                }
            }else if(event.getAction() != MotionEvent.ACTION_DOWN){ //不是按下,不画球
                return true;
            }
            oldDrawX = event.getX();
            oldDrawY = event.getY();
            int screenHeight = getHeight();
            //生成新的球
            final ShapeHolder newBall = addBall(event.getX(),event.getY());
            //让球向下移动(改变y值)
            int duration = (int)(FULL_TIME * (screenHeight-event.getX())/screenHeight);
            ObjectAnimator objAnimY = ObjectAnimator.ofFloat(newBall,"y",screenHeight-BALL_SIZE);//y从当前值变为screenHeight-BALL_SIZE
            objAnimY.setDuration(duration); //设置动画运行时间
            objAnimY.setInterpolator(new AccelerateInterpolator()); //设置动画变速方式为 加速度
            objAnimY.addUpdateListener(this); //添加值改变监听器
            //让球慢慢隐藏(改变alpha值)
            ObjectAnimator objAnimAlpha = ObjectAnimator.ofInt(newBall, "alpha",255,0); //从255变为0
            objAnimAlpha.setDuration(duration);
            objAnimAlpha.addUpdateListener(this);
            objAnimAlpha.addListener(new AnimatorListenerAdapter() { //添加监听,当动画结束时移除球
                @Override
                public void onAnimationEnd(Animator animation) {
                    super.onAnimationEnd(animation);
                    shapeHolders.remove(newBall);
                }
            });
            //播放动画,两个动画下移在透明度更改之前
            AnimatorSet animatorSet = new AnimatorSet(); //注:此处为AnimatorSet 不是AnimationSet
            animatorSet.play(objAnimY).before(objAnimAlpha);
            animatorSet.play(objAnimAlpha);
            animatorSet.start();
            return true;
        }

        @Override
        /**
         * 重画视图
         */
        public void onAnimationUpdate(ValueAnimator animation) {
            invalidate();
        }

        /**
         * 画球
         *
         * @param canvas the canvas on which the background will be drawn
         */
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            for(ShapeHolder shapeHolder: shapeHolders){
                //保存画布当前位置
                canvas.save();
                //移动球位置
                canvas.translate(shapeHolder.getX(), shapeHolder.getY());
                //改变球的透明度
                shapeHolder.getShapeDrawable().setAlpha(shapeHolder.alpha);

                shapeHolder.getShapeDrawable().draw(canvas);
                //还原画布位置
                canvas.restore();
            }
        }

        /**
         * 添加球
         * @param x 球的位置x
         * @param y 球的位置y
         * @return
         */
        private ShapeHolder addBall(float x,float y){
            //创建一个圆
            OvalShape ovalShape = new OvalShape();
            ovalShape.resize(BALL_SIZE,BALL_SIZE);
            //包装成Drawable
            ShapeDrawable shapeDrawable = new ShapeDrawable(ovalShape);
            //创建shapeHolder对象
            ShapeHolder shapeHolder = new ShapeHolder(shapeDrawable);
            shapeHolder.setX(x-BALL_SIZE/2);
            shapeHolder.setY(y-BALL_SIZE/2);
            //随机生成渐变色
            int red = (int)(Math.random() *255);
            int green = (int)(Math.random() *255);
            int blue = (int)(Math.random() *255);
            int startColor = Color.argb(0xff,red,green,blue);
            int endColor = Color.argb(0xff,red/4,green/4,blue/4);
            //设置圆形渐变
            RadialGradient radialGradient = new RadialGradient(BALL_SIZE/2,BALL_SIZE/2,BALL_SIZE,startColor,endColor, Shader.TileMode.CLAMP);
            shapeDrawable.getPaint().setShader(radialGradient);
            shapeHolders.add(shapeHolder);
            return shapeHolder;
        }

    }

}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值