1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

paint() in Android

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von lola48, 14.04.2012.

  1. lola48, 14.04.2012 #1
    lola48

    lola48 Threadstarter Neuer Benutzer

    Beiträge:
    8
    Erhaltene Danke:
    0
    Registriert seit:
    14.04.2012
    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

    Beiträge:
    208
    Erhaltene Danke:
    45
    Registriert seit:
    30.09.2011
    Phone:
    Nexus S
    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

    Beiträge:
    8
    Erhaltene Danke:
    0
    Registriert seit:
    14.04.2012
    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

    Beiträge:
    208
    Erhaltene Danke:
    45
    Registriert seit:
    30.09.2011
    Phone:
    Nexus S
    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

    Beiträge:
    8
    Erhaltene Danke:
    0
    Registriert seit:
    14.04.2012
    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

    Beiträge:
    1,230
    Erhaltene Danke:
    256
    Registriert seit:
    05.02.2010
    Phone:
    Nexus 5X
    Tablet:
    Nexus 7 (2013)
    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

Diese Seite empfehlen