Come posso trovare le dimensioni dello schermo a livello di programmazione, nelle unità utilizzate dagli eventi di tocco e Visualizza misura/layout? In altre parole, voglio le coordinate nell'angolo in basso a destra dello schermo, nel sistema di coordinate utilizzato dagli eventi di tocco ' getRawX()/getRawY()
e View.getLocationOnScreen()
.come ottenere le dimensioni dello schermo di Android a livello di programmazione, una volta per tutte?
Sono riluttanti a chiamare la manifestazione/unità di visualizzazione desiderata "pixel" in quanto evidentemente ci sono diversi concetti di "pixel" sul mio telefono in vari modi, e non sono aggiungendo fino a una storia coerente .
vedo questo è stato chiesto e ha risposto molto su StackOverflow e altrove, ma nessuno delle risposte effettivamente lavorare sul mio cellulare (Droid 4, 4.1.2 Android) in tutte le modalità:
- Can I find out width of screen programmatically in android app?
- How do I get the ScreenSize programmatically in android
- Android set View visibility programmatically based on screen size
- How do I get the height of the screen in Android?
- Get the screen height in Android
- https://groups.google.com/forum/#!topic/android-developers/IpxnfvDFrpc
- http://shuklaxyz.blogspot.com/2012/02/how-to-programmatically-figure-out.html
- http://coderock.net/how-to-determine-screen-resolution-programmatically/
- http://www.codeproject.com/Tips/313848/Get-actual-screen-size-for-the-application-layout
- Android and setting width and height programmatically in dp units
- http://www.simplecodestuffs.com/how-to-get-screen-dimensions-programmatically-in-android/
- http://www.androidsnippets.com/get-size-and-orientation-of-the-screen
- http://grokbase.com/t/gg/android-developers/127aatfqb6/how-to-determine-screen-resolution-programmatically
(wow!)
Questo è per il codice libreria che ha bisogno di lavorare indipendentemente dal fatto che l'applicazione è in "modalità compatibilità schermo" (vale a dire targetSdkVersion < = 10 nel manifest) o non, e non voglio fare alcuna ipotesi sulla posizione, la dimensione o l'esistenza della barra di stato o qualsiasi altra decorazione dello schermo simile.
Ecco i fatti:
il mio telefono (un droide 4 in esecuzione 4.1.2 Android) ha 540x960 pixel fisici, vale a dire poco colorati puntini luminosi.
la dimensione dello schermo, nelle unità desiderate, dal guardare gli eventi di tocco e Visualizzare misure, è 360x640 quando l'applicazione è in modalità schermo compat, 540x960 quando l'applicazione non è in modalità schermo compat. Questi sono i numeri che ho bisogno di trovare a livello di programmazione, senza mucking con gli eventi touch o Views per trovarli, ma sto avendo estrema difficoltà a trovare qualsiasi API che restituirà questi numeri.
visualizzazione e DisplayMetrics oggetti ottenuti in vari modi tutti sostengono la dimensione dello schermo è 540x960 "pixel" (siano essi in modo compat schermo o no). Per essere precisi, il seguente tutti dicono 540x960 tutto il tempo:. DisplayMetrics {larghezza, altezza} Pixel, Display.getSize(), Display.getRealSize(), Display.get {larghezza, altezza}(),
Gli oggetti di configurazione ottenuti in vari modi tutti dicono schermo {Larghezza, Altezza} Dp = 360x614 (sia in modalità schermo compat o meno). Non credo che rappresenti l'intero schermo, poiché il rapporto di aspetto è sbagliato. (Penso che sia l'intero schermo meno la barra di stato, ho bisogno di tutto lo schermo.) Penso che sia sicuro dire che l'intero schermo è 360x640 dp, anche se non conosco alcuna API che restituisce quella 640.
DisplayMetrics ottenute in vari modi dicono la "densità" è 1.0f in modalità compat schermo, 1.5f quando non in modalità compat schermo.
del attività
getWindow().getAttributes().{width,height}
non è utile in quanto contiene in genereMATCH_PARENT
piuttosto che dimensioni effettive. Ma posso apparentemente ottenere la risposta desiderata di un'attivitàgetWindow().getDecorView().getMeasured{Width,Height}()
(che in realtà è sorprendente dal momento che della finestra della propria attività decorView non si guardare come sta prendendo l'intero schermo; sembra che sta prendendo lo schermo meno la barra di stato). Ma non voglio fare affidamento su questo perché se la finestra viene mai ridimensionata (viene visualizzata una tastiera morbida? Qualcuno chiama window.setAttributes()? o forse non sono in un'attività affatto), questo è chiaramente sta andando tutto storto.
Capisco la seguente formula dovrebbe contenere: pixel = dp * densità Questo sembra essere d'accordo con tutti i numeri riportati ((3), (4), (5) di cui sopra) quando non in modalità compatibilità schermo: 540x960 = 360x640 * 1,5 Ma in modalità compatibilità schermo non si sommano: 540x960! = 360x640 * 1 Quindi, qualcosa non funziona.
La spiegazione più semplice, credo, è che i metodi elencati (3) di cui sopra sono semplicemente dare la risposta sbagliata per "pixel" quando a schermo compat mode-- che è, sono stati destinati a tornare 360x640 "pixel", ma restituiscono erroneamente 540x960. Ma ci possono essere altri modi di guardarlo.
In ogni caso, ottenere i numeri desiderati indipendentemente dalla modalità, dai suddetti pezzi del puzzle, è certamente un puzzle difficile. Ho trovato un modo che sembra funzionare sul mio telefono in entrambe le modalità, ma è estremamente tortuoso, e si basa su due ipotesi che sembrano ancora piuttosto traballanti (come descritto nei commenti di codice qui sotto).
Ecco la mia ricetta:
/** get screen size in "pixels", i.e. touchevent/view units.
* on my droid 4, this is 360x640 or 540x960
* depending on whether the app is in screen compatibility mode
* (i.e. targetSdkVersion<=10 in the manifest) or not. */
public void getScreenSizePixels(int widthHeightInPixels[/*2*/])
{
Resources resources = getResources();
Configuration config = resources.getConfiguration();
DisplayMetrics dm = resources.getDisplayMetrics();
// Note, screenHeightDp isn't reliable
// (it seems to be too small by the height of the status bar),
// but we assume screenWidthDp is reliable.
// Note also, dm.widthPixels,dm.heightPixels aren't reliably pixels
// (they get confused when in screen compatibility mode, it seems),
// but we assume their ratio is correct.
double screenWidthInPixels = (double)config.screenWidthDp * dm.density;
double screenHeightInPixels = screenWidthInPixels * dm.heightPixels/dm.widthPixels;
widthHeightInPixels[0] = (int)(screenWidthInPixels + .5);
widthHeightInPixels[1] = (int)(screenHeightInPixels + .5);
}
Esiste un modo migliore/più pulito per trovare la dimensione dello schermo ??
+1 Grande domanda, e mostra un sacco di sforzo di ricerca. –
@Don In [docs] (http://developer.android.com/guide/practices/screen-compat-mode.html), viene spiegato che la modalità di compatibilità smetterà di eseguire l'operazione "zoom su misura" nelle impostazioni precedenti. Tuttavia non è chiaramente spiegato "come funziona", dalle tue osservazioni, penso che semplicemente disattivano il ridimensionamento della densità, cioè: 1px diventa 1dp. È possibile che questo cambiamento riguardi solo la parte di rendering e 'DisplayMetrics' non viene mai aggiornato di tali modifiche. Ci sono problemi come [questo] (http://code.google.com/p/android/issues/detail?id=19921) già archiviati. –
@ user117 - interessante. Bene * parte * di DisplayMetrics è stata aggiornata almeno - la densità è stata modificata in 1.0. Ma widthPixels/heightPixels non è stato modificato per corrispondere, a quanto pare. Riguardo al problema citato, sembra che il comportamento sia tornato al comportamento 3.1 (cioè sto vedendo heightPixels * include * la barra di stato ... ma nelle unità sbagliate sembra) –