Android и установка ширины и высоты программно в дп - PullRequest
282 голосов
/ 10 марта 2011

Я делаю:

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

Согласно документам, единицами ширины и высоты (оба пункта 65 выше) являются «пиксели». Как вы заставляете это быть независимыми от устройства пикселями, или "dp"?

Ответы [ 4 ]

510 голосов
/ 10 марта 2011

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

final float scale = getContext().getResources().getDisplayMetrics().density;
int pixels = (int) (dps * scale + 0.5f);
205 голосов
/ 09 мая 2013

Я знаю, что это старый вопрос, но я нашел более аккуратный способ сделать это преобразование.

TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 65, getResources().getDisplayMetrics());
34 голосов
/ 07 сентября 2015

Глядя на ваше требование, есть и альтернативное решение.Кажется, вы знаете измерения в dp во время компиляции, поэтому вы можете добавить запись измерения в ресурсы.Затем вы можете запросить запись измерения, и она будет автоматически преобразована в пиксели в этом вызове:

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

И ваш размер. XML будет иметь:

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

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

33 голосов
/ 12 февраля 2016

Самый простой способ (и даже работающий от API 1), который был протестирован:

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

Из документации:

Извлечение измерения для определенного идентификатора ресурса для использования в качестверазмер в необработанных пикселях.Это то же самое, что и getDimension (int), за исключением того, что возвращаемое значение преобразуется в целочисленные пиксели для использования в качестве размера.Преобразование размера включает в себя округление базового значения и обеспечение того, чтобы ненулевое базовое значение имело размер не менее одного пикселя.

Да, оно округляет значение, но это не очень плохо (только в нечетных значениях)на устройствах hdpi и ldpi нужно добавить небольшое значение, когда ldpi встречается не очень часто) Я тестировал устройство xxhdpi, которое конвертирует 4dp в 16 (пикселей), и это действительно так.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...