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

OrientationEventListener implementieren

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von fisherman, 13.09.2009.

  1. fisherman, 13.09.2009 #1
    fisherman

    fisherman Threadstarter Neuer Benutzer

    Beiträge:
    6
    Erhaltene Danke:
    0
    Registriert seit:
    13.09.2009
    Hallo,

    ich bastle gerade an den ersten Versuchen eines einfach Spiels. Die Steuerung soll dabei über den Lagesensor funktionieren, genauer gesagt indem ich das Handy nach links oder rechts drehe (um die z-Achse). Mit Android 1.5 gibt es hierfür wohl den OrientationEventListener. Über diesen EventListener kann man die Methode onOrientationChanged implementieren, die als Parameter den Winkel (0-360°) mit gibt.

    Von meiner View-Klasse aus starte ich einen Thread zur Bearbeitung des Spielgeschehens. Allerdings funktioniert das wohl nicht ganz, da ich seit der Implementierung nur einen schwarzen Bildschirm angezeigt bekomme. Beim Debuggen komme ich leider auch nicht weiter als bis zur ersten Zeile der folgenden Methode:

    Code:
    private void initSensor(){
            OrientationEventListener orientationListener = new OrientationEventListener(gameView.getContext(), SensorManager.SENSOR_DELAY_NORMAL) {
                
                @Override
                public void onOrientationChanged(int orientation) {
                    gameView.rotate((float)orientation);
                }
            };
            orientationListener.enable();
        }
    
    Die Methode initSensor() rufe ich derzeit in meiner Threadklasse in der run() Methode auf, kurz bevor die "Spiel"-Schleife startet. Die Eigenschaft gameView ist eine Referenz auf mein View-Objekt. Könnte mir vorstellen, dass der EventListener sich nicht ganz mit dem Thread verträgt, weiß derzeit aber nicht wie ich die Sache anders angehen kann, da ich was Java betrifft etwas eingerostet bin. :)

    EDIT: Ich teste den ganzen Spaß derzeit nur mit dem Emulator, da ich selbst noch kein stolzer Besitzer eines Android-Handys bin.

    Vielen Dank im Voraus für jeden Hinweis der mich weiterbringt.
    fisherman
     
    Zuletzt bearbeitet: 13.09.2009
  2. fisherman, 17.09.2009 #2
    fisherman

    fisherman Threadstarter Neuer Benutzer

    Beiträge:
    6
    Erhaltene Danke:
    0
    Registriert seit:
    13.09.2009
    Hat bisher noch niemand diesen EventListener implementiert bzw. Erfahrung damit gesammelt?

    Habe es soeben auch mit dem 1.6 SDK probiert, leider ohne Erfolg. Mein Spiel wird zwar geladen, aber der Event wird nie ausgelöst, zumindest komme ich beim Debuggen nie rein. Außerdem wird im Emulator beim Drehen des Displays (Strg+F12) das Spiel jedes mal neu gestartet.

    Kann mir bitte jemand weiterhelfen...

    Thx und Grüße
    fisherman
     
  3. Shinigami, 17.09.2009 #3
    Shinigami

    Shinigami Fortgeschrittenes Mitglied

    Beiträge:
    436
    Erhaltene Danke:
    69
    Registriert seit:
    08.04.2009
    Hi.

    bzgl des Neuladens beim Drehen kannste Dir mal folgende Blog-Reihe zu Gemüte führen: AndroidGuys » Rotational Forces, Part Two

    Part Two ist Zufall - muss mal alle überfliege welche Dir hilft. Wenn sich die Ausrichtung des Telefons ändert, wird ja automatisch auch die App angepasst- dabei wird die Activity neu geladen! In der Blog-Reihe steht wie man das umgeht, solche Events "händisch" abfängt etc.

    Bzgl der Events hab ich leider auch keine Ahnung...

    Gruß,
    Shini
     
  4. fisherman, 13.10.2009 #4
    fisherman

    fisherman Threadstarter Neuer Benutzer

    Beiträge:
    6
    Erhaltene Danke:
    0
    Registriert seit:
    13.09.2009
    Shinigami, danke für deine Antwort!

    Das Problem liegt aber am Emulator der sich einfach anders als in der Doku beschrieben verhält. Habe seit kurzem mein Samsung Galaxy (das ich übrigens Klasse finde :)) und auf dem funktioniert der EventListener wunderbar.
    Für diejenigen, denen Code mehr sagt als Worte, hier meine derzeitige Implementierung.

    Code:
        private void initSensor(){
            OrientationEventListener orientationListener = new OrientationEventListener(gameView.getContext(), SensorManager.SENSOR_DELAY_NORMAL) {
                
                @Override
                public void onOrientationChanged(int orientation) {
                    synchronized (gameView.getHolder()) {
                        if (orientation != -1){
                            gameView.rotation = orientation - gameView.orientation;
                            gameView.orientation = orientation;
                        }
                    }
                    
                }
            };
            orientationListener.enable();
        }
    
     

Diese Seite empfehlen