Offene Fragen über Drawables, Vektoren und Auflösungen

  • Antworten:16
  • OffenNicht stickyNicht beantwortet
  • Forum-Beiträge: 32

04.09.2017, 08:44:41 via Website

Hallo,
ich hab eine offene Fragen zum Thema "Bilder" in Android Studio, zu denen ich keine Antwort gefunden habe.

Wenn ich das richtig verstehe, stellen wir das gleiche Bild in verschiedenen Auflösungen bereit, damit die App das Bild nicht zum Darstellungszeitpunkt skalieren muss (und damit Performance verloren geht). Ist das soweit korrekt?
Heißt das dann auch, dass ich das jeweilige Bild exakt in der richtigen Pixelgröße bereitstellen muss? Angenommen ich stelle ein Bild mit 100x100dp dar. Muss dann das xhdpi Bild genau 200x200 px entsprechen? Wenn ich bspw. 220x200px als xhdpi bereitstelle, muss die App dann nicht das Bild immernoch skalieren, sodass wir wieder beim ursprünglichen Problem sind?
Wenn das stimmt, muss ich dann jedes mal, wenn ich die dp x dp größe eines ImageViews ändere, auch die ganzen Bilder anpassen?
Falls das nicht so ist, kann ich dann die jeweiligen m/h/xh...dpi Bilder vorsichtshalber etwas größer bereitstellen, als ich sie tatsächlich im ImageView nutze?

Meine zweite Frage ist, muss ich bei Vector Drawables die Größe irgendwo beachten? Für ältere Geräte werden ja anscheinend die Vektoren zu "normalen" Bildern (pngs? bitmaps?) umgewandelt. Heißt das, dass ich auch hier aufpassen muss, dass die Ursprungsvektoren die richtige Größe haben? Oder ist das hier komplett egal? Standart sind ja 24x24dp wenn ich eine Vektor Grafik in Android Studio erstelle.

Sorry für die vielen Fragen, aber ich bin noch relativ neu, und ich finde darauf einfach keine vernünftigen Antworten.

Antworten
  • Forum-Beiträge: 2.902

04.09.2017, 08:49:50 via Website

Hallo Florian,

von welchen "Bildern" sprichst du denn ?
Meintest du ggf die Icons, da du xhdpi erwähnst ?

Welchen Source haben denn die Images und wozu werden sie verwendet ?
Lieferst du sie sie in den Resourcen mit ??

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 32

04.09.2017, 08:56:14 via Website

Also ich meine Bilder, die ich selbst ins Projekt einfüge. Also ganz einfach gesagt, ich habe ein Bild auf dem PC und möchte das später in der App darstellen. Ich füge es in den Drawable Ordner ein und bilde es dann in nem ImageView ab.
So wie ich das verstanden hab, kann ich nicht einfach ein einziges hochauflösendes Bild einfügen, weil die App es dann live runterskalieren muss. Ich habe ein Android Studio Plugin, dass automatisch die verschiedenen Densities erstellt, wenn ich bspw. ein xxhdpi Bild bereitstelle. Ich muss dazu nur wissen, welche Größe das xxhpdi genau haben muss. Muss es pixelgenau die richtige Größe haben?

Bisher nutze ich nur Material Design Icons als Vektoren, damit ich mich nicht um verschiedene Densities kümmern muss.

— geändert am 04.09.2017, 08:56:54

Antworten
  • Forum-Beiträge: 2.902

04.09.2017, 09:08:49 via Website

Nein , du hast das ein wenig falsch verstanden :-)

Wenn du ein ImageView verwendest, dann macht dir Android das - je nach verwendetem Scalierungs Mode - selbst.

Du kannst aber nicht nur ein x beliebiges hoch aufgelöste Bild nehmen , dort gibt es auch Grenzen , denn Android
passt auch die Scalierung an die DPI an .
Wenn das Image zu gross ist , bekommst du ein Memory Exception.

Um das zu umgehen, musst du den nodpi folder verwenden um die DPI-Anpassung zu unterbinden.

— geändert am 04.09.2017, 09:17:28

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 32

04.09.2017, 09:19:58 via Website

Ich verstehe die Antwort nicht ganz. Angenommen, mein ImageView ist 100dp x 100dp. Welche Größte sollte ein xhdpi (oder irgendein anderes) Bild in Pixel haben?

Antworten
  • Forum-Beiträge: 2.902

04.09.2017, 09:28:55 via Website

Ja im Idealfalle quadratisch.

DP hat NICHTS mit Pixel zu tun. DP bedeutet "Density-independent Pixels" also DPI abhängig.
und in deinem Falle quadratisch zu deinem Platzhalter

Density-independent Pixels - An abstract unit that is based on the physical density of the screen. These units are relative to a 160 dpi (dots per inch) screen, on which 1dp is roughly equal to 1px. When running on a higher density screen, the number of pixels used to draw 1dp is scaled up by a factor appropriate for the screen's dpi. Likewise, when on a lower density screen, the number of pixels used for 1dp is scaled down. The ratio of dp-to-pixel will change with the screen density, but not necessarily in direct proportion. Using dp units (instead of px units) is a simple solution to making the view dimensions in your layout resize properly for different screen densities. In other words, it provides consistency for the real-world sizes of your UI elements across different devices.

https://developer.android.com/guide/topics/resources/more-resources.html#Dimension

— geändert am 04.09.2017, 09:33:14

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 32

04.09.2017, 09:50:28 via Website

Ja, aber die m/x/xh..dpi usw lassen sich doch auf Pixel umrechnen. Ein 100x100dp Bild entpsricht als xhdpi Bild soweit ich weiß 200x200 pixel. Die Frage ist jetzt, muss ich dann genau diese 200x200 als xhpdi bereitstellen, oder kann es auch bspw. 250x250 Pixel sein? So hätte ich noch etwas "Spielraum", falls ich das ImageView später etwas größer als 100x100dp machen will.
Sorry, mir ist bewusst, dass die Frage verwirrend ist.

— geändert am 04.09.2017, 09:55:12

Antworten
  • Forum-Beiträge: 2.902

04.09.2017, 09:59:20 via Website

Florian,

sorry , du stehst auf dem Schlauch .

Frage : Woher möchtest du als Entwickler wissen , auf welchem Device mit welcher DPI deine App läuft ?
Möchtest du für jedes verbautes Display ein passendes Image mitliefern ? - ein Ding der Unmöglichkeit.

  • Entweder lieferst du ein Image mit einer schönen Auflösung mit und sagst deinem Container mit DP, mach du mal.
  • Oder du arbeitest mit Pixel ( Blödsinn)

  • Oder (sehr aufwendig)
    du berechnest zur Laufzeit ( also nicht im XML) Source basierend deine Dimensions aus der Hardware.
    Das ist dann sicher, ich mache das z.b. immer so und verbiete Android von sich aus Hand anzulegen.

— geändert am 04.09.2017, 09:59:55

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 32

04.09.2017, 10:02:30 via Website

Ich dachte Android erkennt die Auflösung des Geräts und zieht das Drawable dann aus dem jeweiligen passenden Ordner? Heißt das, du stellst deine Bilder nur in einer Auflösung zur Verfügung?

Antworten
  • Forum-Beiträge: 2.902

04.09.2017, 10:07:58 via Website

Heißt das, du stellst deine Bilder nur in einer Auflösung zur Verfügung?

ja das mache ich.

Nur zur info : in den Resourcen sollen NUR App Grafiken sein.
Fotos z.b. gehören nicht in die Resourcen , die sollte man ggf. in den Assets mitliefern.

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 32

04.09.2017, 10:11:49 via Website

Das heißt diese Ordner spielen keine Rolle für dich:

image

— geändert am 04.09.2017, 10:13:02

Antworten
  • Forum-Beiträge: 2.902

04.09.2017, 10:26:47 via Website

doch , die brauchst du für die icons

P.S Das mit deinem res-lighttheme ist falsch , das kannst du getrost herausnehmen
Das ist nicht Konform und macht auch keinen Sinn

P.S.1 und dein Launcher png ist auch falsch plaziert

— geändert am 04.09.2017, 10:36:59

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 32

04.09.2017, 10:37:47 via Website

Das ist ein random Screenshot aus Google.

Wenn noch jemand anders was zu dem Thema zu sagen hat, ich bin ganz Ohr.

Antworten
  • Forum-Beiträge: 2.902

04.09.2017, 10:41:11 via Website

Das ist ein random Screenshot aus Google

Hatte ich vermutet, wahrscheinlich noch aus einem uralt Projekt.

P.S . Man kann Dir auch nicht viel mehr schreiben , als die originale Dokumentation
(siehe oberen Link)

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 32

04.09.2017, 11:11:28 via Website

Die Dokumentation erklärt, was die Begriffe bedeuten. Das weiß ich aber. Ich weiß aber nicht, ob es so gut ist, ein Bild nur in einer Auflösung mitzuliefern. So wie ich das verstehe, kostet das Rechenpower und ggf Bildqualität (auch beim runterskalieren)

Antworten
  • Forum-Beiträge: 2.902

04.09.2017, 11:25:58 via Website

Die Dokumentation erklärt, was die Begriffe bedeuten.

Nein , es erklärt nicht alleine die Begriffe, sondern die Technik die dahinter steht.
Und da ist der entscheidende Unterschied.

So wie ich das verstehe, kostet das Rechenpower und ggf Bildqualität (auch beim runterskalieren)

Natürlich kostet das Power und natürlich leidet bei jedem Imageprocessing die Qualität.
Das wirst du auch niemals umgehen können - das ist halt überall so.

Für jede Anwendungs - Variante musst du andere Techniken verwenden .

  • Für App Grafiken kannst du mit Resourcen und Containern arbeiten.
    Und hier sollte darauf geachtet werden , dass die Grafiken so klein wie möglich sind.
    (auch Möglichkeiten : 9-Patch, Tiles, drawable-xmls)
    Aus diesem Grunde habe ich Dir oben bereits mehrmals geschrieben , dass Du auch die nodpi variante
    verwenden kannst.

  • Für Fotos etc solltest du mit Assets und Bitmap-Operationen / Canvas arbeiten.

  • Hintergründe ( z.b. Gradient, Fill) sollten nicht als RasterImage mitgeliefert werden , sondern zur
    Laufzeit generiert werden .

Es gibt also keine eierlegende Wollmilchsau.

Dein grundsätzlicher Gedankenweg ist also falsch - du musst deine RenderTechnik dem anpassen,
was du umsetzen möchtest.

— geändert am 04.09.2017, 12:37:01

Liebe Grüße - Stefan
[ App - Entwicklung ]

Antworten
  • Forum-Beiträge: 32

04.09.2017, 12:58:09 via Website

Nagut, danke erstmal für deine Hilfe. Ich weiß zu schätzen, dass du dir die Zeit genommen hast, mir das zu erklären.

Antworten

Empfohlene Artikel