25.02.2014 Aufrufe

Android User Navigation (Vorschau)

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

Devcorner<br />

Dasher, Teil II<br />

Listing 4: Run-Methode<br />

auch im Applikation-Textfeld beibehalten<br />

bleibt. Man sollte Dasher immer in einem geordneten<br />

Zustand verlassen, sobald man eine<br />

andere Eingabemethode im Kontextmenü des<br />

extra Editierfeldes auswählt. Aus diesem<br />

Grund haben wir die Methode onExtractText<br />

ContextMenuItem(int) überschrieben. Hier<br />

wird die volle Standard-Funktionalität des<br />

Menüs (wie z.B. cut und paste) von der Methode<br />

der super-Klasse gewährleistet; mit der<br />

Ausnahme, dass die Sprachmodell-Datenbank<br />

beim Verlassen von Dasher geschlossen<br />

wird, nachdem Dasher (falls erwünscht) mit<br />

dem bereits eingegebenen Text trainiert<br />

wurde.<br />

@Override<br />

public void run() {<br />

Canvas canvas;<br />

try {<br />

while (running) {<br />

Rect rect = handler.beforeDrawing();<br />

canvas = null;<br />

try {<br />

canvas = surfaceHolder.lockCanvas(rect);<br />

synchronized (contextLock) {<br />

if (!running) { break; }<br />

handler.onDraw(canvas); }<br />

} finally {<br />

if (canvas != null) {<br />

surfaceHolder.unlockCanvasAndPost(canvas); }<br />

}<br />

if (!running) { break; }<br />

handler.afterDrawing(); }<br />

} finally { ... }<br />

}<br />

Zoomen und Navigieren<br />

Die Klasse SurfaceRunLoop ist der Motor unserer<br />

Applikation, deren Aufgabe darin besteht,<br />

nach vorherigem Verlauf und nach der<br />

aktuellen Fingerposition einen Ausschnitt<br />

des Dasher-Raums stets neu auf den Bildschirm<br />

zu zeichnen. Die Klasse wird instanziert<br />

und die Schleife gestartet, sobald das<br />

Surface zum ersten Mal erstellt wird. Solange<br />

die Surface nicht zerstört wird, bleibt die<br />

Schleife aktiv. Um auf dem Surface zeichnen<br />

zu können, muss ein Objekt von Typ Canvas<br />

vom SurfaceHolder mit lockCanvas(Rect)<br />

herangeholt werden. Dasher wird darauf gezeichnet,<br />

und dann mithilfe von<br />

unlockCanvasAndPost(Canvas) auf dem Surface<br />

dargestellt. Die Methode run() dieser<br />

Klasse ist in Listing 4 gezeigt. Bevor man<br />

zeichnen kann, sollte Dasher in die gewünschte<br />

Richtung bewegt werden. Die Methode<br />

onTouchEvent(MotionEvent) berechnet<br />

ununterbrochen die aktuelle Position des<br />

Fingers. In Abhängigkeit dieser Position vergrößert<br />

die Methode beforeDrawing() den<br />

angepeilten Dasher-Raum-Ausschnitt, was<br />

den Eindruck des Zoomens zwischen den<br />

Symbolen hervorruft. Solange der Bildschirm<br />

nicht berührt wird, bleibt Dasher still. Ansonsten<br />

wird in dieser Methode die nächste<br />

Momentaufnahme des Bildschirms vorbereitet.<br />

Diese wird unter der Annahme berechnet,<br />

dass der momentane Berührungspunkt<br />

nach einer festgelegten Anzahl Schritte<br />

genau im zentralen Kreuz ankommen würde;<br />

dazu werden ganz einfache geometrische Regeln<br />

verwendet [1]. Nachdem der neue<br />

Dasher-Raum-Ausschnitt festgelegt worden<br />

ist, werden die Position und die Größe der<br />

Symbolquadrate ihrer Auftrittswahrscheinlichkeit<br />

entsprechend neu berechnet. Die<br />

oben genannte Methode testet, ob das Symbolquadrat,<br />

welches das zuletzt geschriebene<br />

Zeichen darstellt, immer noch das Kreuz bedeckt.<br />

Ist dies nicht mehr der Fall, so wird<br />

das Symbol vom geschriebenen Text entfernt.<br />

Am Ende der Schleife wird in der Methode<br />

afterDrawing() geprüft, ob eines der unmittelbar<br />

nachfolgenden Symbolquadrate so<br />

groß geworden ist, dass es nun das Kreuz bedeckt.<br />

Trifft dies zu, wird der entsprechende<br />

Buchstabe in das EditText-Fenster geschrieben.<br />

Mithilfe dieser Schleife erreichen wir<br />

etwa 50-60 Updates der DasherInputView pro<br />

Sekunde.<br />

Lebenszyklus des Dasher<br />

Service<br />

Um einen zuverlässigen InputMethodService<br />

auf die Beine zu stellen, müssen wir sorgfältig<br />

wählen, welche der von <strong>Android</strong> zur Verfügung<br />

gestellten callback-Methoden wir implementieren<br />

sollen. Vor allem muss man bedenken,<br />

dass der InputMethodService immer<br />

aktiv ist, sobald das <strong>Android</strong>-Gerät eingeschaltet<br />

und Dasher das erste Mal gestartet<br />

wird. In unserem Fall ist noch das Zusammenspiel<br />

zwischen dem Service und der SurfaceView<br />

von Bedeutung. Deswegen ist der<br />

Lebenzyklus eines <strong>Android</strong>-InputMethodService<br />

für Dasher so wichtig. Detaillierte Informationen<br />

findet man in [2].<br />

Beim erstmaligen Starten des Dasher Service<br />

wird die Methode onCreateInputView()<br />

aufgerufen. Hier konstruieren wir die<br />

Linear Layout View-Komponente programmatisch,<br />

da sie nicht nur die eigentliche Dasher-<br />

InputView beinhaltet, sondern auch den<br />

Knopf, der die Umschaltung von kleinen zu<br />

112<br />

März 2012<br />

<strong>Android</strong>-<strong>User</strong>.de

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!