K
Kollen
Gast
Hey, ich steh grad aufm Schlauch und zwar will ich in ein SurfaceView nur ein Teil von Objekten in Canvas immer wieder neu zeichnen, dies bekomme
ich aber nicht als Ergebnis - hier mein Code.
Ich bekomme keine Exception, also ist alles OK vom Prinzip her. Es liegt aber in der Logik. Wenn ich nur eine Methode mache die die ganze Zeit
gezeichnet wird auch mit den Objekten die eigentlich es nicht brauchen funktioniert es. So wie es im oben angegebenen Code ist wird nur die After
Methode und die die in einem Thread liegt angezeigt. Alle Objekte die auf der Before-Methode liegen werden nicht gezeichnet bzw seh ich nichts.
Vielleicht habt Ihr eine Idee was hier falsch läuft .
MfG
ich aber nicht als Ergebnis - hier mein Code.
Code:
public abstract class SView extends SurfaceView implements IBase
{
protected boolean lockedBefore;
protected boolean lockedAfter;
protected boolean isRunning;
private boolean isDeleted;
private FPSCounter counter;
private Context context;
[COLOR=Red]private Canvas canvas;[/COLOR]
private Thread thread;
public BaseSurfaceView(Context context)
{
super(context);
counter = new FPSCounter();
this.context = context;
lockedBefore = false;
lockedAfter = false;
isDeleted = false;
isRunning = true;
thread = new Thread(new Runnable()
{
@Override
public void run()
{
if (!isDeleted)
[COLOR=Red]while (isRunning)
{
try
{
lockCanvas();
synchronized (getHolder())
{
onDraw(canvas);
}
} finally
{
if (canvas != null)
unlockCanvas();
}
}[/COLOR]
}
});
getHolder().addCallback(new Callback()
{
@Override
public void surfaceDestroyed(SurfaceHolder holder)
{
}
@Override
public void surfaceCreated(SurfaceHolder holder)
{
thread.start();
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height)
{
}
});
}
@Override
protected void onDraw(Canvas canvas)
{
counter.start();
onCreate(canvas);
}
public abstract void onCreate(Canvas canvas);
@Override
public void unlockCanvas()
{
getHolder().unlockCanvasAndPost(canvas);
}
@Override
public void lockCanvas()
{
canvas = getHolder().lockCanvas();
}
}
Code:
public abstract class SurViewII extends BaseSurfaceView
{
public EasyBaseSurfaceView(Context context)
{
super(context);
}
[COLOR=Red] @Override
public void onCreate(Canvas canvas)
{[/COLOR]
//Wenn onCreateBefore schon einmal aufgerufen wurde (also das erste Mal) dann wird der zweite Aufruf durch die Schleife blockiert.
[COLOR=Red] if (!lockedBefore)
onCreateBefore(canvas);[/COLOR]
//OnCreateCanvas wird immer aufgerufen wegen Thread
[COLOR=Red] onCreateCanvas(canvas);[/COLOR]
//Das gleiche hier
[COLOR=Red] if (!lockedAfter)
onCreateCanvasAfter(canvas);
}[/COLOR]
@Override
public void onDestroy()
{
setDeleted(true);
onCanvasDestroy();
}
public void onCreateBefore(Canvas canvas)
{
onCreateCanvasBefore(canvas);
lockedBefore = true;
}
public void onCreateAfter(Canvas canvas)
{
onCreateCanvasAfter(canvas);
lockedAfter = true;
}
//Hier werden alle Objekte gezeichnet die sozusagen ganz hinten auf dem Canvas stehen
[COLOR=Navy] public abstract void onCreateCanvasBefore(Canvas canvas);[/COLOR]
//Hier alle Objekte die sich bewegen bzw immer neu gezeichnet werden müssen
[COLOR=Navy]public abstract void onCreateCanvasAfter(Canvas canvas);[/COLOR]
//Hier alle Objekte die ganz vorne stehen.
[COLOR=Navy] public abstract void onCreateCanvas(Canvas canvas);[/COLOR]
}
gezeichnet wird auch mit den Objekten die eigentlich es nicht brauchen funktioniert es. So wie es im oben angegebenen Code ist wird nur die After
Methode und die die in einem Thread liegt angezeigt. Alle Objekte die auf der Before-Methode liegen werden nicht gezeichnet bzw seh ich nichts.
Vielleicht habt Ihr eine Idee was hier falsch läuft .
MfG