Canvas problem

  • 0 Antworten
  • Letztes Antwortdatum
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.

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]
}
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
 
Zurück
Oben Unten