2011-08-27 16 views
12

Voglio ottenere una risoluzione reale dello schermo su Android Honeycomb.Come ottenere la risoluzione dello schermo in Android Honeycomb?

Ecco il mio codice

Display display = getWindowManager().getDefaultDisplay(); 
int w = display.getWidth(); 
int h = display.getHeight(); 

Il dispositivo è Asus Transformer TF101 con il formato è 1280x800.

Ma il codice sopra riportato fa w = 1280 eh = 752 (Quello che voglio è 800 non 752).

so h < 800 perché è sottratto per barra di stato.

Hai un modo per ottenere l'altezza reale dello schermo?

Grazie mille!

+2

** @ alexanderblom ** Non è facile da spiegare per il mio caso. Ma ho davvero bisogno di ottenere altezza completa o barra di stato di Honeycomb. Grazie! – Levanphong7887

risposta

4

Utilizzare la struttura DisplayMetrics, che descrive le informazioni generali sul display, quali dimensioni, densità e ridimensionamento dei caratteri.

Il codice utilizzato per ottenere l'altezza del display è la seguente:

DisplayMetrics metrics = new DisplayMetrics(); 
getWindowManager().getDefaultDisplay().getMetrics(metrics); 

Log.d("log", "OOO " + metrics.heightPixels); 

E 'dovrebbe tornare l'altezza assoluta del display, in pixel.

+1

Grazie, ma metrics.heightPixels = 752, uguale a display.getHeight(); – Levanphong7887

+4

Su Honeycomb, questo non riporta le reali dimensioni dello schermo fisico. –

5

Ho un Xoom in mano, e ho usato getWindowManager().getDefaultDisplay() per recuperare la dimensione, mi restituisce 1280 x 800 che è la dimensione a schermo intero. Mi chiedo come ottenere la risoluzione meno barra di navigazione con API prima della versione 3.0.

12

Ecco a voi, con piccolo trucco e presupposto che schermo le decorazioni sono in alto/basso e mai a sinistra/destra:

Display d = getWindowManager().getDefaultDisplay(); 
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT); 
int h = d.getWidth(); 
setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 
int w = d.getWidth(); 
+1

sfortunatamente per esempio su kindle fire la tua ipotesi è completamente sbagliata –

4

La risposta che si stanno ottenendo, come correttamente dedotto è a causa della barra di stato . Tutto quello che devi fare è sbarazzarti della barra di stato prima dell'avvio della visualizzazione della finestra. E quindi è possibile ripristinare la barra di stato prima di impostare la visualizzazione del contenuto dell'attività.

Il motivo per farlo in questo modo è che sbarazzarsi della barra di stato influisce sul disegno della vista a meno che non si gestiscano tutte le misure, layout e disegni dinamicamente. Fare questo è al centro del tuo runtime causerà la scomparsa della barra di stato, e poi riapparire se lo si desidera, con conseguente confusione dagli utenti.

per nascondere la StatusBar:

Nella tua onCreate():

final WindowManager.LayoutParams attrs = getWindow().getAttributes(); 
//Add the flag to the Window Attributes 
attrs.flags |= WindowManager.LayoutParams.FLAG_FULLSCREEN; 
getWindow().setAttributes(attrs); 
//Disassociate Display from the Activity 
getWindow().addFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); 

Ora il vostro schermo di default dovrebbe funzionare correttamente

ancora nel vostro onCreate():

Display display = getWindowManager().getDefaultDisplay(); 
int w = display.getWidth(); 
int h = display.getHeight(); 

Ora, prima di impostare il contenuto

Anche in questo caso, nella vostra onCreate():

final WindowManager.LayoutParams attrs = getWindow().getAttributes(); 
//Show the statubar 
attrs.flags &= (~WindowManager.LayoutParams.FLAG_FULLSCREEN); 
getWindow().setAttributes(attrs); 
// Reassociate. 
getWindow().clearFlags(WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS); 

Infine:

setContentView(r.layout.myView); 

I segmenti di codice precedenti funzionano quasi ovunque, in realtà . Sto solo pensando alla tua esperienza utente. Sentiti libero di metterli ovunque, naturalmente. Questi sono segmenti funzionali estratti da uno dei miei progetti. Ho visto tecniche simili anche in alcuni Home Launcher. Nota: a seconda della versione di Android, potrebbe essere necessario eseguire la barra di stato in onWindowAttached(). Se lo fai, assicurati di chiamare ancora super.onWindowAttached().

un'altra tecnica: Naturalmente, se si vuole fare questo in ogni caso, si può sempre impostare l'attributo di attività in questo modo nel vostro manifesto.

android:theme="@android:style/Theme.NoTitleBar.Fullscreen" 
+0

Questo esempio non sembra funzionare su un Nexus 4 con 4.4. La dimensione del display è misurata meno barra di notifica. –

+0

Questo è il nocciolo di questo articolo, un metodo per sbarazzarsi della barra di notifica e quindi misurare. Tuttavia, questo esempio è stato realizzato in modo significativo prima di Android 4.4. Android 4.4 non ti permette di rimuovere la barra di notifica? –

0

Nella domanda Height of statusbar? spiegare come si ottiene l'altezza della barra di stato. Avendo il valore statusBarHeight, si può fare:

Display display = getWindowManager().getDefaultDisplay(); 
int h = display.getHeight() + statusBarHeight; 
0

È possibile estendere un layout che sarà il layout top (che sarà impostato su fill_parent larghezza e altezza) e ignorare l'onSizeChange (int width, int altezza, int oldwidth, int oldheight). La larghezza e l'altezza sono la larghezza e l'altezza reali del display.

0

Forse è possibile aggiungere l'altezza della barra di stato. Height of statusbar?

Rect rectgle= new Rect(); 
    Window window= getWindow(); 
    window.getDecorView().getWindowVisibleDisplayFrame(rectgle); 
    int StatusBarHeight= rectgle.top; 
    int contentViewTop= `enter code here` 
     window.findViewById(Window.ID_ANDROID_CONTENT).getTop(); 
    int TitleBarHeight= contentViewTop - StatusBarHeight; 

    Log.i("*** Jorgesys :: ", "StatusBar Height= " + StatusBarHeight + " , TitleBar Height = " + TitleBarHeight); 
15

partire Andorid 3.2, l'altezza della barra di stato del sistema non è incluso in altezza di DisplayMetrics, è necessario utilizzare le API non documentate (Display.getRawWidth() e Display.getRawHeight()) per ottenere la larghezza dello schermo fisico o altezza.

Ecco l'esempio per mostrare come ottenere la larghezza o l'altezza dello schermo fisico.

Method mGetRawW = Display.class.getMethod("getRawWidth"); 
Method mGetRawH = Display.class.getMethod("getRawHeight"); 
int nW = (Integer)mGetRawW.invoke(dp); 
int nH = (Integer)mGetRawH.invoke(dp); 

AGGIORNAMENTO: Per API 13-16, è necessario utilizzare il codice di cui sopra per ottenere reali larghezza/altezza. Per API 17+, ora puoi utilizzare la nuova API pubblica, Display.getRealSize().

0

Una funzione per ottenere le dimensioni dello schermo al minimo livello API11; comprende anche metodi per l'API di livello superiore (funzione di cambio per utilizzare l'API selezionata, la sua chiamata di funzione e il tipo oggetto ritorno):

public int getScreenOrientation() 
{ 
    int nOrientation = Configuration.ORIENTATION_UNDEFINED; 

    try 
    { 
     DisplayMetrics displayMetrics = null; 
     WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); 
     if(windowManager != null) 
     { 
      Display defaultDisplay = windowManager.getDefaultDisplay(); 
      if(defaultDisplay != null) 
      { 
       defaultDisplay.getMetrics(displayMetrics);//API11 
       //defaultDisplay.getRectSize(rectGet);//API13 
       //defaultDisplay.getSize(pointGet);//API13 
       //defaultDisplay.getCurrentSizeRange(pointGet,pointGet);//API16 
       //defaultDisplay.getRealSize(pointGet);//API17 
       //defaultDisplay.getRealMetrics(displayMetrics);//API17 
       if((displayMetrics.widthPixels == displayMetrics.heightPixels) || (displayMetrics.widthPixels < displayMetrics.heightPixels)) 
       { 
        nOrientation = Configuration.ORIENTATION_PORTRAIT; 
       } 
       else 
       { 
        nOrientation = Configuration.ORIENTATION_LANDSCAPE; 
       } 
      } 
     } 
    } 
    catch(Exception e) 
    { 
     showMessage(false,"Error","[getScreenOrientation]: " + e.toString()); 
    } 

    return nOrientation; 
} 

Nota: Configuration.ORIENTATION_SQUARE è obsoleto, ecco che è sostituito per impostazione predefinita ORIENTATION_PORTRAIT .

0

Questa è un'altra soluzione praticabile per misurare le dimensioni dello schermo (API 11+):

public static ABDimension calculateScreenDimensions(Activity activityGet) 
{ 
    ABDimension abdReturn = new ABDimension(); 

    try 
    { 
     Rect rectGet = new Rect(); 
     Window winGet = null; 
     DisplayMetrics displayMetrics = new DisplayMetrics(); 
     int nStatusBarHeight = 0; 
     int nContentViewTop = 0; 
     int nTitleBarHeight = 0; 
     int nScreenHeight = 0; 

     if((activityGet != null) && (rectGet != null) && (displayMetrics != null)) 
     { 
      winGet = activityGet.getWindow(); 
      if(winGet != null) 
      { 
       winGet.getDecorView().getWindowVisibleDisplayFrame(rectGet); 
       nStatusBarHeight = rectGet.top; 
       nContentViewTop = winGet.findViewById(Window.ID_ANDROID_CONTENT).getTop(); 
       nTitleBarHeight = nContentViewTop - nStatusBarHeight; 

       activityGet.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics); 
       int screenHeight = displayMetrics.heightPixels; 
       abdReturn.nWidth = displayMetrics.widthPixels; 
       abdReturn.nHeight = screenHeight - (nTitleBarHeight + nStatusBarHeight); 
      } 
     } 
    } 
    catch(Exception e) 
    { 
     appContext.showMessage(false,"Error","[calculateScreenDimensions]: "+e.toString()); 
    } 

    return abdReturn; 
} 

Dove la classe ABDimension contiene sei interi etichettati nWidth, nHeight, nMarginLeft, nMarginTop, nMarginRight e nMarginBottom. Questa versione rappresenta i comuni componenti decorativi Android come TitleBar/StatusBar.

Problemi correlati