Android-zeichnen mit SurfaceView und Faden
Ich versuche zu zeichnen, einen ball zu meinem Bildschirm mit 3 Klassen. Ich habe ein wenig über diese, und ich fand einen code-snippet, das funktioniert mit der 3-Klassen auf der einen Seite, Spiel mit Grafiken in Android
Ich veränderte den code so, dass ich einen ball, der sich bewegt und verschiebt sich Richtung beim Auftreffen auf die Wand wie auf dem Bild unten (dies ist mit dem code im link).
Ich mag jetzt trennen sich die Klassen in 3 verschiedene Seiten für nicht alles so überfüllt, alles eingerichtet ist, wird auf die gleiche Weise.
Hier sind die 3 Klassen die ich habe.
- 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;
}
}
}
Hier ist ein Bild, dass zeigt das Ergebnis dieser Klassen.
Ich habe versucht, dies herauszufinden, aber da bin ich ziemlich neu in Android Entwicklung, die ich dachte, ich könnte um Hilfe bitten.
Nicht jeder weiß, was die Ursache für den ball zu zeichnen, wie, die?
Der code ist so ziemlich der gleiche ist wie der im link, und ich habe versucht zu Experimentieren, um eine Lösung zu finden, aber kein Glück.
Du musst angemeldet sein, um einen Kommentar abzugeben.
gut , wie Ihr auf dem Bild seht , Sie zog nur den ball . stattdessen , Sie brauchen, um wieder zog einen schwarzen hintergrund (oder was auch immer Sie möchten), bevor Sie jedes mal, wenn Sie ziehen den ball.
alternativ , Sie können zeichnen Sie einen schwarzen Bereich nur auf die Vorherige position , aber Sie könnten Probleme damit haben, später , wenn Sie mehrere Objekte.
hier ist ein schönes Beispiel, ähnlich zu dem, was Sie tun
Einen kurzen Blick und ich würde sagen, dass Sie nur die Zeichnung auf der gleichen Oberfläche, und nie um Ihre surfaceview, selbst aktualisieren. am Ende des finally-Blocks, in der IF-Anweisung verwenden:
postInvalidate();
Dass sollte dazu führen, dass die Oberfläche anzeigen, selbst aktualisieren.setzen diese
Sehen, wie ich getan haben, die Pendel-simulation an
http://som-itsolutions.blogspot.in/2012/06/android-graphics-and-animation-pendulum.html
Können Sie Klonen den Quellcode von diesem Projekt aus
https://github.com/sommukhopadhyay/pendulumsimulation
[edit]Die Antwort war falsch, aber der Kommentar war hilfreich, so lasse ich diese Antwort bis:
Nicht die Frage, die Sie gefragt, aber es gibt ein problem in deinem code. In Android sind Sie nur erlaubt, zu schreiben, um den Bildschirm in den UI-thread. Dies ist der rote Faden, der alle Aktivitäten Rückrufe, etc. Durch schreiben auf dem Bildschirm aus BallThread Sie riskieren viele seltsame Fehler in Ihrem Programm.
SurfaceView
aktualisiert werden kann, aus einem anderen thread - developer.android.com/reference/android/view/SurfaceView.html