Chciałbym załadować wartość taką, jaka jest. Mam dwa dimension.xml
pliki, jeden w, /res/values/dimension.xml
a drugi w /res/values-sw360dp/dimension.xml
.
Z kodu źródłowego chciałbym zrobić coś takiego
getResources().getDimension(R.dimen.tutorial_cross_marginTop);
To działa, ale wartość, którą otrzymuję, jest mnożona przez współczynnik gęstości ekranu (1,5 dla hdpi, 2,0 dla xhdpi itp.).
Próbowałem też to zrobić
getResources().getString(R.dimen.tutorial_cross_marginTop);
Działa to w zasadzie, ale otrzymuję ciąg znaków, który kończy się na „zanurzeniu” ...
android
android-resources
dpi
dimension
Héctor Júdez Sapena
źródło
źródło
getDimensionPixelSize(int id)
która dokładnie stwierdza, że zwraca w pikselach, więcgetDimension(int id)
powinien zwrócić w dp (jednostkach niezależnych od zależności), które byłyby gotowe do użycia, np. Z ViewsetPadding
Odpowiedzi:
W moim dimens.xml mam
W kodzie, jeśli tak
to zwróci 72, które jako stan dokumentów są mnożone przez gęstość bieżącego telefonu (w moim przypadku 48dp x 1,5)
dokładnie tak, jak mówią dokumenty:
więc jeśli chcesz dokładną wartość dp, podobnie jak w xml, po prostu podziel ją gęstością DisplayMetrics
dp będzie teraz 48
źródło
dp
da skalowaną wartość piksela w stosunku do skali obiektu zasobu użytego do jej odzyskania. Gdy znajdziesz różne sposoby pozyskiwania zasobów, będzie to bardziej odpowiednie. Dla uproszczenia można go traktować jako relatywny do skali ekranu. Występują równieżsp
lub piksele w stosunku do wielkości tekstu systemowego ipx
lub piksele bezpośrednio. Każdy jest inny i ma inny cel.źródło
Resource
Klasa ma również metoda getDimensionPixelSize () , które myślę, że będzie pasować do Twoich potrzeb.źródło
getDimensionPixelSize()
jeśli można odwołać się do dokumentów, które wyraźnie stwierdza ZwracaResource dimension value multiplied by the appropriate metric and truncated to integer pixels.
Dla tych, którzy chcą zaoszczędzić trochę
int
zasobów, możesz wykonać następujące czynności.integers.xml
Kod
źródło
Możesz użyć getDimensionPixelOffset () zamiast getDimension, więc nie musiałeś rzutować na int.
źródło
Możesz również zapisać liczbę całkowitą w pliku xml.
Czy widziałeś [ten] http://developer.android.com/guide/topics/resources/more-resources.html#Integer ? Użyj jako .
źródło
Myślę, że dobrze jest uzyskać wartość według rozdzielczości, ale jeśli nie chcesz tego zrobić, podaj to w px .......
Piksel niezależny od gęstości (dp)
Wirtualna jednostka pikseli, której należy używać podczas definiowania układu interfejsu użytkownika, w celu wyrażenia wymiarów lub położenia układu w sposób niezależny od gęstości. Piksel niezależny od gęstości odpowiada jednemu pikselowi fizycznemu na ekranie o rozdzielczości 160 dpi, który jest podstawową gęstością przyjętą przez system dla ekranu o „średniej” gęstości. W czasie wykonywania system w przejrzysty sposób obsługuje wszelkie skalowanie jednostek dp, w razie potrzeby.
based on the actual density of the screen in use. The conversion of dp units to screen pixels is simple: px = dp * (dpi / 160). For example, on a 240 dpi screen, 1 dp equals 1.5 physical pixels.
Podczas definiowania interfejsu użytkownika aplikacji należy zawsze używać jednostek dp, aby zapewnić prawidłowe wyświetlanie interfejsu użytkownika na ekranach o różnej gęstości.Myślę, że warto zmienić wartość zgodnie z rozdzielczością, ale jeśli nie chcesz tego zrobić, podaj to w px .......
sprawdź ten link
zgodnie z tym
dp
Piksele niezależne od gęstości - jednostka abstrakcyjna oparta na fizycznej gęstości ekranu. Jednostki te odnoszą się do ekranu o rozdzielczości 160 dpi (punktów na cal), na którym 1dp jest z grubsza równy 1px.
When running on a higher density screen, the number of pixels used to draw 1dp is scaled up by a factor appropriate for the screen's dpi. Likewise, when on a lower density screen, the number of pixels used for 1dp is scaled down.
Stosunek dp-do piksela zmienia się wraz z gęstością ekranu, ale niekoniecznie w proporcji bezpośredniej. Korzystanie z jednostek dp (zamiast jednostek px) jest prostym rozwiązaniem, aby odpowiednio zmienić wymiary widoku w układzie dla różnych gęstości ekranu. Innymi słowy, zapewnia spójność rzeczywistych rozmiarów elementów interfejsu użytkownika na różnych urządzeniach.px
Piksele - odpowiada rzeczywistym pikselom na ekranie. Ta jednostka miary nie jest zalecana, ponieważ rzeczywista reprezentacja może się różnić w zależności od urządzenia; każde urządzenie może mieć inną liczbę pikseli na cal i może mieć większą lub mniejszą liczbę pikseli dostępnych na ekranie.
źródło
Użyj rozszerzenia Kotlin
Możesz dodać rozszerzenie, aby uprościć ten proces. To pozwala tylko zadzwonić,
context.dp(R.dimen. tutorial_cross_marginTop)
aby uzyskać wartość FloatJeśli chcesz obsłużyć go bez kontekstu, możesz użyć
Resources.getSystem()
:Na przykład na urządzeniu xhdpi użyj,
24.dp
aby uzyskać 12.0 lub12.px
24źródło