android自定义View之气球碰撞效果

最近项目需要做个许多小球碰撞的效果,就用自定义View撸了一个出来,效果如下



这个效果也不复杂,说下算法步骤吧。
1、小球数量ballCount,可以设个最大值,在这个阈值内去随机数
2、小球圆心随机坐标(mX,mY)以及半径radius
3、小球在x方向和y方向的随机速度mSpeedX,mSpeedY
4、本次效果小球默认白色,通过alpha设置透明度,实际你们也可以通过随机颜色值达到五彩频繁的小球效果。
5、初始时给每个小球一个初始随机位置(不能超出屏幕)以及初始随机速度。
6、每个一段时间计算一下小球位置并刷新一下界面,当小球到达屏幕边沿则速度设为当前相反数达到反弹的效果。
为了达到好的刷新效果,本次自定义SurfaceView来实现,主要代码如下:

private void initBalls() {
    ballBeans = new BallBean[mBallCount];
    for (int i = 0; i < ballBeans.length; i++) {
        ballBeans[i] = new BallBean();
        ballBeans[i].setRadius((new Random().nextInt(mMaxSize-mMinSize) + mMinSize)/2);
        ballBeans[i].setX(new Random().nextInt(mViewWidth-ballBeans[i].getRadius()));
        ballBeans[i].setY(new Random().nextInt(mViewHeight-ballBeans[i].getRadius()));
        ballBeans[i].setSpeedY(new Random().nextBoolean()?(new Random().nextInt(4) + mSpeedY):-(new Random().nextInt(4) + mSpeedY));
        ballBeans[i].setSpeedX(new Random().nextBoolean()?(new Random().nextInt(4) + mSpeedX):-(new Random().nextInt(4) + mSpeedX));
        ballBeans[i].setAlpha(new Random().nextInt(255));
    }
}

//更新位置以及速度方向
private void updatePara() {
    int x;
    int y;
    for (BallBean ball : ballBeans) {
        if (ball == null) {
            break;
        }
        x = ball.getX() + ball.getSpeedX();
        y = ball.getY() + ball.getSpeedY();
        if((x-ball.getRadius())<=0 || (x+ball.getRadius())>=mViewWidth){
            ball.setSpeedX(-ball.getSpeedX());
        }else {
            ball.setX(x);
        }
        if((y-ball.getRadius())<=0 || (y-ball.getRadius())>=mViewHeight){
            ball.setSpeedY(-ball.getSpeedY());
        }else {
            ball.setY(y);
        }

    }
}

private void drawView() {
    if (surfaceHolder == null) {
        return;
    }
    Canvas canvas = surfaceHolder.lockCanvas();
    if (canvas == null) {
        return;
    }
    canvas.drawColor(Color.TRANSPARENT, PorterDuff.Mode.CLEAR);
    drawBall(canvas);
    surfaceHolder.unlockCanvasAndPost(canvas);
}

private void drawBall(Canvas canvas) {
    for (BallBean ballbean : ballBeans) {
        paint.setAlpha(ballbean.getAlpha());
        canvas.drawCircle(ballbean.getX(),ballbean.getY(),ballbean.getRadius(),paint);
    }
}
工程源码

猜你喜欢

转载自blog.csdn.net/u013795543/article/details/81045409