2013-02-20 13 views
14

enter image description hereDimensioni estraibili 9 patch Android. In che modo le diverse densità gestiscono le aree non allungate?

Considerare l'immagine sopra. - La linea tratteggiata delimita il png 9-Patch che traccerò da un file di photoshop. Ne ho bisogno per creare una finestra popup. - La scatola incorpora un dropShadow come mostrato dallo strumento di misurazione in questa foto. - Le linee rosa sono lì per mostrare come userò lo strumento draw9Patch per creare la 9-Patch.

La mia domanda è: Se si dispone di una vista "Contenitore" con 9-Patch per uno sfondo, è necessario assicurarsi che le sue viste figli siano sempre all'interno della casella bianca. Stavo per usare il padding per questo. Stavo per impostare il padding a parità di strumento di misurazione. Quindi se è 30px in Photoshop imposterò layout_paddingLeft"=30dp" per il contenitore. (Il design è in MDPI quindi presumo che questa conversione sia a posto). Tuttavia, come fanno gli schermi di diverse densità a gestire il 9path. Ad esempio, l'area misurata sarà 30px o 30dip?

+0

Ho sempre pensato che il contenuto rimarrà (essere forzato, l'area non estensibile che agisce come padding) nella casella risultante dall'intersezione delle linee di tratto. Hai un esempio di contenuto che trabocca di quella scatola o stai solo supponendo che possa traboccare? – Luksprog

risposta

21

Via lo strumento draw9patch è possibile definire:

enter image description here

  • verticale che si estende: i pixel neri sul lato sinistro
  • orizzontale che si estende: i pixel neri sul lato superiore
  • contenuto verticale: il nero p ixels sul lato destro
  • contenuto orizzontale: i pixel neri sul fondo

Nota che i pixel di stretching non devono essere contigui, in modo da poter escludere alcune fetta specifica di stretching (guardare il freccia popup sopra). Allo stesso tempo puoi fare una ragionevole idea di dove saranno posizionati i tuoi contenuti, semplicemente dando un'occhiata all'anteprima a destra, con le aree viola all'interno. Come puoi immaginare, in questo modo non devi specificare alcun padding nel layout: la vista prenderà in considerazione quei valori utilizzando il 9patch impostato come sfondo.

Le aree di non allungamento si ridimensionano con la densità di pixel. Quindi, se imposti il ​​9patch sopra come una risorsa mdpi, la porzione in alto a sinistra viene visualizzata in un'area di 50x40 pixel @mdpi e nell'area di 100x80 pixel @xhdpi. Le aree di allungamento più a sinistra invece regolano la loro larghezza in base a dpi, mentre l'altezza è organizzata in base al contenuto. Altre fette di stretching funzionano in modo simile.

In entrambi i casi, occuparsi di un 9patch "a bassa risoluzione" può portare a brutti artefatti di pixelizzazione. Una possibile soluzione è fornire un diverso 9patch per ogni dpi supportato, o per definire solo quelli più alti (xhdpi) e lasciare che Android riduca di conseguenza.

Anche i limiti di contenuto vengono gestiti come dp, quindi vengono ridimensionati in base alla densità di pixel. Ad esempio: un riempimento sinistro definito nel 9patch originale come 40px @ mdpi, verrà tradotto in 80px @ xhdpi, quindi il contenuto non fletterà mai i limiti specificati. Nota È anche possibile ignorare i limiti di contenuto specificati in 9patch tramite le proprietà padding* nel proprio layout.

+0

"o per definire solo quelli più alti (xhdpi) e lasciare che Android riduca di conseguenza" aiutami molto. –

Problemi correlati