Завантажте значення розмірності з res / values ​​/ Dimence.xml з вихідного коду


337

Я хотів би завантажити значення таким, яким воно є. У мене два dimension.xmlфайли, один в, /res/values/dimension.xmlа інший в/res/values-sw360dp/dimension.xml .

З вихідного коду я хотів би зробити щось на кшталт

getResources().getDimension(R.dimen.tutorial_cross_marginTop);

Це працює, але отримане значення умножується на коефіцієнт щільності екрана (1,5 для hdpi, 2,0 для xhdpi тощо).

Я також намагався це зробити

getResources().getString(R.dimen.tutorial_cross_marginTop);

Це в принципі буде працювати, але я отримую рядок, який закінчується "зануренням" ...


1
Цікаво, чи є помилка в Android, оскільки в ресурсах є метод, getDimensionPixelSize(int id)який точно вказує, що він повертається в Pixel, тому getDimension(int id)повинен повернутися в dp (незалежні від одиниці залежності), які були б готові до використання, наприклад, з ViewsetPadding
Paul Verest,

Відповіді:


811

У своєму dimens.xml у мене є

<dimen name="test">48dp</dimen>

У коді Якщо це зробити

int valueInPixels = (int) getResources().getDimension(R.dimen.test)

це повернеться 72, що як стан документів множиться на щільність поточного телефону (48dp x 1,5 в моєму випадку)

точно так, як констатують документи:

Отримайте розмір для конкретного ідентифікатора ресурсу. Перетворення одиниць базується на поточній DisplayMetrics, пов'язаній з ресурсами.

тому якщо ви хочете точне значення dp так само, як у xml, просто розділіть його на щільність DisplayMetrics

int dp = (int) (getResources().getDimension(R.dimen.test) / getResources().getDisplayMetrics().density)

dp зараз буде 48


3
Я думаю, що тут документація особливо незрозуміла. "Перетворення одиниць базується на поточних показниках DisplayMetrics, пов'язаних з ресурсами." коли все, що вони хочуть сказати, - це те, що вони перетворюються на пікселі.
Триларіон

Якщо ви по суті будете відкидати множник метрики відображення, ви можете просто визначити свій вимір у px. <dimen name = "test"> 48px </dimen>. getDimension (R.dimen.test) повернеться 48.
Майкл Петерсон

Не працює для мене: stackoverflow.com/questions/55972518/…
Alex

@Trilarion Вони не просто перетворюють у пікселі. Вони говорять, що dpдасть масштабоване значення пікселя відносно масштабу об'єкта ресурсу, який використовується для його отримання. Після того, як ви потрапите в різні способи отримання ресурсів, це стане більш актуальним. Для простоти ви можете вважати це відносно масштабу екрану. Існують також spабо пікселі щодо розміру системного тексту, або px, або пікселі безпосередньо. Кожна різна і має різну мету.
Покинутий кошик


17

ResourceКлас також має метод getDimensionPixelSize () , який я думаю , що буде відповідати вашим потребам.


24
Це неправильно! Перетворення метрик також відбувається, getDimensionPixelSize()якщо ви можете посилатися на документи, в яких чітко зазначено Повернення Resource dimension value multiplied by the appropriate metric and truncated to integer pixels.
Мухаммед Бабар

Це неправильно. Перетворення показників також відбувається за допомогою цього методу.
Майкл Петерсон

14

Для тих, кому просто потрібно зберегти певну intцінність в ресурсах, ви можете зробити наступне.

integers.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <integer name="default_value">100</integer>
</resources> 

Код

int defaultValue = getResources().getInteger(R.integer.default_value);

2
Дякую за це, було більше того, що я шукав, хоч, можливо, і не для інших, але це рішення, що насправді, дало мені деяке уявлення про інші області мого коду
JamisonMan111

11

Ви можете використовувати getDimensionPixelOffset () замість getDimension, так що вам не потрібно було кидати на int.

int valueInPixels = getResources().getDimensionPixelOffset(R.dimen.test)


2
    This works but the value I get is multiplied times the screen density factor
  (1.5 for hdpi, 2.0 for xhdpi, etc).

Я думаю, що добре отримати значення відповідно до роздільної здатності, але якщо ви не хочете цього робити, надайте це в px .......

Незалежний від щільності піксель (dp)

Віртуальний піксельний блок, який слід використовувати під час визначення макета інтерфейсу, щоб виразити розміри макета або положення незалежно від щільності. Незалежний від щільності піксель еквівалентний одному фізичному пікселю на екрані 160 dpi, що є базовою щільністю, прийнятою системою для екрана "середньої" щільності. Під час виконання система прозоро обробляє будь-яке масштабування блоків dp, якщо це необхідно,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. Ви завжди повинні використовувати одиниці dp при визначенні інтерфейсу програми, щоб забезпечити належне відображення вашого інтерфейсу на екранах з різною щільністю.

Я думаю, що добре змінити значення відповідно до роздільної здатності, але якщо ви не хочете цього робити, надайте це в px .......

перейдіть за цим посиланням

відповідно до цього

д.п.

Пікселі, незалежні від щільності, - абстрактна одиниця, заснована на фізичній щільності екрану. Ці одиниці відносяться до екрана 160 dpi (крапки на дюйм), на якому 1dp приблизно дорівнює 1 px. 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.Співвідношення dp до пікселя змінюватиметься із щільністю екрана, але не обов'язково в прямому співвідношенні. Використання одиниць dp (замість одиниць px) - це просте рішення, щоб зробити розміри подання у вашому макеті належним чином змінити розмір екрана. Іншими словами, вона забезпечує узгодженість розмірів елементів інтерфейсу користувача в реальному світі на різних пристроях.

px

Пікселі - відповідає фактичним пікселям на екрані. Ця одиниця вимірювання не рекомендується, оскільки фактичне представлення може змінюватись у різних пристроях; кожен пристрій може мати різну кількість пікселів на дюйм і може мати більше або менше загальних пікселів на екрані.


2

Використовуйте розширення Kotlin

Ви можете додати розширення для спрощення цього процесу. Це дозволяє вам просто зателефонувати, context.dp(R.dimen. tutorial_cross_marginTop)щоб отримати значення Float

fun Context.px(@DimenRes dimen: Int): Int = resources.getDimension(dimen).toInt()

fun Context.dp(@DimenRes dimen: Int): Float = px(dimen) / resources.displayMetrics.density

Якщо ви хочете обробити це без контексту, ви можете використовувати Resources.getSystem():

val Int.dp get() = this / Resources.getSystem().displayMetrics.density // Float

val Int.px get() = (this * Resources.getSystem().displayMetrics.density).toInt()

Наприклад, на пристрої xhdpi використовуйте 24.dpдля отримання 12.0 або 12.pxотримання 24

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.