1. lola48, 14.04.2012 #1
    lola48

    lola48 Threadstarter Neuer Benutzer

    Hallo ich bin gerade bei der Gameentwicklung in Android.

    Ich brauche in meiner App eine Methode, die genau das macht, was paint() bzw. repaint() in Java in AWT macht. Ich hab schon bisschen gegoogelt und folgendes Gefunden:

    protected void onDraw(Canvas c) {
    invalidate();
    }

    Das Problem ist, das muss ich ja, mit Canvas aufrufen. Ich suche aber wirklich nur eine Methode, die durchaus neu aufgerufen wird, ohne stack overflow, genau wie paint!

    Wenns das nicht gibt, könnte mir jemand erklähren was genau ich bei der obigen Methode mit onDraw für Canvas übergeben muss? Hab einiges über Canvas gelesen, aber nich 100% durchgeblickt

    (falls es wichtig ist, ich nutze beim programmieren CAndroid Engine, aber ich glaube eine solche Methode gibs sicherlich in Android standart)
     
  2. strider, 15.04.2012 #2
    strider

    strider Erfahrener Benutzer

    Die onDraw Methode rufst du nicht direkt auf sie wird vom System aufgerufen wenn es der Meinung ist die Zeichenfläche müßte neu gezichnet werden. Das neu Zeichnen wird mit dem Aufruf von invalidate erzwungen, auch wenn das System meinen sollte ne muss noch nicht sein. Du mußt die onDraw Methode also einfach nur überlagern. Aufrufen tust du sie indirekt über invalidate().
     
  3. lola48, 15.04.2012 #3
    lola48

    lola48 Threadstarter Neuer Benutzer

    Okay vielen dank. Jetzt nur, ob ichs richtig Verstanden habe, möchte ich einmal bisschen Code posten:
    Hier ist der Konstruktor der ausgeführt wird beim Gamestart und dort schreibe ich folgendes hin:
    Code:
    	public GameGUI(Context context, int breite, int hoehe) {
    		super(context);
    		s = new Spieler(breite, hoehe, context);
    		setRendererAndStart(spriteRenderer);
    
    
    // Hier wird das Starten der "paint()" erzwungen
    		invalidate();
    	}
    
    
    protected void onDraw(Canvas c) {
    		System.out.println("lol");
    // Zeichne irgendwas, bewege irgendwas
    blablabla code blablabla
    // Erzwinge dass Methode neu gestartet wird!!
    		postInvalidate();
      }
    
     
  4. strider, 15.04.2012 #4
    strider

    strider Erfahrener Benutzer

    Sofern GameGUI das View ist, das gerade angezeigt wird sollte es funktionieren. Das postInvalidate() wird benutzt wenn du in einem anderen Thread bist und nicht im ui Thread.
     
  5. lola48, 15.04.2012 #5
    lola48

    lola48 Threadstarter Neuer Benutzer

    Also ich hab das jetzt so eingefügt und die onDraw(Canvas c) methode wird NIE ausgeführt!

    Nach bisschen rumforschen hab ich gesehn, dass meine Klasse nicht View ist (also sie erstellt zwar die GUI, aber hat keine XML als View oder so), wie mach ich sie denn als View?

    View v = ???????
     
    Zuletzt bearbeitet: 15.04.2012
  6. DieGoldeneMitte, 15.04.2012 #6
    DieGoldeneMitte

    DieGoldeneMitte Android-Lexikon

    Das Beispiel hat einen schlechten Programmfluss.

    Im onDraw malt man den Zustand des Spiels, wie er gerade ist.
    Der postInvalidate muss von irgendwo anders kommen, wo die Veränderungen des Spieles ausgelöst werden (User Input, Zeitschleifen)

    ADD: Wie man eigenen eigenen GameView baut: Guckst du hier

    ADD: Achnee doch nicht soo doll. Also ich mache es meist so:
    1.) View bauen:
    Code:
    class MeinView extends View {
    
     // eventuell nach Bedarf onMeasure überladen
    
     ... onDraw( Canvas c ) { .... }
     ...
    }
    2.) View ganz normal im Layout einbauen:
    Code:
     ... <mein.paketname.MeinView ..... />
     
    Zuletzt bearbeitet: 15.04.2012