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