Autore Topic: Gestire al meglio densità e dimensione view  (Letto 929 volte)

Offline arlabs

  • Utente normale
  • ***
  • Post: 433
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Gestire al meglio densità e dimensione view
« il: 26 Settembre 2014, 10:19:49 CEST »
0
Ciao,

più di una volta mi è capitato di aver necessità di usare Button o ImageView un po' più grosse su schermi più grandi.
Questo sarebbe bello farlo utilizzando immagini più grandi (con più pixel) tanto più grande è l'ImageView.
Siccome la dimensione dell'immagine (risorsa drawable) già è vincolata con la densità dello schermo, stavo cercando il metodo più elegante e compatto per farlo.

Prendiamo ad esempio:
Codice (XML): [Seleziona]
            <ImageView
               android:layout_width="wrap_content"
               android:layout_height="wrap_content"
               android:id="@+id/btn_do"
               android:src="@drawable/ic_do" />
(Il wrap_content lo ritengo importante per evitare che l'immagine venga riscalata (resampled) per essere disegnata. Utilizzando quindi al meglio i pixel del display.)

Tale ImageView fa riferimento ad un drawable ic_do.
Tenendo un immagine ic_do.png di dimensioni differenti in ogni cartella delle risorse dpi (drawable-mdpi, drawable-hdpi, drawable-xhdpi...) ottengo di avere l'ImageView della stessa dimensione su tutti i display ma meglio definita dove lo schermo è più denso. Questo è standard.

A questo punto, volendo cambiare la dimensione dell'immagine ANCHE in dipendenza della dimensione del display mi troverei a far dipendere la dimensione dell'immagine da diverse variabili. Dovendo creare nxm cartelle (ed immagini).
Ok, posso evitare di duplicare le immagini e riferirle con nxm drawable xml che riferiscono le singole png ma questo risolve solo un problema di spazio, non di complessità.
Se lo devo fare per diverse ImageView, diventa ancora più pesante.

Se la variazione di dimensione non è eccessiva, ho provato ad usare minWidth e minHeight per gli schermi più grandi... accettando una scalatura e sgranatura dell'immagine, ma su schermi 10" a 160dpi (la gran parte dei 10" sono 160dpi ad oggi) può essere brutto.

Mi domandavo: "Esiste qualche modo più elegante e lineare per gestire questo?"

L'ideale sarebbe che Android, invece di pescare le risorse in base alla densità della configurazione dello schermo, calcolasse prima la densità necessaria a quella View per essere disegnata e poi usasse quella densità per andare a pescare la risorsa.
Ma, non essendo così, c'è un modo (anche programmatico) di fare questo?
Voi come gestite questa situazione???

Ciao

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Gestire al meglio densità e dimensione view
« Risposta #1 il: 26 Settembre 2014, 10:28:32 CEST »
0
Per questa necessità le linee guida ufficiali indicano di usare il "resource qualifier" -sw<NNN>dp , dove sw sta per smallest width (dimensione del lato corto del display).

Esempio, per discriminare i tablet dagli smartphone a prescidere dai dpi, si usa -sw600dp (o addirittura -sw720dp).
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline arlabs

  • Utente normale
  • ***
  • Post: 433
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Gestire al meglio densità e dimensione view
« Risposta #2 il: 26 Settembre 2014, 10:39:58 CEST »
0
Si bradpao, questo è ok.

Il mio problema non era questo. Mi rendo conto di aver scritto una tema, e non sono stato ben chiaro.

Che io usi come qualifier sw<NNN>dp, o w<NNN>dp, o normal/large/xlarge mi trovo un secondo grado di libertà oltre alla densità e dovrei quindi definire le cartelle (ad es.)

drawable-normal-mdpi
drawable-normal-hdpi
drawable-normal-xhdpi
drawable-normal-xxhdpi
drawable-large-mdpi
drawable-large-hdpi
drawable-large-xhdpi
drawable-large-xxhdpi
drawable-xlarge-mdpi
drawable-xlarge-hdpi
drawable-xlarge-xhdpi
drawable-xlarge-xxhdpi

Ciascuna con la sua immagine di dimensioni corrette.
Cercavo un modo per evitare questo, o un modo per gestirlo in modo più efficace e/o semplice.
Sapere come, i frequentatori di qeusto forum, sono avvezzi ad affrontare questo problema.

Ciao

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Gestire al meglio densità e dimensione view
« Risposta #3 il: 26 Settembre 2014, 22:39:14 CEST »
0
Il problema che hai descritto è dovuto alla dimensione fisica dello schermo, se parliamo dello stesso problema. E secondo me distinguere tra dimensioni smartphone e dimensioni tablet, copre il 95% della problematica. Per cui 8 folder al massimo e te la cavi.

Tu vorresti un automatismo, ma dovrebbe scegliersi le risorse ogni volta a run-time, ogni volta che ridisegna il layout. In linea di principio fattibile, ma molto complicato e pesante.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline arlabs

  • Utente normale
  • ***
  • Post: 433
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Gestire al meglio densità e dimensione view
« Risposta #4 il: 27 Settembre 2014, 11:23:07 CEST »
0
Si, chiedevo se qualcuno ha qualche automatismo che usa.

Come gli utenti di questo forum soni soliti risolvere questo problema.

Ciao

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Gestire al meglio densità e dimensione view
« Risposta #5 il: 27 Settembre 2014, 12:27:10 CEST »
+1
Immagini di partenza vettoriali, elaborate con degli script in Bash, Python e Makefile richiamano Inkscape e ImageMagick da linea di comando per generare in automatico tutte le bitmap con la densità volute nelle giuste directory.

Inviato dal mio Nexus 5 utilizzando Tapatalk

adb logcat | tee /tmp/logcat | grep TAG

Offline arlabs

  • Utente normale
  • ***
  • Post: 433
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Gestire al meglio densità e dimensione view
« Risposta #6 il: 29 Settembre 2014, 10:21:08 CEST »
0
Grazie iceweasel,
ottima soluzione.

All'inizio anche io avevo provato a disegnare immagini vettoriali (con Inkscape) ma, non essendo un grafico, mi son trovato un po' in difficoltà ad usarlo.
Potrei comunque usare la stessa filosofia e riscalare automaticamente a partire da immagini raster in super-risoluzione.

...anche se in realtà alla fine tendo sempre a "ritoccare a mano", le icone più piccole, visto che i tratti più stretti escono sempre male.

Ciao.

Offline roboso

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 7
  • Sistema operativo:
    linux debian
Re:Gestire al meglio densità e dimensione view
« Risposta #7 il: 17 Ottobre 2014, 01:12:20 CEST »
0
Ciao...

interessante avere uno script che converte io ne ho cercati vari su internet ma nessuno funzionante iceweasel potresti gentilmente linkare uno script che funzionante da te testato?
Sto cercando di realizzare un'app con degli imagebutton ma si sta rivelando alquanto lunga la lavorazione delle immagini.


Grazie ciao in anticipo!!!

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Gestire al meglio densità e dimensione view
« Risposta #8 il: 17 Ottobre 2014, 18:59:39 CEST »
0
Questo è scritto in Python e funziona sotto Linux (ignoro per altri sistemi):

https://github.com/mitchtech/android_iconify

utilizza ImageMagick per elaborare le bitmap:

http://www.imagemagick.org

è comunque facile modificarlo per le proprie esigenze anche per chi non conosce il Python.

Se le immagini di partenza sono vettoriali basta usare Inkscape:

http://inkscape.org

non serve aprire l'interfaccia grafica, da linea di comando è possibile convertire un file vettoriale SVG in un file bitmap PNG:

Codice: [Seleziona]
inkscape --export-png=file.png file.svg
Con ImageMagick è possibile creare anche le ombre da linea di comando:

Bluring and Sharpening -- IM v6 Examples
adb logcat | tee /tmp/logcat | grep TAG

Offline arlabs

  • Utente normale
  • ***
  • Post: 433
  • Respect: +49
    • Mostra profilo
  • Dispositivo Android:
    GalaxyS6, Nexus5
  • Play Store ID:
    AR Labs
  • Sistema operativo:
    Windows 10
Re:Gestire al meglio densità e dimensione view
« Risposta #9 il: 17 Ottobre 2014, 19:09:04 CEST »
0
Uso anche io ImageMagick, ma riscalare solo immagini png, non parto da vettoriali.

Ho scritto un batch per fare ciò... se serve te lo mando...


Offline roboso

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 7
  • Sistema operativo:
    linux debian
Re:Gestire al meglio densità e dimensione view
« Risposta #10 il: 17 Ottobre 2014, 19:52:16 CEST »
0
Mille grazie

Post unito: [time]17 Ottobre 2014, 21:20:14 CEST[/time]
scusa se mi permetto ma la riga di comando giusta per esportare i file da png ad svg è questa:


Codice: [Seleziona]
inkscape prova.png --export-plain-svg=filename.svg
stavo cercando si capire una cosa.. ho visto che parlate spesso di dp - pi - px e da quanto ho capito leggendo i post che conviene salvare le immagini per densità, cioè con i pi? quindi posso fare immagini grandi 2cmx2cm con 1000000pi?? non ho ben chiara questa cosa...

Post unito: 17 Ottobre 2014, 21:29:18 CEST
mi autorispondo:


px

Pixels
- corresponds to actual pixels on the screen.

in pollici - in base alle dimensioni fisiche dello schermo . 1 pollice = 2,54 centimetri


mm millimetri - in base alle dimensioni fisiche dello schermo .


pt punti - 1/72 di pollice in base alle dimensioni fisiche dello schermo .


dp pixel densità - indipendente - un'unità astratta che si basa sulla densità fisica dello schermo . queste unità sono relative ad uno schermo di 160 dpi , così si DP è un pixel su uno schermo di 160 dpi . il rapporto di dp - per - pixel cambierà con la densità degli schermi , ma non necessariamente in proporzione diretta . nota : il compilatore accetta sia " dip " e " dp " , anche se " dp " è più coerente con " sp " .


sp scala indipendente pixel - questo è come l'unità dp , ma è anche ridimensionati in base alla dimensione del carattere preferenze dell'utente . si consiglia di utilizzare questa unità quando si specificano le dimensioni di carattere , in modo che sarà regolato sia per la densità degli schermi e alle preferenze dell'utente .
         


      
« Ultima modifica: 17 Ottobre 2014, 21:29:18 CEST da roboso, Reason: Merged DoublePost »

Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Gestire al meglio densità e dimensione view
« Risposta #11 il: 17 Ottobre 2014, 22:35:18 CEST »
0
Il comando citato da me è da SVG a PNG come ho scritto. Il comando che hai scritto è il contrario da PNG a SVG, il quale implica una chiamata a un software esterno (potrace) per convertire una immagine bitmap in vettoriale. Operazione molto complessa e la correttezza del risultato dipende molto dal tipo di immagine di partenza.

La mia pipeline parte dal SVG per poi ricavare i vari PNG per i vari DPI sopportati da Android.

Inviato dal mio Nexus 5 utilizzando Tapatalk

adb logcat | tee /tmp/logcat | grep TAG

Offline roboso

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    nexus 7
  • Sistema operativo:
    linux debian
Re:Gestire al meglio densità e dimensione view
« Risposta #12 il: 17 Ottobre 2014, 23:48:54 CEST »
0
scusa ma per capire a cosa ti serve convertire i svg che sono di qualità nettamente superiore dei bitmap?


Offline iceweasel

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 878
  • Respect: +147
    • Mostra profilo
  • Dispositivo Android:
    LGE P990 - Google Nexus 5
  • Sistema operativo:
    Linux Debian Sid
Re:Gestire al meglio densità e dimensione view
« Risposta #13 il: 18 Ottobre 2014, 00:23:07 CEST »
0
API ufficiale di Android non ha il supporto per SVG (è un formato molto complesso, per i device con poca memoria e poca potenza di calcolo sarebbero ingestibili), alla fine devi creare i file PNG per tutte le densità: ldpi, mdpi, hdpi, ecc... nelle opportune directory.



Inviato dal mio Nexus 5 utilizzando Tapatalk

adb logcat | tee /tmp/logcat | grep TAG