Stworzyłem swoją aplikację z wysokością i szerokością podaną w pikselach dla urządzenia Pantech, którego rozdzielczość wynosi 480x800
.
Muszę przekonwertować wysokość i szerokość dla urządzenia G1.
Myślałem, że konwersja do dp rozwiąże problem i zapewni takie samo rozwiązanie dla obu urządzeń.
Czy jest jakiś prosty sposób na konwersję pikseli na dp?
Jakieś sugestie?
android
pixel
resolution
dpi
Indhu
źródło
źródło
px
,dp
,sp
Formuły przeliczenioweOdpowiedzi:
źródło
applyDimension
? Czy mogę to zrobićgetResource().getDisplayMetrics()
, czy jest coś jeszcze?Context
użycia obiektuResources.getSystem().getDisplayMetrics()
źródło
Resource.getSystem()
( wyróżnienie moje): „Zwraca globalny obiekt współdzielonych zasobów, który zapewnia dostęp tylko do zasobów systemowych (bez zasobów aplikacji) i nie jest skonfigurowany dla bieżącego ekranu ( nie może używać jednostek wymiarów , nie zmienia się na podstawie orientacji itp. ”.DisplayMetrics.DENSITY_DEFAULT
zamiast160f
developer.android.com/reference/android/util/...Najlepiej umieścić w klasie Util.java
źródło
density
równa się.75
włączonyldpi
(120
dpi)1.0
włączonymdpi
(160
dpi; linia bazowa)1.5
włączonyhdpi
(240
dpi)2.0
włączonyxhdpi
(320
dpi)3.0
włączonyxxhdpi
(480
dpi)4.0
włączonyxxxhdpi
(640
dpi)Użyj tego konwertera online do zabawy z wartościami dpi.
EDYCJA: Wydaje się, że nie ma związku 1: 1 między
dpi
wiadrem adensity
. Wygląda na to, żeNexus 5X
istotaxxhdpi
madensity
wartość2.625
(zamiast3
). Przekonaj się w Metryk urządzenia .źródło
Możesz użyć tego .. bez kontekstu
Jak wspomniano w @Stan ... stosowanie tego podejścia może powodować problemy, jeśli system zmieni gęstość. Więc bądź tego świadomy!
Osobiście używam do tego kontekstu. To tylko kolejne podejście, którym chciałem się z tobą podzielić
źródło
Jeśli możesz użyć wymiarów XML, jest to bardzo proste!
W twoim
res/values/dimens.xml
:Następnie w Javie:
źródło
Zgodnie z Android Development Guide:
Ale często będziesz chciał to zrobić odwrotnie, gdy otrzymasz projekt wyrażony w pikselach. Więc:
Jeśli korzystasz z urządzenia o rozdzielczości 240dpi, współczynnik ten wynosi 1,5 (jak podano wcześniej), więc oznacza to, że ikona 60px jest równa 40dp w aplikacji.
źródło
Bez
Context
eleganckich metod statycznych:źródło
Resources.getSystem()
javadoc mówi: „Zwraca globalny obiekt współdzielonych zasobów, który zapewnia dostęp tylko do zasobów systemowych (bez zasobów aplikacji) i nie jest skonfigurowany dla bieżącego ekranu (nie może używać jednostek wymiarów, nie zmienia się w zależności od orientacji itp.”). To prawie mówi, że nie powinieneś tego robić, nawet jeśli jakoś to działa.Dla
DP to Pixel
Utwórz wartość w
dimens.xml
Uzyskaj tę wartość
pixel
jako:źródło
Możesz zatem użyć następującego formulatora, aby obliczyć odpowiednią liczbę pikseli na podstawie wymiaru określonego w dp
źródło
convertToDp
.Dla każdego, kto używa Kotlin:
Stosowanie:
źródło
Domyślne użycie w zestawie Android SDK: http://developer.android.com/reference/android/util/TypedValue.html
źródło
resultPix
powinien być typu int.int resultPix = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,1,getResources().getDisplayMetrics())
użycie rozszerzenia kotlin czyni go lepszym
AKTUALIZACJA:
Ponieważ
displayMetrics
jest częścią globalnych zasobów współdzielonych , możemy z nich korzystaćResources.getSystem()
źródło
To powinno dać ci konwersję dp na piksele:
To powinno dać ci konwersję pikseli do dp:
źródło
Kotlin
Jawa
źródło
Prawdopodobnie najlepszym sposobem, jeśli masz wymiar wewnątrz wartości / dimen, jest uzyskanie wymiaru bezpośrednio z metody getDimension (), zwróci ci on wymiar już przekonwertowany na wartość w pikselach.
Żeby to lepiej wyjaśnić,
zwróci wymiar już przekonwertowany na piksel AS A FLOAT.
zwróci to samo, ale obcięte do int, więc JAKO INTEGR.
Zobacz dokumentację Androida
źródło
gdzie zasób to context.getResources ().
źródło
lubię to:
zależy od kontekstu, zwraca wartość zmiennoprzecinkową, metodę statyczną
from: https://github.com/Trinea/android-common/blob/master/src/cn/trinea/android/common/util/ScreenUtils.java#L15
źródło
Bardziej eleganckie podejście dzięki funkcji przedłużania kotlin
Stosowanie:
źródło
function name
”, co, jak zdaję sobie sprawę, jest w tym przypadku odwrócone. Aby wyjaśnić zamiary każdej funkcji, nazwy funkcji można zaktualizować tak, aby odczytały odpowiednio dpToPx i pxToDp.źródło
Jeśli opracowujesz aplikację krytyczną dla wydajności, rozważ następującą zoptymalizowaną klasę:
źródło
do konwersji pikseli na dp użyj TypedValue .
Jak wspomniano w dokumentacji: Kontener na dynamicznie wpisywaną wartość danych.
i użyj metody applyDimension :
który konwertuje rozpakowaną złożoną wartość danych zawierającą wymiar na końcową wartość zmiennoprzecinkową, jak poniżej:
Mam nadzieję, że to pomaga.
źródło
Tak to dla mnie działa:
Możesz zrobić to samo dla szerokości.
źródło
Wiele świetnych rozwiązań powyżej. Jednak najlepszym rozwiązaniem, jakie znalazłem, jest projekt Google:
https://design.google.com/devices/
źródło
Powinieneś używać dp tak samo jak pikseli. To wszystko, czym są; wyświetlać niezależne piksele. Użyj tych samych liczb, które byłyby na ekranie o średniej gęstości, a rozmiar będzie magicznie poprawny na ekranie o wysokiej gęstości.
Wygląda jednak na to, że potrzebna jest opcja fill_parent w projekcie układu. Użyj fill_parent, jeśli chcesz, aby widok lub kontrolka rozszerzyły się na cały pozostały rozmiar w kontenerze nadrzędnym.
źródło
PX
iDP
są różne, ale podobne.DP
to rozdzielczość, gdy uwzględnisz tylko fizyczny rozmiar ekranu. GdyDP
go użyjesz , przeskalujesz swój układ do innych ekranów o podobnych rozmiarach i różnejpixel
gęstości.Czasami jednak tak naprawdę chcesz
pixels
, a kiedy zajmujesz się wymiarami w kodzie, zawsze masz do czynienia z rzeczywistymipixels
, chyba że je przekonwertujesz.Tak więc na urządzeniu z Androidem, normalnym
hdpi
ekranie,800x480 is 533x320
wDP
(wierzę). Aby przekonwertowaćDP
napixels /1.5
, przekonwertować z powrotem*1.5
. Dotyczy to tylko jednego rozmiaru ekranu idpi
zmieniałby się w zależności od projektu. Nasi artyści dają mipixels
jednak i przechodzę doDP
powyższego1.5
równania.źródło
Jeśli chcesz uzyskać wartości całkowite , to użycie Math.round () zaokrągli liczbę zmiennoprzecinkową do najbliższej liczby całkowitej.
źródło
To działa dla mnie (C #):
źródło
kotlin
Jawa
źródło
Najlepsza odpowiedź pochodzi z samego systemu Android: użyj tej równości ...
(konwertuje dp na px)
źródło