Android и установка ширины и высоты программно в единицах dp


Я делаю:

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

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

4 258

4 ответа:

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

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

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

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

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

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

и ваши размеры.xml будет иметь:

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

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

самый простой способ (и даже работает с api 1), который тестируется:

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

из документов:

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

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