2016-06-23 29 views
5

Desidero disegnare un canvas su base dati a livello di SeekBar. Ho scritto il codice per impostare LayoutParams dello SeekBar in base alla densità del dispositivo. Sto usando caso switch con densità di dispositivo comeDisegno sul problema della tela nei dispositivi di fascia alta

final DisplayMetrics metrics = Resources.getSystem().getDisplayMetrics(); 
if(metrics.densityDpi <= DisplayMetrics.DENSITY_LOW){ 
     zoomBarParams = new LinearLayout.LayoutParams(18, 
       LayoutParams.FILL_PARENT); 
     } else if (metrics.densityDpi <= DisplayMetrics.DENSITY_MEDIUM){ 
      zoomBarParams = new LinearLayout.LayoutParams(24, 
        LayoutParams.FILL_PARENT); 

     }else if (metrics.densityDpi <= DisplayMetrics.DENSITY_HIGH){ 
      zoomBarParams = new LinearLayout.LayoutParams(24, 
        LayoutParams.FILL_PARENT); 

     }else if (metrics.densityDpi <= DisplayMetrics.DENSITY_XHIGH){ 
      zoomBarParams = new LinearLayout.LayoutParams(31, 
        LayoutParams.FILL_PARENT); 


     }else if (metrics.densityDpi <= DisplayMetrics.DENSITY_XXHIGH){ 
      zoomBarParams = new LinearLayout.LayoutParams(60, 
        LayoutParams.FILL_PARENT); 

     }else if (metrics.densityDpi <= DisplayMetrics.DENSITY_XXXHIGH){ 
      zoomBarParams = new LinearLayout.LayoutParams(60, 
        LayoutParams.FILL_PARENT); 

     } else { 
      zoomBarParams = new LinearLayout.LayoutParams(60, 
        LayoutParams.FILL_PARENT); 

     } 

Ma questo non sta funzionando in dispositivi di fascia alta come Samsung nota 5, Galaxy S6 bordo etc..I crede che questi dispositivi è disponibile in gamma XXXHIGH densità, quindi perchè non funziona? C'è qualche relazione tra la densità del dispositivo e la dimensione dello schermo mentre si disegna su tela? Qualsiasi aiuto sarà molto apprezzato.

+0

Penso che il tuo problema è che 'densityDpiValue' non è garantito per essere esattamente uguale a una delle densità specificate dalle costanti' DisplayMetrics'. Diciamo che otterrai densità pari a '321' - non innescherà nessuno dei casi. Prendi in considerazione la possibilità di controllare gli intervalli. –

+0

Come una domanda a parte: quale problema stai cercando di risolvere con questo 'switch'? Perché non usare invece i valori 'dp'? –

+0

@DmitryZaitsev Sì. Ho aggiornato il mio codice come verificare l'intervallo. Il problema è stato risolto in Samsung Note 5 e Galaxy S6 Edge. Ma il problema esiste ancora in S6 Edge +.Si prega di consultare il mio codice aggiornato in questione. – Jas

risposta

2

Perché non provare a sbarazzarsi di tutti gli if else casi e fare qualcosa di generico? Poiché è necessario inserire valori di pixel diversi a seconda delle dimensioni dello schermo, è possibile utilizzare invece dp.

È possibile ottenere px da dp a seconda della densità dello schermo del dispositivo e utilizzarlo in LayoutParams.

public static float convertDpToPixel(float dp, Context context){ 
    Resources resources = context.getResources(); 
    DisplayMetrics metrics = resources.getDisplayMetrics(); 
    float px = dp * ((float)metrics.densityDpi/DisplayMetrics.DENSITY_DEFAULT); // You can cache "((float)metrics.densityDpi/DisplayMetrics.DENSITY_DEFAULT)" to avoid re-calculation. 
    return px; 
} 

Così si creerà il param in questo modo:

zoomBarParams = new LinearLayout.LayoutParams(convertDpToPixel(DP_VALUE, context), 
       LayoutParams.FILL_PARENT); 

dove DP_VALUE rimarrà costante su tutti i dispositivi.

Spero che questo possa risolvere il tuo problema.

2

Problema: non esiste alcun codice generico per questo problema.
Se si desidera densità originale, è possibile utilizzare rispettivamente metrics.xdpi e metrics.ydpi per densità orizzontale e verticale.

o andare seguire questo codice:

public static String getDensity(Resources resources) { 
    switch (resources.getDisplayMetrics().densityDpi) { 
     case DisplayMetrics.DENSITY_LOW: 
      return "ldpi"; 
     case DisplayMetrics.DENSITY_MEDIUM: 
      return "mdpi"; 
     case DisplayMetrics.DENSITY_HIGH: 
      return "hdpi"; 
     case DisplayMetrics.DENSITY_XHIGH: 
      return "xhdpi"; 
     case DisplayMetrics.DENSITY_XXHIGH: 
      return "xxhdpi"; 
     case DisplayMetrics.DENSITY_XXXHIGH: 
      return "xxxhdpi"; 
     case DisplayMetrics.DENSITY_TV: 
      return "tvdpi"; 
     default: 
      return "unknown"; 
    } 

Una spiegazione approfondita molto di questo argomento è dato da questo ragazzo qui:

https://stackoverflow.com/a/33789580/5476209

anche controllare DisplayMetrics sezione in Android documentazione sviluppatori

1

Se si lavora su tela, il mio consiglio è di giocare solo con i pixel. Invece di dpi è possibile utilizzare la larghezza e l'altezza in percentuale in base alle proprie esigenze. Ciò si adatta meglio e funziona su ogni dispositivo. Ad esempio se hai bisogno di una barra di ricerca di 600 x 128px per le dimensioni dello schermo 800 x 1280 px. Quindi è come il 75% della larghezza e il 10% dell'altezza. Ora applica questa percentuale con il codice-

DisplayMetrics dm = getResources().getDisplayMetrics(); 
int seekBarWidth= dm.widthPixels * 75/100; 
int seekBarHeight= dm.heightPixels * 10/100; 

E questo funzionerà perfettamente per tutte le dimensioni dello schermo. Fammi sapere in caso di ulteriore assistenza :)