让两个球在android中移动

让两个球在android中移动,android,Android,我是android开发的新手。我从一个网站上获得了球移动的代码。它有MovementView.java和UpdateThread.java类。在同一行中,我试图通过定义MovementView1.java和UpdateThread1.java类来移动两个球,但我只移动了第二个球,还有谁能告诉我如何制作球相互碰撞时偏转 这是MainActivity.java package com.example.movements; public class MainActivity extends Activ

我是android开发的新手。我从一个网站上获得了球移动的代码。它有MovementView.java和UpdateThread.java类。在同一行中,我试图通过定义MovementView1.java和UpdateThread1.java类来移动两个球,但我只移动了第二个球,还有谁能告诉我如何制作球相互碰撞时偏转

这是MainActivity.java

package com.example.movements;
public class MainActivity extends Activity {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(new MovementView(this));
    setContentView(new MovementView1(this));
}
}
这是MovementView.java

package com.example.movements;
public class MovementView extends SurfaceView implements SurfaceHolder.Callback{
private int xPos;
private int yPos;
private int xVel;
private int yVel;
private int width;
private int height;
private int circleRadius;
private Paint circlePaint;
UpdateThread updateThread;
public MovementView(Context context) {
    super(context);
    getHolder().addCallback(this);
    circleRadius = 10;
    circlePaint = new Paint();
    circlePaint.setColor(Color.BLUE);
    xVel = 2;
    yVel = 2;
}
@Override
protected void onDraw(Canvas canvas) {
    canvas.drawColor(Color.WHITE);
    canvas.drawCircle(xPos, yPos, circleRadius, circlePaint);
}
public void updatePhysics() {
    xPos += xVel;
    yPos += yVel;
    if (yPos - circleRadius < 0 || yPos + circleRadius > height) {
        if (yPos - circleRadius < 0) {
            yPos = circleRadius;
        }else{
            yPos = height - circleRadius;
        }
        yVel *= -1;
    }
    if (xPos - circleRadius < 0 || xPos + circleRadius > width) {
        if (xPos - circleRadius < 0) {
            xPos = circleRadius;
        } else {
            xPos = width - circleRadius;
        }
        xVel *= -1;
    }
}
public void surfaceCreated(SurfaceHolder holder) {
    Rect surfaceFrame = holder.getSurfaceFrame();
    width = surfaceFrame.width();
    height = surfaceFrame.height();
    xPos = width / 2;
    yPos = circleRadius;
    updateThread = new UpdateThread(this);
    updateThread.setRunning(true);
    updateThread.start();
}
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
public void surfaceDestroyed(SurfaceHolder holder) {
    boolean retry = true;
    updateThread.setRunning(false);
    while (retry) {
        try {
            updateThread.join();
            retry = false;
        } catch (InterruptedException e) {
        }
    }
}
}
package com.example.movements;
公共类MovementView扩展了SurfaceView实现了SurfaceHolder.Callback{
私人int XPO;
私营机构;
私人int xVel;
伊维尔私人酒店;
私有整数宽度;
私人内部高度;
私家车;
私人油漆;
更新读取更新读取;
公共移动视图(上下文){
超级(上下文);
getHolder().addCallback(此);
环磷酰胺=10;
circlePaint=新油漆();
circlePaint.setColor(颜色:蓝色);
xVel=2;
yVel=2;
}
@凌驾
受保护的void onDraw(画布){
画布。drawColor(颜色。白色);
画布.画圈(xPos、YPO、circleRadius、circlePaint);
}
公共物理学(){
xPos+=xVel;
yPos+=yVel;
if(yPos-环线<0 | | yPos+环线>高度){
if(yPos-环类<0){
yPos=环状;
}否则{
yPos=高度-圆环;
}
yVel*=-1;
}
if(xPos-circleRadius<0 | | xPos+circleRadius>宽度){
if(xPos-循环小于0){
xPos=循环;
}否则{
xPos=宽度-圆环;
}
xVel*=-1;
}
}
已创建的公共空白表面(表面持有人){
Rect surfaceFrame=holder.getSurfaceFrame();
宽度=surfaceFrame.width();
高度=surfaceFrame.height();
xPos=宽度/2;
yPos=环状;
updateThread=新的updateThread(此);
updateThread.setRunning(true);
updateThread.start();
}
公共空白表面更改(表面文件夹持有者、整型格式、整型宽度、整型高度){
}
公共空间表面覆盖(表面覆盖物持有人){
布尔重试=真;
updateThread.setRunning(false);
while(重试){
试一试{
updateThread.join();
重试=错误;
}捕捉(中断异常e){
}
}
}
}
这是MovementView1.java

package com.example.movements;
public class MovementView1 extends SurfaceView implements SurfaceHolder.Callback{
private int xPos;
private int yPos;
private int xVel;
private int yVel;
private int width;
private int height;
private int circleRadius;
private Paint circlePaint;
UpdateThread1 updateThread;
public MovementView1(Context context) {
    super(context);
    getHolder().addCallback(this);
    circleRadius = 10;
    circlePaint = new Paint();
    circlePaint.setColor(Color.BLUE);
    xVel = 50;
    yVel = 50;
}
@Override
protected void onDraw(Canvas canvas) {
    canvas.drawColor(Color.WHITE);
    canvas.drawCircle(xPos, yPos, circleRadius, circlePaint);
}
public void updatePhysics() {
    xPos += xVel;
    yPos += yVel;
    if (yPos - circleRadius < 0 || yPos + circleRadius > height) {
        if (yPos - circleRadius < 0) {
            yPos = circleRadius;
        }else{
            yPos = height - circleRadius;
        }
        yVel *= -1;
    }
    if (xPos - circleRadius < 0 || xPos + circleRadius > width) {
        if (xPos - circleRadius < 0) {
            xPos = circleRadius;
        } else {
            xPos = width - circleRadius;
        }
        xVel *= -1;
    }
}
public void surfaceCreated(SurfaceHolder holder) {
    Rect surfaceFrame = holder.getSurfaceFrame();
    width = surfaceFrame.width();
    height = surfaceFrame.height();
    xPos = width / 2;
    yPos = circleRadius;
    updateThread = new UpdateThread1(this);
    updateThread.setRunning(true);
    updateThread.start();
}
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
public void surfaceDestroyed(SurfaceHolder holder) {
    boolean retry = true;
    updateThread.setRunning(false);
    while (retry) {
        try {
            updateThread.join();
            retry = false;
        } catch (InterruptedException e) {
        }
    }
}
}
package com.example.movements;
公共类MovementView1扩展了SurfaceView实现了SurfaceHolder.Callback{
私人int XPO;
私营机构;
私人int xVel;
伊维尔私人酒店;
私有整数宽度;
私人内部高度;
私家车;
私人油漆;
UpdateThread1 updateThread;
公共移动视图1(上下文){
超级(上下文);
getHolder().addCallback(此);
环磷酰胺=10;
circlePaint=新油漆();
circlePaint.setColor(颜色:蓝色);
xVel=50;
yVel=50;
}
@凌驾
受保护的void onDraw(画布){
画布。drawColor(颜色。白色);
画布.画圈(xPos、YPO、circleRadius、circlePaint);
}
公共物理学(){
xPos+=xVel;
yPos+=yVel;
if(yPos-环线<0 | | yPos+环线>高度){
if(yPos-环类<0){
yPos=环状;
}否则{
yPos=高度-圆环;
}
yVel*=-1;
}
if(xPos-circleRadius<0 | | xPos+circleRadius>宽度){
if(xPos-循环小于0){
xPos=循环;
}否则{
xPos=宽度-圆环;
}
xVel*=-1;
}
}
已创建的公共空白表面(表面持有人){
Rect surfaceFrame=holder.getSurfaceFrame();
宽度=surfaceFrame.width();
高度=surfaceFrame.height();
xPos=宽度/2;
yPos=环状;
updateThread=newupdatethread1(此);
updateThread.setRunning(true);
updateThread.start();
}
公共空白表面更改(表面文件夹持有者、整型格式、整型宽度、整型高度){
}
公共空间表面覆盖(表面覆盖物持有人){
布尔重试=真;
updateThread.setRunning(false);
while(重试){
试一试{
updateThread.join();
重试=错误;
}捕捉(中断异常e){
}
}
}
}
这是UpdateThread.java

package com.example.movements;
public class UpdateThread extends Thread {
private long time;
private final int fps = 20;
private boolean toRun = false;
private MovementView movementView;
private SurfaceHolder surfaceHolder;
public UpdateThread(MovementView rMovementView) {
    movementView = rMovementView;
    surfaceHolder = movementView.getHolder();
}
public void setRunning(boolean run) {
    toRun = run;
}
@Override
public void run() {
    Canvas c;
    while (toRun) {
        long cTime = System.currentTimeMillis();
        if ((cTime - time) <= (1000 / fps)) {
            c = null;
            try {
                c = surfaceHolder.lockCanvas(null);
                movementView.updatePhysics();
                movementView.onDraw(c);
            } finally {
                if (c != null) {
                    surfaceHolder.unlockCanvasAndPost(c);
                }
            }
        }
        time = cTime;
    }
}
}
package com.example.movements;
公共类UpdateThread扩展线程{
私人时间长;
私人最终整数fps=20;
私有布尔函数toRun=false;
私有移动视图移动视图;
私人地勤人员地勤人员;
公共更新读取(移动视图或移动视图){
movementView=rMovementView;
surfaceHolder=movementView.getHolder();
}
公共void setRunning(布尔运行){
toRun=运行;
}
@凌驾
公开募捐{
帆布c;
while(托伦){
长cTime=System.currentTimeMillis();

如果((cTime-time)我已经做了两个球的移动,但有人能告诉我如何使两个球在碰撞时偏转。请查看YouTube上的“Android Dev”视频:“”。最多你会有一个想法
package com.example.movements;
public class UpdateThread1 extends Thread {
private long time;
private final int fps = 20;
private boolean toRun = false;
private MovementView1 movementView;
private SurfaceHolder surfaceHolder;
public UpdateThread1(MovementView1 rMovementView) {
    movementView = rMovementView;
    surfaceHolder = movementView.getHolder();
}
public void setRunning(boolean run) {
    toRun = run;
}
@Override
public void run() {
    Canvas c;
    while (toRun) {
        long cTime = System.currentTimeMillis();
        if ((cTime - time) <= (1000 / fps)) {
            c = null;
            try {
                c = surfaceHolder.lockCanvas(null);
                movementView.updatePhysics();
                movementView.onDraw(c);
            } finally {
                if (c != null) {
                    surfaceHolder.unlockCanvasAndPost(c);
                }
            }
        }
        time = cTime;
    }
}
}