android 小球弹弹动画

108 阅读2分钟

显示屏长时间显示同一个画面,时间长了会存在烧屏现象,在所在区域存在残影。为了防止烧屏。在界面上写一个小动画就可以。一个运动的小球,在碰到边框后反弹,一直弹弹弹就可以了。

自定义个小球类:

import android.graphics.Bitmap;

public class Ball  implements Cloneable  {

    public float vX;//X方向的速度
    public float vY;//Y方向的速度
    public float x;//X坐标
    public float y;//Y坐标
    public Bitmap  iconBitmap; //小球图标

    public Ball clone() {
        Ball clone = null;
        try {
            clone = (Ball) super.clone();
        } catch (CloneNotSupportedException e) {
            e.printStackTrace();
        }
        return clone;
    }
}

然后定义view

public class RunBall extends View {

    private static final String TAG = "RunBall";

    
    private ValueAnimator mAnimator;//动画的时间轴,让小球动起来,
    private Ball mBall;//小球对象
    private Paint mPaint;//主画笔
    private Point mCoo;//坐标系

    private float defaultVX = 2;//默认小球x方向速度
    private float defaultVY = 2;//默认小球y方向速度

    private float mMaxX = 704;//X轴的边界最大值,获取屏幕宽高设置这个值
    private float mMinX = 0;//X轴最小值,以左上角为0,0 
    private float mMaxY = 960;//Y轴边界最大值,获取屏幕宽高设置这个值
    private float mMinY = 0;//Y轴最小值



    public RunBall(Context context) {
        this(context, null);
    }

    public RunBall(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    private void init() {
        mCoo = new Point(0, 0);// 坐标的起始位置
        //初始化小球
        mBall = new Ball();
        mBall.vX = defaultVX;
        mBall.vY = defaultVY;
        //小球的图标,需要对应的资源文件
        mBall.iconBitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.bb);
        //初始画笔
        mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
        //初始化时间轴ValueAnimator
        mAnimator = ValueAnimator.ofFloat(0, 1);
        mAnimator.setRepeatCount(-1);
        mAnimator.setDuration(1000);
        mAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                updateBall();
                invalidate();
            }
        });
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.save();
        canvas.translate(mCoo.x, mCoo.y);
        drawBall(canvas, mBall);
        canvas.restore();
    }

    /**
     * 绘制小球
     * @param canvas
     * @param ball
     */
    private void drawBall(Canvas canvas, Ball ball) {
      //用画笔画出小球
    canvas.drawBitmap(ball.iconBitmap, ball.x, ball.y, mPaint);

    }

    /**
     * 更新小球
     */
    private void updateBall() {
         //更新小球位置,如果超出边界就反向改坐标
        mBall.x += mBall.vX;
        mBall.y += mBall.vY;
        if (mBall.x > mMaxX) {
            mBall.vX = -mBall.vX;
        }
        if (mBall.x < mMinX) {
            mBall.vX = -mBall.vX;
        }
        if (mBall.y > mMaxY) {
            mBall.vY = -mBall.vY;
        }
        if (mBall.y < mMinY) {
            mBall.vY = -mBall.vY;
        }

    }


    public void onRunBallStart(){
        mAnimator.start();//开启动画
    }

    public void onRunBallPause(){
        mAnimator.pause();//暂停动画
    }
}

然后在xml文件使用自定义view,控件大小为全屏

<com.view.RunBall
    android:id="@+id/rb_main"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"

    />

最后findViewById 初始化,调用start 小球就运动起来了

runBallMain = findViewById(R.id.rb_main);
runBallMain.onRunBallStart();