Android и установка ширины и высоты программно в единицах dp
Я делаю:
button.setLayoutParams(new GridView.LayoutParams(65, 65));
согласно документам единицы измерения ширины и высоты (оба 65 в приведенном выше) являются "пикселями". Как вы заставляете это быть независимыми от устройства пикселями или"dp"?
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 (пикселей), и это правда.