Haftpflicht Blogger
Virtual Server von Host Europe

Android und die Drawable Ordner

| 25. November 2012 | Keine Kommentare

Android Dateistruktur mit Drawable Verzeichnis

Frage:

Wenn ich ein Projekt in Eclipse anlege, dann gibt es kein „drawable“ Verzeichnis. Was soll ich tun? Nach dem Beispiel aus meinem Android Buch soll ich die Grafik in den drawable-Ordner legen.

Antwort:

Android hat sich im Laufe der Zeit weiterentwickelt. Zu Anfang, als noch mit Version 1.5 programmiert wurde, gab es nur den Ordner drawable, weswegen auch die meisten Android-Lehrbücher immer alles in diesen Ordner legen.  Dann hat es sich als vorteilshaft herausgestellt, dass man als App-Ersteller gleich die verschiedenen Bildschirmauflösungen von Anfang an mitberücksichtigt und darstellungsoptimierte Bilder für die verschiedenen Smartphone und Tabletgrößen anbietet (Developers: Supporting Multiple Screens).

Der Ordner drawable wurde in

  • drawable-hdpi
  • drawable-mdpi und
  • drawable-ldpi

aufgesplittet.

Noch etwas später kam nun sogar noch eine Variante für ganz hochauflösende Bildschirme hinzu:

  • drawable-xhdpi

Zu dem geschilderten Problem, dass Eclipse (Juno mit Plugin) keinen drawable Ordner anlegt, sei gesagt, dass man diesen ruhig selbst anlegen kann, um die Beispiele im Buch nachzuvollziehen. Will man dies nicht, kann man alternativ auch alle Dateien in das Verzeichnis drawable-mdpi legen (der kommt dem Grundgedanken des Ordners drawable am nächsten).

Spezialfälle:
Man kann einen Ordner
– drawable-nodpi

anlegen.
Dieser Ordner ist speziell für alle density-unabhängigen Ressourcen gedacht.
Dateien, die in diesem Ordner liegen, werden größenmäßig nicht umgerechnet!

 

Frage: 

Ich habe ein Bild mit der Größe 90 x 90 Pixel. Muss ich dieses nun in den drawable-lpdi oder in den drawable-mdpi Ordner legen?

Antwort:

Die Fragestellung unterstellt, dass die Ordner dafür gedacht sind, Bilder einer bestimmten Pixelgröße ( „von und bis zu“) aufzunehmen.  Dem ist nicht so. Die verschiedenen drawable-Verzeichnisse sind wegen der verschiedenen Größen der Endgeräte (z.B. 2,7 “ Zoll Bildschirm) ins Leben gerufen worden. Die nachfolgende Grafik zeigt grob die empfohlene Zuordnung von Bildschirmgröße zu dem jeweiligen Ordner.

Um bei unserem Beispiel mit dem 2,7″ Zoll Bildschirm zu bleiben. Alle Bilder, die auf diesem ausgegeben werden sollen, müssen idealerweise im small-Ordner (drawable-lpdi) stehen.

Quelle: developer.android.com, Grobe Zuordnung der Anzeigebildschirmgrößen zu den drawable-Verzeichnissen

 

Möglich wäre auch die Auslegung für eine bestimmte Punktdichte (dpi) des Ausgabebildschirms (siehe untere Hälfte der obigen Darstellung).

 

Density Points (dp)

Es empfiehlt sich generell Längen- und Höhenangaben in Android nicht in Pixel oder dpi, sondern in dp (density points) zu machen. In die „density“ gehen Größe und Auflösung des Endgeräts ein und man wird damit unabhängiger von den gerätespezifischen Parametern (Größe und Auflösung).

Beispiel: Ein rechteckiger Bildrahmen, der mit 5dp (densitiy points) programmiert ist, wird auf dem großen Tablet mit einer Breite von 5 Pixeln gezeichnet und auf dem kleinen Smartphonebildschirm nur mit einem Pixel.

Weiterer Vorteil der Programmierung in dp: Die Größenverhältnisse der Objekte zueinander bleibt erhalten.

Grobe Zuordnung von Bildschirmgrößen  zu Density-Points

  • small-Bildschirme:    mind. 426 x 320 dp
  • normal-Bildschirme: mind. 470 x 320 dp
  • large-Bildschirme:     mind. 640 x 480 dp
  • xlarge-Bildschirme:   mind. 960 x 720 dp

 

 

Frage

Muss ich jetzt für alle drawable-Ordner ein Bild erzeugen? Was ist, wenn ich einmal ein Bild für einen Ordner vergesse?

Antwort
Allgemein 300x250

Anzeige

Idealerweise sollte ein Bild für alle Ordner erstellt werden, wenn man eine schnelle und optimierte Darstellung für alle Bildschirme möchte.

Man kann aber auch die ganze Arbeit Android überlassen. Android sucht dann zunächst die Bilddatei in dem drawable-Verzeichnis, welches für das Gerät normal wäre. Wird es nicht fündig, dann in dem weiter nächstliegenden Ordner, u.s.w.

 

Am Schluss sucht Android dann auch im drawable-Ordner, der defaultmäßig gar nicht mehr angelegt wird.

Wenn es diese zeitaufwendige Suche, die erforderlich war, weil es kein Bild im entsprechenden Auflösungsordner (ldpi, mdpi, hdpi,xhdpi) gab, beendet hat, wird Android dann eine Rescalierung/Umrechnung anstellen.

Diese automatische Umrechnung kann zu sehr schlechten Ergebnissen und Größenverzerrungen führen. Für die Entwicklung mag es deshalb angehen, nur Bilder in einer Auflösung zu verwenden, bei der Auslieferung (Produktion) sollten aber alle Auflösungsordner mit optimierten Bildern versorgt werden.

 

 

Frage

In welcher Relation (Größenverhältnis) stehen die Bilder in den verschiedenen drawable-Verzeichnissen zueinander?

Antwort

Dreh und Angelpunkt ist der drawable-mdpi Ordner. Man stelle sich diesen Ordner als den Normgrößen-Ordner vor. Ausgehend von der Größe der Bitmap in diesem Ordner sollten die anderen Bitmaps mit dem Faktoren erstellt werden:

  • ldpi :  mdpi-Bitmapgröße mal 0,75
  • ldpi :  mdpi-Bitmapgröße mal 1,50
  • ldpi :  mdpi-Bitmapgröße mal 2,00

 

Frage:

Wenn ich nun verschiedene Ordner (drawables) für die Bitmaps angelegt habe, wie sieht es dann aus mit den Layouts? Die schmale Darstellung der Listview ist für ein Smartphone ja in Ordnung, aber bei einem Tablet ist eine bildschirmfüllende Listview nicht gerade sehr ansprechend.
Eclipse legt mir nur den Ordner layout an.

Antwort:

Genau richtig erkannt. Folgende Verzeichnisstruktur wird auf der Developer-Seite empfohlen:

 

Frage:

Neben Bitmaps (png, jpg, gif und Nine-Path Dateien .9.png) gibt es ja auch noch andere Ressourcen wie Vektorgraphiken, Farben, etc.
In welches drawable Verzeichnis sind diese einzustellen?

Antwort

Gute Frage.
Farbdefinitionen und Vektorzeichnungen (Shapes) die als XML-Datei definiert sind, sollten wegen ihrer Größenunabhängigkeit im Defaultordner drawable stehen.

Interessante Links

Android Developer: Screen support
  

Stichworte: , ,

Kategorie: Android

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.