2013-02-20 12 views
14

enter image description here9-Patch ziehbare Dimensionen Android. Wie gehen unterschiedliche Dichten mit den nicht gedehnten Bereichen um?

Betrachten Sie das obige Bild. - Die gepunktete Linie grenzt das 9-Patch-Png ab, das ich aus einer Photoshop-Datei herausschneiden werde. Ich brauche es, um ein Popup-Fenster zu erstellen. - Die Box enthält einen DropShadow, wie das Messwerkzeug in diesem Foto zeigt. - Die rosa Linien sind da, um zu zeigen, wie ich das draw9Patch Werkzeug verwenden werde, um den 9-Patch zu erstellen.

Meine Frage ist: Wenn ich eine Ansicht "Container" mit dem 9-Patch für einen Hintergrund habe, muss ich sicherstellen, dass seine Kinder Ansichten immer in der weißen Box sind. Ich würde dafür Padding verwenden. Ich wollte die Polsterung auf das Messwerkzeug einstellen. Wenn es in Photoshop 30px ist, setze ich layout_paddingLeft"=30dp" für den Container. (Das Design ist bei MDPI, also nehme ich an, dass diese Konvertierung in Ordnung ist). Wie gehen Bildschirme unterschiedlicher Dichte mit dem 9-Pfad um? Zum Beispiel wird der gemessene Bereich 30px oder 30dip sein?

+0

Ich dachte immer, dass der Inhalt bleibt (gezwungen werden, die nicht dehnbare Fläche wirkt wie Polsterung) in der Box resultierte aus der Strecklinien Kreuzung. Haben Sie ein Beispiel dafür, dass der Inhalt diese Box überläuft, oder nehmen Sie an, dass sie überläuft? – Luksprog

Antwort

21

Über das draw9patch Werkzeug kann definiert werden:

enter image description here

  • vertikale Streckungs: die schwarzen Pixel auf der linken Seite
  • horizontale Dehnung: die schwarzen Pixel auf der Oberseite
  • vertikaler Inhalt: der schwarze p ixels auf der rechten Seite
  • horizontal Inhalt: die schwarzen Pixel auf dem Boden

Beachten Sie, dass Stretching Pixel nicht zusammenhängend sein müssen, so dass Sie einige spezifische Scheibe aus Stretching (siehe die ausschließen Popup-Pfeil oben). Gleichzeitig können Sie eine vernünftige Vorstellung davon erstellen, wo Ihre Inhalte platziert werden. Sehen Sie sich dazu die Vorschau rechts mit den violetten Bereichen an. Wie Sie sich vorstellen können, müssen Sie auf diese Weise kein Padding angeben in Ihrem Layout: berücksichtigt die Ansicht diese Werte unter Verwendung des 9patch, das Sie als Hintergrund festlegen.

Die Bereiche ohne Dehnung skalieren mit der Pixeldichte. Wenn Sie also das 9patch oben als mdpi Objekt festlegen, wird das Segment oben links in einem Bereich von 50x40 Pixel @mdpi und im Bereich 100x80 Pixel @xhdpi gerendert. Die linken Dehnungsbereiche ordnen ihre Breite stattdessen nach dpi an, während die Höhe nach Inhalt geordnet ist. Andere Dehnungsstreifen arbeiten auf ähnliche Weise.

In beiden Fällen kann der Umgang mit einer "niedrigen Auflösung" 9patch zu hässlichen Pixelbildungsartefakten führen. Eine mögliche Lösung besteht darin, für jede unterstützte dpi einen anderen 9Patch anzugeben oder nur die höheren zu definieren (xhdpi) und Android entsprechend skalieren zu lassen.

Die Inhaltsgrenzen werden auch als dp behandelt, daher skalieren sie entsprechend der Pixeldichte. Beispiel: Ein linkes Padding, das im ursprünglichen 9patch als 40px @ mdpi definiert ist, wird in 80px @ xhdpi übersetzt, sodass der Inhalt niemals die angegebenen Grenzen verlässt. Hinweis: Sie können sogar die in 9patch angegebenen Inhaltsgrenzen über die Eigenschaften padding* in Ihrem Layout überschreiben.

+0

"oder um nur die höheren zu definieren (xhdpi) und Android von ihnen entsprechend skalieren lassen" Hilf mir sehr. –