Muszę zakodować układ widgetów Androida za pomocą dip / dp (w plikach Java). W czasie wykonywania, jeśli koduję
int pixel=this.getWindowManager().getDefaultDisplay().getWidth()
;
to zwraca szerokość ekranu w pikselach (px). Aby przekonwertować to na dp, kodowałem:
int dp =pixel/(int)getResources().getDisplayMetrics().density ;
Wydaje się, że nie zwraca poprawnej odpowiedzi. Zrobiłem emulator WVGA800, którego rozdzielczość ekranu wynosi 480 na 800. Kiedy uruchom emulator i pozwól kodowi wydrukować wartości pikseli i dp, w obu wypadło 320. Ten emulator ma rozdzielczość 240 dpi, której współczynnik skali wyniósłby 0,75.
android
density-independent-pixel
Khushboo
źródło
źródło
Natknąłem się na to pytanie od Google, a później znalazłem łatwe rozwiązanie ważne dla API> = 13.
Dla przyszłych referencji:
Zobacz Odwołanie do klasy konfiguracji
Edycja: Jak zauważył Nick Baicoianu, zwraca użyteczną szerokość / wysokość ekranu (które powinny być interesujące w większości zastosowań). Jeśli potrzebujesz rzeczywistych wymiarów wyświetlacza, trzymaj się górnej odpowiedzi.
źródło
Brakuje domyślnej wartości gęstości 160.
Innymi słowy, jeśli projektujesz układ o szerokości równej 160dip w trybie pionowym, będzie to połowa ekranu na wszystkich urządzeniach ldpi / mdpi / hdpi (chyba, że na tabletach)
źródło
DisplayMetrics outMetrics = null; getWindowManager().getDefaultDisplay().getMetrics(outMetrics);
w ramach działania. NastępnieoutMetrics.density
poda współczynnik skali bieżącego urządzenia, jak stwierdzono w dokumentachA może zamiast tego użyć tego?
źródło
źródło
Odpowiedź w kotlin:
źródło
Uproszczony dla Kotlin:
źródło
Uzyskaj szerokość i wysokość ekranu w kategoriach DP z dobrą dekoracją:
Krok 1: Utwórz interfejs
Krok 2: Utwórz klasę implementującą
Krok 3: Uzyskaj szerokość i wysokość w aktywności:
źródło
Jeśli chcesz tylko wiedzieć o szerokości ekranu, możesz po prostu wyszukać „najmniejszą szerokość ekranu” w opcjach programisty. Możesz go nawet edytować.
źródło
Spróbuj tego:
źródło
Twój problem polega na tym, że rzutowanie float na int, traci precyzję. Powinieneś także pomnożyć przez współczynnik, a nie dzielić.
Zrób to:
źródło