iOS-Apps auf Android portieren

Seite 2: Grafische und andere Feinheiten

Inhaltsverzeichnis

Die ersten iOS- und Android-Geräte hatten eine einheitliche Bildschirmauflösung von 320x480 Pixeln. Diese Zeiten sind jedoch vorbei und Entwickler sind mit hunderten unterschiedlicher Android-Geräte konfrontiert. Selbst wenn das Problem der Android-Fragmentierung oft und gerne heraufbeschworen wird, haben Android-Entwickler Werkzeuge an der Hand, um unterschiedlichste Bildschirmgrößen und -formate in den Griff zu bekommen. Google wählt hier eine andere Strategie als Apple. Beim iPhone kann man mit festen Proportionen rechnen, das Retina-Display hat mit 640x960 Pixeln exakt das gleiche Seitenverhältnis, wie bei der klassischen Auflösung, nur eben um den Faktor 4 erhöht.

Android-Geräte hingegen haben viele unterschiedliche Auflösungen, Pixeldichten, Gerätegrößen und Seitenverhältnisse. Daher ist ist hier Flexibilität das Stichwort. Android bietet dafür zum einen Layout-Manager wie LinearLayout, RelativeLayout und GridLayout. Sie erlauben eine flexible Anordnung von Bedienelementen nach definierten Regeln. In Kombination mit einer speziellen Maßeinheit, den "device-independent-pixel" (dp), lassen sich damit flexible UIs gestalten. Das System skaliert diese UI-Layouts dann automatisch auf die verschiedenen Geräteklassen. Die physikalische Größe der UI-Elemente auf dem Bildschirm ist dabei jeweils vergleichbar. Das macht für Touch-UIs generell Sinn, da unsere Finger "geräteunabhängig" eine weitgehend konstante Größe haben.

Bei Bedarf kann der Entwickler unterschiedliche (Bildschirm-)Layouts definieren. Das ist immer dann angeraten, wenn man mit einer App Smartphones und Tablets gleichermaßen anvisiert. Hier bietet sich zudem ein Zugriff auf das Fragment-API an, das Google auch für Geräte ab Android 1.6 als Backport anbietet. Fragmente sind Anwendungsmodule, die in der Regel aus einem UI und dazugehöriger Logik bestehen. Abhängig von der Gerätegröße können beispielsweise ein Fragment für Smartphones oder zwei Fragmente für Tablets gleichzeitig auf dem Bildschirm platziert werden.

Ähnlich wie bei iOS sollte man bei Android Grafiken in unterschiedlichen Auflösungen zur Verfügung stellen, um eine jeweils optimale Darstellungsqualität auf unterschiedlichen Geräten zu erreichen. Android unterteilt diese dafür in vier verschiedene Klassen, die sich in der Pixeldichte unterschieden. Das Spektrum reicht von gering (ldpi) über mittel (mdpi) und hoch (hdpi), bis zu extra hoch (xhdpi). Mithilfe sogenannter Resource Qualifier werden optimierte Grafiken in unterschiedliche Verzeichnisse unter jeweils gleichem Namen gelegt. Das Android-System wählt dann zur Laufzeit die am besten zum Gerät passende Grafik aus. Fehlt eine Grafik in der Geräteauflösung, so skaliert das System selbstständig auf die benötige Größe hoch beziehungsweise runter. Das Konzept der Resource Qualifier ist flexibel genug, um etwa unterschiedliche Grafiken, abhängig von der Gerätegröße oder der eingestellten Sprache, zu berücksichtigen.

Nutzt man Grafiken für interaktive Bedienelemente, muss der Grafiker bei Android verschiedene Zustände beachten. Beispielsweise benötigt man für einen Button oft drei Grafiken für unterschiedliche Zustände: normal, fokussiert und gedrückt. Je nach Anwendungsfall können hier noch weitere dazukommen, beispielsweise für deaktivierte Elemente oder bei Checkboxen ein selektierter Zustand mit gesetztem Häkchen.

Schließlich bietet Android noch spezielle Grafiken im PNG-Format an: Die sogenannten Nine-Patch-Grafiken skaliert das System nach einem speziellen Mechanismus. Dazu wird die Grafik in zu skalierende und fixierte Bereiche (Patches) eingeteilt. Die fixierten Bereiche bleiben beim Skalieren scharf und sind gut für abgerundete Ecken bei Buttons verwendbar (Abbildung 3).

Unter Android lassen sich grafische Elemente fixieren, um Unschärfen in Folge einer automatischen Skalierung zu vermeiden (Abb. 3).

Neben der reinen Portierung von iOS-Apps sollte man auch Android-spezifische Funktionen in Betracht ziehen, die es in dieser Form auf iOS nicht gibt. Als Beispiel seien hier Home Screen Widgets und Intents genannt. Home Screen Widgets sind Mini-Anwendungen, die direkt auf dem Startbildschirm laufen und damit für den Nutzer besonders präsent sind. Technisch gibt es einige Unterschiede und Beschränkungen zur normalen Android-App-Entwicklung, doch je nach Anwendungsfall kann sich der zusätzliche Aufwand lohnen. Ein weiteres Konzept, das sich nur bei Android findet, sind die Intents. Mit ihnen lassen sich Android-Apps miteinander koppeln, ohne dass sie voneinander wissen müssen. Das geschieht aufgaben- und datenorientiert zur Laufzeit. Beispielsweise kann eine App ein Bild anfordern ohne anzugeben, welche App dieses bereitstellen soll. Ein weiterer oft genutzter Anwendungsfall ist das Teilen von Inhalten. Mit wenigen Zeilen Code schafft man so die Verbindung zu E-Mail, SMS oder zusätzlich installierten Apps wie Facebook, Google+ und Twitter.

Weitere Informationen zur UI-Gestaltung unter Android findet der Leser auf der offiziellen Android-Design-Seite oder in spezialisierten Blogs wie dem Android UI Patterns Blog. Idealerweise sollte man sich jede zu portierende App individuell anschauen, um das volle Potenzial ausschöpfen zu können. Aber mit diesem Artikel hat der Leser die ersten Anhaltspunkte für eine erfolgreiche Portierung an der Hand.

Markus Junginger
ist Gründer des Münchener Unternehmens greenrobot, das sich der Entwicklung von Android-Apps widmet und dabei regelmäßig iOS-Apps portiert.
(rl)