Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android SDK
Code

Verwenden des Beschleunigungsmessers auf Android

by
Difficulty:IntermediateLength:LongLanguages:

German (Deutsch) translation by Władysław Łucyszyn (you can also view the original English article)

In diesem Tutorial erfahren Sie, wie Sie den Beschleunigungssensor, einen der vielen Hardware-Sensoren moderner Smartphones, in einer Android-Anwendung verwenden können. Ich werde erklären, was ein Beschleunigungssensor ist und warum er etwas sein könnte, was Sie in Ihren Android-Anwendungen nutzen möchten.

Einführung

Vor dem Anbruch des Smartphones war eine der wenigen Hardwarekomponenten, mit denen die Tastatur interagieren konnte, die Tastatur. Aber die Zeiten haben sich geändert und die Interaktion mit Hardwarekomponenten wird immer üblicher.

Die Verwendung von Gesten ist oft natürlicher als die Interaktion mit einer Benutzerschnittstelle über Maus und Tastatur. Dies gilt insbesondere für Touch-Geräte wie Smartphones und Tablets. Ich finde, dass das Verwenden von Gesten eine Android-Anwendung zum Leben erwecken kann, was sie für den Benutzer interessanter und spannender macht.

In diesem Tutorial verwenden wir eine Geste, die Sie in einigen mobilen Anwendungen finden, die Shake-Geste. Wir werden die Shake-Geste verwenden, um zufällig sechs Lotterie-Nummern zu generieren und sie auf dem Bildschirm mit einer hübschen Animation anzuzeigen.

1. Erste Schritte

Schritt 1: Projekteinrichtung

Starten Sie ein neues Android-Projekt in Ihrer bevorzugten IDE (Integrated Development Environment) für die Android-Entwicklung. In diesem Lernprogramm verwende ich IntelliJ IDEA.

Wenn Ihre IDE die Android-Entwicklung unterstützt, hat sie eine Main-Klasse für Sie erstellt. Der Name dieser Klasse hängt davon ab, welche IDE Sie verwenden. Die Main spielt eine Schlüsselrolle, wenn Ihre Anwendung gestartet wird. Ihre IDE sollte auch eine Hauptlayoutdatei erstellt haben, die von der Main-Klasse zum Erstellen der Benutzeroberfläche der Anwendung verwendet wird.

Da wir eine Shake-Geste verwenden, ist es eine gute Idee, die Ausrichtung des Geräts zu sperren. Dadurch wird sichergestellt, dass die Benutzeroberfläche der Anwendung nicht ständig zwischen Hoch- und Querformat wechselt. Öffnen Sie die Manifestdatei des Projekts, und legen Sie die Option screenOrientation auf portrait fest.

Schritt 2: Einrichten des Sensors

Mit unserem Projekt ist es an der Zeit, uns die Hände schmutzig zu machen und Code zu schreiben. Im Moment verfügt die Hauptaktivitätsklasse über eine onCreate-Methode, in der wir das Hauptlayout wie folgt festlegen, indem wir setContentView aufrufen.

Abhängig von der von Ihnen verwendeten IDE müssen Sie möglicherweise Main.java, der Datei, in der Ihre Main-Klasse lebt, einige Importanweisungen hinzufügen. Die meisten IDEs fügen diese Importanweisungen für Sie ein, aber ich möchte sicherstellen, dass wir uns auf derselben Seite befinden, bevor wir fortfahren. Die erste Importanweisung importiert android.app.Activity, importiert die Activity klasse, während die zweite import android.os.Bundle, die Bundle-Klasse importiert. Die dritte Importanweisung, com.example.R, enthält die Definitionen für die Ressourcen der Anwendung. Diese Importanweisung unterscheidet sich von der unten angezeigten, da sie vom Namen Ihres Pakets abhängt.

Im nächsten Schritt werden wir die SensorEventListener-Schnittstelle nutzen, die im Android SDK deklariert ist. Um die SensorEventListener-Schnittstelle zu verwenden, muss die Main aktivitätsklasse diese implementieren, wie im folgenden Codefragment gezeigt. Wenn Sie sich die aktualisierte Main aktivitätsklasse ansehen, werden Sie feststellen, dass ich das implements-Schlüsselwort verwende, um dem Compiler mitzuteilen, dass die Main-Klasse die SensorEventListener-Schnittstelle implementiert.

Um die SensorEventListener-Schnittstelle zu verwenden, müssen Sie eine weitere import-Anweisung hinzufügen, wie unten gezeigt. Die meisten IDEs fügen die Import-Anweisung für Sie intelligent hinzu, so dass Sie sich darüber wahrscheinlich keine Gedanken machen müssen.

Sobald Sie die Main-Klassenimplementierung wie oben gezeigt aktualisieren, werden einige Fehler angezeigt. Dies ist nicht überraschend, da wir zwei erforderliche Methoden der SensorEventListener-Schnittstelle implementieren müssen.

Wenn Sie IntelliJ IDEA verwenden, sollten Sie aufgefordert werden, diese erforderlichen Methoden hinzuzufügen, wenn Sie auf den Fehler klicken. Wenn Sie eine andere IDE verwenden, kann dieses Verhalten abweichen. Lassen Sie uns die beiden erforderlichen Methoden manuell hinzufügen, wie im folgenden Codefragment gezeigt. Stellen Sie sicher, dass Sie diese Methoden in der Main-Klasse und außerhalb der onCreate-Methode hinzufügen.

Sehen wir uns die onSensorChanged-Methode an. Wir werden diese Methode verwenden, um die Shake-Geste zu erkennen. Die onSensorChanged-Methode wird jedes Mal aufgerufen, wenn der integrierte Sensor eine Änderung feststellt. Diese Methode wird immer dann aufgerufen, wenn das Gerät in Bewegung ist. Um die Sensor- und SensorEvent-Klassen zu verwenden, fügen wir zwei zusätzliche Importanweisungen hinzu, wie unten gezeigt.

Bevor wir onSensorChanged implementieren, müssen wir zwei private Variablen in der Main klasse senSensorManager vom Typ SensorManager und senAccelerometer vom Typ Sensor deklarieren.

Die Klasse SensorManager ist in android.hardware.SensorManager deklariert. Wenn Fehler angezeigt werden, überprüfen Sie, ob die SensorManager-Klasse ebenfalls importiert wird.

In der onCreate-Methode initialisieren wir die Variablen, die wir gerade deklariert haben, und registrieren einen Listener. Sehen Sie sich die aktualisierte Implementierung der onCreate-Methode an.

Um die SensorManager-Instanz zu initialisieren, rufen wir getSystemService auf, um die SensorManager-Instanz des Systems abzurufen, mit der wir wiederum auf die Sensoren des Systems zugreifen. Die getSystemService-Methode wird verwendet, um einen Verweis auf einen Dienst des Systems zu erhalten, indem der Name des Dienstes übergeben wird. Mit dem uns zur Verfügung stehenden Sensor-Manager erhalten wir einen Verweis auf den Beschleunigungssensor des Systems, indem wir getDefaultSensor auf dem Sensor-Manager aufrufen und den für uns interessanten Sensortyp übergeben. Wir registrieren den Sensor dann mit einer der öffentlichen Methoden des SensorManager, registerListener. Diese Methode akzeptiert drei Argumente, den Kontext der Aktivität, einen Sensor und die Rate, mit der Sensorereignisse an uns übermittelt werden.

Es gibt zwei andere Methoden, die wir außer Kraft setzen müssen: onPause und onResume. Dies sind Methoden der Main klasse. Es empfiehlt sich, den Sensor abzumelden, wenn sich die Anwendung im Ruhezustand befindet, und den Sensor erneut zu registrieren, wenn die Anwendung fortgesetzt wird. Sehen Sie sich die Codeschnipsel unten an, um sich ein Bild davon zu machen, wie dies in der Praxis funktioniert.

Schritt 3: Erkennen der Shake-Geste

Wir können uns jetzt auf das Fleisch der Anwendung konzentrieren. Es wird etwas Mathe benötigt, um herauszufinden, wann eine Shake-Geste stattfindet. Most of the logic wants to go into the onSensorChanged method. We start by declaring a few variables in our Main class. Take a look at the code snippet below.

Let's zoom in on the implementation of the onSensorChanged method. We grab a reference to the Sensor instance using the SensorEvent instance that is passed to us. As you can see in the code snippet below, we double-check that we get a reference to the correct sensor type, the system's accelerometer.

The next step is to extract the device's position in space, the x, y, and z axis. Schau dir das Bild unten an, um besser zu verstehen, was ich meine. Die x-Achse definiert die seitliche Bewegung, während die y-Achse die vertikale Bewegung definiert. Die z-Achse ist etwas komplizierter, da sie die Bewegung innerhalb und außerhalb der durch die x- und y-Achse definierten Ebene definiert.


Um die Werte jeder Achse zu erhalten, fragen wir das Sensorereignis nach seinen Werten, wie unten gezeigt. Das value attribut des Ereignisses ist ein Array von Gleitkommazahlen.

Die Sensoren des Systems sind unglaublich empfindlich. Wenn Sie ein Gerät in der Hand halten, ist es ständig in Bewegung, egal wie ruhig Ihre Hand ist. Das Ergebnis ist, dass die Methode onSensorChanged mehrmals pro Sekunde aufgerufen wird. Wir benötigen nicht alle diese Daten, daher müssen wir sicherstellen, dass wir nur eine Teilmenge der Daten aus dem Beschleunigungssensor des Geräts abtasten. Wir speichern die aktuelle Zeit des Systems (in Millisekunden), speichern sie in curTime und prüfen, ob mehr als 100 Millisekunden seit dem letzten Aufruf von onSensorChanged vergangen sind.

Das letzte Teil des Puzzles ist, ob das Gerät geschüttelt wurde oder nicht. Wir verwenden die Math-Klasse, um die Geschwindigkeit des Geräts wie unten gezeigt zu berechnen. Die statisch deklarierte SHAKE_THRESHOLD-Variable wird verwendet, um festzustellen, ob eine Shake-Geste erkannt wurde oder nicht. Durch das Ändern von SHAKE_THRESHOLD wird die Empfindlichkeit erhöht oder verringert. Sie können also mit diesem Wert spielen.

2. Beendigung des Lotterieantrags

Wir haben jetzt eine Anwendung, die eine Erschütterungsgeste mit dem Beschleunigungsmesser erkennen kann. Lassen Sie uns dieses Projekt beenden, indem Sie die Shake-Geste verwenden, um sechs zufällige Lottozahlen auszuwählen. Ich zeige Ihnen, wie Sie eine Zufallszahl zwischen 1 und 49 generieren, aber Sie können meine Implementierung ändern, damit sie mit der Lotterie in Ihrem Land funktioniert.

Beginnen wir mit der Einrichtung der Hauptlayoutdatei der Anwendung, die wir für die Benutzeroberfläche verwenden. Wie Sie unten sehen können, verwende ich sechs Rahmenlayouts mit dem Hintergrund eines Bildes eines Balls.

Jedes Rahmenlayout enthält eine Textansicht, die eine zufällig generierte Lottozahl anzeigt. Beachten Sie, dass jedes Rahmenlayout und jede Textansicht eine id hat, um sicherzustellen, dass wir sie später referenzieren können.

Wenn das Hauptlayout fertig ist, besuchen wir die Main-Klasse. Wir beginnen mit der Erstellung von getRandomNumber, einer privaten Methode zum Generieren von sechs Zufallszahlen zwischen 1 und 49.

Wir erstellen zuerst eine ArrayList-Instanz, in der wir die sechs Zahlen speichern. In jeder Schleife der for-Schleife nutzen wir die Random-Klasse von Java, um eine Zufallszahl zu generieren. Um sicherzustellen, dass wir eine Zahl zwischen 1 und 49 erhalten, addieren wir 1 zum Ergebnis. Der nächste Schritt besteht darin, zu überprüfen, ob die generierte Nummer bereits in der Array-Liste enthalten ist, da wir nur eindeutige Nummern in der Array-Liste haben wollen.

Beachten Sie, dass Sie möglicherweise zwei weitere Importanweisungen hinzufügen müssen, um den Compiler zufrieden zu stellen.

Der letzte Schritt besteht darin, die zufällig generierte Nummer in der Benutzerschnittstelle anzuzeigen. Wir erhalten einen Verweis auf die zuvor erstellten Textansichten und füllen jede Textansicht mit einer Zufallszahl. Wir fügen den Rahmenlayouts auch eine saubere Animation hinzu, aber Sie können die Animation auch weglassen oder ändern.

Wir müssen ein paar weitere Importanweisungen hinzufügen, damit all dies funktioniert. Sehen Sie sich den Codeausschnitt unten an.

Schauen Sie sich für die Animationen den Inhalt der unten stehenden Animationsdatei an. Beachten Sie, dass Sie im Ressourcenverzeichnis Ihres Projekts einen anim ordner erstellen müssen und nennen Sie ihn move_down_ball_first.xml. Durch Anpassen der Werte des scale nelements können Sie die Dauer der Animation und die Position jedes Balls ändern.

Jetzt müssen wir nur getRandomNumber in onSensorChanged in der Main-Klasse aufrufen. Sehen Sie sich die vollständige Implementierung von onSensorChanged unten an.


Fazit

In diesem Tutorial habe ich Ihnen gezeigt, wie der Beschleunigungssensor funktioniert und wie Sie damit eine Erschütterungsgeste erkennen können. Natürlich gibt es viele andere Anwendungsfälle für den Beschleunigungsmesser. Mit einem grundlegenden Verständnis der Erkennung von Gesten mit dem Beschleunigungssensor, ermutige ich Sie, mit dem Beschleunigungsmesser zu experimentieren, um zu sehen, was Sie sonst noch damit tun können.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.