Андроид с использованием SurfaceView и Thread

Я пытаюсь нарисовать мяч на экране, используя 3 класса. Я немного об этом читал, и я нашел фрагмент кода, который работает с 3-мя классами на одной странице. Игра с графикой в ​​Android

Я изменил код так, что у меня есть мяч, который движется и смещает направление при ударе по стене, как на картинке ниже (это используется код в ссылке) .

Перемещение шарика снимок экрана

Теперь мне нравится разделять классы на 3 разные страницы, чтобы не сделать так много людей, все настроено одинаково.

Вот 3 класса, которые у меня есть.

  1. BallActivity.java
  2. Ball.java
  3. BallThread.java

package com.brick.breaker; import android.app.Activity; import android.os.Bundle; import android.view.Window; import android.view.WindowManager; public class BallActivity extends Activity { private Ball ball; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN); ball = new Ball(this); setContentView(ball); } @Override protected void onPause() { // TODO Auto-generated method stub super.onPause(); setContentView(null); ball = null; finish(); } } 

 package com.brick.breaker; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.view.SurfaceHolder; import android.view.SurfaceView; public class Ball extends SurfaceView implements SurfaceHolder.Callback { private BallThread ballThread = null; private Bitmap bitmap; private float x, y; private float vx, vy; public Ball(Context context) { super(context); // TODO Auto-generated constructor stub bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ball); x = 50.0f; y = 50.0f; vx = 10.0f; vy = 10.0f; getHolder().addCallback(this); ballThread = new BallThread(getHolder(), this); } protected void onDraw(Canvas canvas) { update(canvas); canvas.drawBitmap(bitmap, x, y, null); } public void update(Canvas canvas) { checkCollisions(canvas); x += vx; y += vy; } public void checkCollisions(Canvas canvas) { if(x - vx < 0) { vx = Math.abs(vx); } else if(x + vx > canvas.getWidth() - getBitmapWidth()) { vx = -Math.abs(vx); } if(y - vy < 0) { vy = Math.abs(vy); } else if(y + vy > canvas.getHeight() - getBitmapHeight()) { vy = -Math.abs(vy); } } public int getBitmapWidth() { if(bitmap != null) { return bitmap.getWidth(); } else { return 0; } } public int getBitmapHeight() { if(bitmap != null) { return bitmap.getHeight(); } else { return 0; } } public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { // TODO Auto-generated method stub } public void surfaceCreated(SurfaceHolder holder) { // TODO Auto-generated method stub ballThread.setRunnable(true); ballThread.start(); } public void surfaceDestroyed(SurfaceHolder holder) { // TODO Auto-generated method stub boolean retry = true; ballThread.setRunnable(false); while(retry) { try { ballThread.join(); retry = false; } catch(InterruptedException ie) { //Try again and again and again } break; } ballThread = null; } } 

 package com.brick.breaker; import android.graphics.Canvas; import android.view.SurfaceHolder; public class BallThread extends Thread { private SurfaceHolder sh; private Ball ball; private Canvas canvas; private boolean run = false; public BallThread(SurfaceHolder _holder,Ball _ball) { sh = _holder; ball = _ball; } public void setRunnable(boolean _run) { run = _run; } public void run() { while(run) { canvas = null; try { canvas = sh.lockCanvas(null); synchronized(sh) { ball.onDraw(canvas); } } finally { if(canvas != null) { sh.unlockCanvasAndPost(canvas); } } } } public Canvas getCanvas() { if(canvas != null) { return canvas; } else { return null; } } } 

Вот картина, которая показывает результат этих классов.

Введите описание изображения здесь

Я попытался понять это, но, поскольку я довольно новичок в разработке Android, я думал, что могу попросить о помощи.

Кто-нибудь знает, что заставляет мяч рисовать так? Код почти такой же, как и в ссылке, и я попытался поэкспериментировать, чтобы найти решение, но не повезло.

Thx заранее за любую помощь =)

Solutions Collecting From Web of "Андроид с использованием SurfaceView и Thread"

Ну, как вы можете видеть на изображении, вы только нарисовали мяч. Вместо этого вам нужно повторно нарисовать черный фон (или что бы вы ни пожелали) перед каждым розыгрышем мяча.

Альтернативно, вы можете нарисовать черную область только в предыдущей позиции, но позже у вас могут быть проблемы с ней, когда вы используете больше объектов.

Вот хороший образец , похожий на то, что вы делаете

Быстрый взгляд, и я должен сказать, что вы просто рисуете одну и ту же поверхность и никогда не запрашиваете, чтобы ваше изображение было перерисовано. В конце блока finally, в заявлении IF используется: postInvalidate(); Это должно вызвать перерисовку поверхности.

положи это

 public void onDraw(Canvas canvas){ canvas.drawColor(Color.BLACK); ..... } 

Посмотрите, как я сделал маятниковое моделирование по адресу http://som-itsolutions.blogspot.in/2012/06/android-graphics-and-animation-pendulum.html

Вы можете клонировать исходный код этого проекта с https://github.com/sommukhopadhyay/pendulumsimulation

[Edit] Ответ был неправильным, но комментарий был полезен, поэтому я оставлю этот ответ:

Не заданный вами вопрос, но в вашем коде есть проблемы. В Android вам разрешено писать на экран в потоке пользовательского интерфейса. Это поток, который запускает все обратные вызовы Activity и т. Д. При записи на экран из BallThread вы рискуете множеством нечетных сбоев в своей программе.