Android та налаштування ширини та висоти програмно в одиницях dp


304

Я роблю:

button.setLayoutParams(new GridView.LayoutParams(65, 65));

Згідно з документами, одиниці ширини та висоти (обидва 65 вище) - "пікселі". Як ви змусите це пікселі, незалежні від пристрою, або "dp"?

Відповіді:


541

Вам доведеться перетворити його з dps у пікселі, використовуючи коефіцієнт масштабу дисплея.

final float scale = getContext().getResources().getDisplayMetrics().density;
int pixels = (int) (dps * scale + 0.5f);

111
Правильне перетворення - (int) (dps * шкала + 0,5f). Це формула, яку ми використовуємо в рамках.
Ромен Гай

8
Формула знаходиться в документах. Для подальшого читання перейдіть до розділу 3 розробника.android.com
guide/practices/…

34
@RomainGuy, чи можете ви додайте в API функцію утиліти для перетворення dpв px? Дякую.
АлікЕльзін-кілака

3
що тут dps? я отримую "dps не можна вирішити до змінної" помилку? який тип "dps" потрібно оголосити ??
Діпак

5
Змінна "dps" - це вхідне значення, яке ви хочете перетворити.
Robby Pond

233

Я знаю, що це старе питання, проте я знайшов набагато акуратніший спосіб зробити це перетворення.

Java

TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65, getResources().getDisplayMetrics());

Котлін

TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65f, resources.displayMetrics)

8
Молодці, щоб дізнатися, як це зробити. Я не прихильник повторювати формулу в декількох місцях! Дякую.
darrenp

2
Якщо ні, то створіть функцію за формулою
Сайка

1
@Kenobi Це перетворення для вас з DP в PX. Вище 65вказане значення DP, яке ви хочете перетворити на PX
drspaceboo

7
Це має бути прийнята відповідь, а не поточна, де ці цифри (0,5) чарівно надходять з
ніде

1
@ Johny19 0,5 не є магією. Це просто, як округлити число з плаваючою комою до найближчого цілого числа, а не обрізати його. Дивіться мій коментар до відповіді Робі Понда для більш детальної інформації.
MarredCheese

38

Дивлячись на вашу вимогу, є і альтернативне рішення. Здається, ви знаєте розміри в dp під час компіляції, тому ви можете додати параметр розміру в ресурси. Тоді ви можете запитати запис про розмірність, і він буде автоматично перетворений у пікселі в цьому дзвінку:

final float inPixels= mActivity.getResources().getDimension(R.dimen.dimen_entry_in_dp);

І ваш dimens.xml матиме:

<dimen name="dimen_entry_in_dp">72dp</dimen>

Розширюючи цю ідею, ви можете просто зберегти значення 1dp або 1sp як розмірний запис і запитувати його і використовувати його як множник. Використовуючи такий підхід, ви ізолюєте код від математичних речей і покладаєтесь на бібліотеку для виконання розрахунків.


Зауважте, що повернене значення насправді є int, тому воно стає віднесеним до поплавця.
CorayThan

Це погана відповідь, оскільки вартість проїзду буде динамічною
Johny19

37

найпростіший спосіб (і навіть працює з api 1), який перевіряється:

getResources().getDimensionPixelSize(R.dimen.example_dimen);

З документальних записів:

Отримайте розмір для конкретного ідентифікатора ресурсу для використання у розмірі в неочищених пікселях. Це те саме, що і getDimension (int), за винятком того, що повернене значення перетворюється на цілі пікселі для використання як розмір. Перетворення розміру включає округлення базового значення та забезпечення того, що ненульове базове значення має розмір принаймні одного пікселя.

Так, це округлення значення, але це не дуже погано (просто у непарних значеннях на hdpi та ldpi пристроях потрібно додати трохи значення, коли ldpi не дуже часто) я перевірив на пристрої xxhdpi, який перетворює 4dp в 16 (пікселів), і це правда.

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