Android dessiner à l'aide de SurfaceView et du Fil
Je suis en train de dessiner une boule de mon écran à l'aide de 3 classes. J'ai lu un peu à ce sujet et j'ai trouvé un extrait de code qui fonctionne à l'aide du 3 classes sur une seule page, Jouer avec des graphismes Android
J'ai modifié le code pour que j'ai une boule qui est en mouvement et les changements de direction au moment de frapper le mur comme sur la photo ci-dessous (c'est en utilisant le code dans le lien).
Maintenant, j'aime séparer les classes en 3 pages différentes pour ne pas faire tout plein de monde, tout est présenté de la même façon.
Voici les 3 classes que j'ai.
- BallActivity.java
- Ball.java
- 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) {
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() {
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);
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) {
}
public void surfaceCreated(SurfaceHolder holder) {
ballThread.setRunnable(true);
ballThread.start();
}
public void surfaceDestroyed(SurfaceHolder holder) {
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;
}
}
}
Voici une photo qui montre le résultat de ces classes.
J'ai essayé de comprendre cela, mais depuis que je suis assez nouvelle pour Android, le développement, j'ai pensé que je pourrais demander de l'aide.
Croit-on savoir quelle est la cause de la balle à dessiner comme ça?
Le code est à peu près le même que celui dans le lien et j'ai essayé d'expérimenter pour trouver une solution, mais pas de chance.
Vous devez vous connecter pour publier un commentaire.
bien , comme vous pouvez le voir sur l'image , vous ne tira la balle . au lieu de cela , vous avez besoin de re-dessiné un fond noir (ou tout ce que vous voulez) avant chaque fois que vous tirer la balle.
alternativement , vous pouvez dessiner une zone noire uniquement sur la position précédente , mais vous pourriez avoir des problèmes avec elle plus tard , lorsque vous utilisez plus d'objets.
voici un bel exemple, similaire à ce que vous ne
Un coup d'oeil rapide et je dois dire que vous êtes juste dessiner sur la même surface et de ne jamais demander votre surfaceview à se redessiner. à la fin du bloc finally, dans l'Instruction if utilisation:
postInvalidate();
Qui devrait provoquer la surface d'affichage à se redessiner.mettre cette
Voir comment j'ai fait le pendule de simulation à
http://som-itsolutions.blogspot.in/2012/06/android-graphics-and-animation-pendulum.html
Vous pouvez cloner le code source de ce projet de
https://github.com/sommukhopadhyay/pendulumsimulation
[modifier]La réponse était erronée, mais le commentaire a été utile, donc je vais laisser cette réponse jusqu':
Pas la question, mais il y a un problème dans votre code. Dans Android, vous n'êtes autorisé à écrire à l'écran dans le thread de l'INTERFACE utilisateur. C'est le thread qui s'exécute toutes les Activités de rappels, etc. Par écrit à l'écran de BallThread, vous risquez de nombreux bizarre échecs dans votre programme.
SurfaceView
peut être mise à jour à partir d'un autre thread - developer.android.com/reference/android/view/SurfaceView.html