Utworzyłem niektóre niestandardowe elementy i chcę programowo umieścić je w prawym górnym rogu ( n
piksele od górnej krawędzi i m
piksele od prawej krawędzi). Dlatego muszę uzyskać szerokość i wysokość ekranu, a następnie ustawić pozycję:
int px = screenWidth - m;
int py = screenHeight - n;
W jaki sposób uzyskać screenWidth
i screenHeight
w głównej działalności?
getMetrics
. Komentarz Nik w jego odpowiedzi wyjaśnia nawet, żegetDisplayMetrics
należy wziąć pod uwagę rozmiar systemu / paska stanu. Możesz także użyć gęstości jako jmaculate, a LoungeKatt wyjaśnił, że ma wartość DOKŁADNĄ :DisplayMetrics dm = getResources().getDisplayMetrics(); float fwidth = dm.density * dm.widthPixels;
Przetestowano w systemie Android v2.2 (API 8) i v4.0 z dobrymi wynikami i bez błędów / ostrzeżeń .Resources.getSystem().getDisplayMetrics()
. Nie będziesz musiałContext
ich zdobyć.Odpowiedzi:
Jeśli chcesz wymiary wyświetlania w pikselach, możesz użyć
getSize
:Jeśli nie ma Cię w domu
Activity
, możesz uzyskać ustawienia domyślneDisplay
poprzezWINDOW_SERVICE
:Jeśli jesteś we fragmencie i chcesz to osiągnąć, po prostu użyj Activity.WindowManager (w Xamarin.Android) lub getActivity (). GetWindowManager () (w java).
Przed
getSize
wprowadzeniem (na poziomie API 13) można było użyć metodgetWidth
igetHeight
, które są teraz przestarzałe:Jednak w opisywanym przypadku użycia margines / wypełnienie układu wydaje się bardziej odpowiednie.
Innym sposobem jest: DisplayMetrics
Możemy użyć,
widthPixels
aby uzyskać informacje na temat:Przykład:
źródło
try/catch
z takiej kontroli? Dlaczego po prostu nie użyćif (android.os.Build.VERSION.SDK_INT >= 13)
żadnego wyjątku? Wtry/catch
normalnym przepływie aplikacji myślę, że to zła praktyka.Jednym ze sposobów jest:
Jest przestarzały i powinieneś zamiast tego wypróbować następujący kod. Pierwsze dwa wiersze kodu zawierają
DisplayMetrics
objecs. Te obiekty znajdują się pola, na przykładheightPixels
,widthPixels
.źródło
Może nie odpowiedzieć na twoje pytanie, ale warto wiedzieć (szukałem go sam, kiedy przyszedłem do tego pytania), że jeśli potrzebujesz wymiaru Widoku, ale kod jest wykonywany, gdy jego układ nie został jeszcze ułożony (na przykład w
onCreate()
) możesz ustawić zaViewTreeObserver.OnGlobalLayoutListener
pomocąView.getViewTreeObserver().addOnGlobalLayoutListener()
i wstawić odpowiedni kod, który potrzebuje wymiaru widoku. Oddzwonienie nasłuchiwania zostanie wywołane, gdy układ zostanie ułożony.źródło
View.post()
nie gwarantuje się, że zadziała? Jestem ciekawy, ponieważ polegam również na tej metodzie uzyskania rozmiaru Widoku po układzie i nie wiedziałem, że to niewiarygodne.View
maszViewTreeObserver
? A może wszystkie mają ten sam?(Odpowiedź z 2012 r. Może być nieaktualna) Jeśli chcesz obsługiwać wersję wcześniejszą o strukturze plastra miodu, musisz wprowadzić wsteczną zgodność przed API 13. Coś takiego:
Oczywiście przestarzałe metody zostaną w końcu usunięte z najnowszych zestawów SDK, ale chociaż nadal polegamy na większości naszych użytkowników posiadających Androida 2.1, 2.2 i 2.3, pozostaje nam to.
źródło
Bezskutecznie wypróbowałem wszystkie możliwe „rozwiązania” i zauważyłem, że aplikacja „Dalvik Explorer” Elliotta Hughesa zawsze pokazuje prawidłowy wymiar na dowolnej wersji urządzenia / systemu Android. Skończyło się na jego projekcie open source, który można znaleźć tutaj: https://code.google.com/p/enh/
Oto cały odpowiedni kod:
EDYCJA: nieco ulepszona wersja (unikaj wyzwalania wyjątków w nieobsługiwanej wersji systemu operacyjnego):
źródło
Najprostszy sposób:
źródło
Aby uzyskać dostęp do wysokości paska stanu dla urządzeń z Androidem, preferujemy programowy sposób jej uzyskania:
Przykładowy kod
Zmienna
result
podaje wysokość w pikselu.Szybki dostęp
Aby uzyskać więcej informacji na temat wysokości
Title bar
,Navigation bar
iContent View
, uprzejmie wygląd na ekranie Android Device rozmiarach .źródło
getResources().getDisplayMetrics().heightPixels + result
daje rzeczywistą wysokość pełnego ekranu. Odpowiedź Dragana Marjanovicia również działa, ale wolę to znacznie krótsze i prostsze rozwiązanie.OnApplyWindowInsetsListener
.Najpierw pobierz widok (np. Przez
findViewById()
), a następnie możesz użyć getWidth () na samym widoku.źródło
Mam dwie funkcje, jedną do wysyłania kontekstu, a drugą do uzyskiwania wysokości i szerokości w pikselach:
i
źródło
@SuppressLint("NewApi")
tuż powyżej podpisu funkcji, aby móc skompilować.Do dynamicznego skalowania za pomocą XML istnieje atrybut o nazwie „android: layout_weight”
Poniższy przykład, zmodyfikowany na podstawie odpowiedzi synic na ten wątek , pokazuje przycisk, który zajmuje 75% ekranu (waga = 0,25) oraz widok tekstowy zajmujący pozostałe 25% ekranu (waga = 0,75).
źródło
Oto kod, którego używam do zadania:
Wydaje się wystarczająco czysty, a jednak zajmuje się deprecjacją.
źródło
Czy to nie jest o wiele lepsze rozwiązanie? DisplayMetrics zawiera wszystko, czego potrzebujesz i działa z API 1.
Możesz także uzyskać rzeczywisty obraz (w tym dekory ekranu, takie jak pasek stanu lub pasek nawigacji oprogramowania) za pomocą getRealMetrics , ale działa to tylko w przypadku 17+.
Czy coś brakuje?
źródło
Właśnie dodając do odpowiedzi Francesco. Innym obserwatorem, który jest bardziej odpowiedni, jeśli chcesz dowiedzieć się o lokalizacji w oknie lub lokalizacji na ekranie, jest ViewTreeObserver.OnPreDrawListener ()
Można to również wykorzystać do znalezienia innych atrybutów widoku, które są w większości nieznane w czasie onCreate (), np. Pozycja przewijana, pozycja skalowana.
źródło
Używanie następującego kodu w działaniu.
źródło
Znajdź szerokość i wysokość ekranu:
Korzystając z tego, możemy uzyskać najnowszy i wyższy zestaw SDK 13.
źródło
źródło
Uważam, że to załatwiło sprawę.
źródło
Trzeba powiedzieć, że jeśli nie jesteś w
Activity
, aleView
masz (lub masz zmiennąView
typu w swoim zakresie), nie musisz tego używaćWINDOW_SERVICE
. Następnie możesz użyć co najmniej dwóch sposobów.Pierwszy:
Druga:
Wszystkie te metody, które tu nazywamy, nie są przestarzałe.
źródło
źródło
Aby uzyskać wymiary ekranu, użyj mierników wyświetlacza
Uzyskaj wysokość i szerokość w pikselach
źródło
To nie jest odpowiedź dla OP, ponieważ chciał wymiary wyświetlacza w rzeczywistych pikselach. Chciałem wymiary w „niezależny od urządzenia-pikseli” i umieszczenie odpowiedzi razem stąd https://stackoverflow.com/a/17880012/253938 i tutaj https://stackoverflow.com/a/6656774/253938 wymyśliłem z tym:
źródło
Możesz uzyskać wysokość, używając:
i szerokość za pomocą
źródło
Istnieje nieaktualny sposób na wykonanie tego za pomocą DisplayMetrics (API 1), który pozwala uniknąć bałaganu try / catch:
źródło
Owinąłbym kod getSize w ten sposób:
źródło
Dla kogo szuka użytkowej wymiaru ekranu bez paska stanu i działania Bar (także dzięki za odpowiedź Swapnil):
źródło
Najpierw załaduj plik XML, a następnie napisz ten kod:
Pokaż szerokość i wysokość zgodnie z rozdzielczością ekranu.
źródło
Postępuj zgodnie z poniższymi metodami:
źródło
Kotlin
źródło
Są chwile, kiedy trzeba znać dokładne wymiary dostępnej przestrzeni dla układu, gdy jest onCreate działania. Po namyśle opracowałem ten sposób.
Jeśli z jakiegoś powodu nie chcesz dodać innej aktywności do manifestu Androida, możesz to zrobić w ten sposób:
źródło
Jeśli nie chcesz nakładać się na menedżery okien, punkty lub wyświetlacze, możesz pobrać atrybuty wysokości i szerokości najwyższego elementu widoku w pliku XML, pod warunkiem, że jego wysokość i szerokość są ustawione na match_parent. (Dzieje się tak, o ile układ zajmuje cały ekran).
Na przykład, jeśli twój XML zaczyna się od czegoś takiego:
Następnie
findViewById(R.id.entireLayout).getWidth()
zwróci szerokość ekranu ifindViewById(R.id.entireLayout).getHeight()
zwróci wysokość ekranu.źródło