Android и настройка ширины и высоты программно в единицах dp
Я делаю:
button.setLayoutParams(new GridView.LayoutParams(65, 65));
Согласно документам единицы для ширины и высоты (оба из 65 в выше) являются «пикселями». Как заставить это быть независимыми от устройства пикселями или «dp»?
- Полные стили для кросс-браузера.
- Масштабированный битмап, поддерживающий соотношение сторон
- Масштаб серии между двумя точками
- Android Webview - веб-страница должна соответствовать экрану устройства
- Разница между масштабированием по горизонтали и вертикали для баз данных
- Как найти абсолютную позицию щелчка при увеличении
- Масштабирование изображения с помощью CSS: есть ли альтернатива webkit для -moz-crisp-edge?
- Как масштабировать SVG-изображение, чтобы заполнить окно браузера?
- Как реализовать эффект масштабирования для представления изображения в Android?
- Масштабирование решений для MySQL (репликация, кластеризация)
Вам придется преобразовать его из 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, и она будет автоматически преобразована в пиксели в этом вызове:
final float inPixels= mActivity.getResources().getDimension(R.dimen.dimen_entry_in_dp);
И ваш dimens.xml будет иметь:
72dp
Расширяя эту идею, вы можете просто сохранить значение 1dp или 1sp как запись размера и запросить значение и использовать его как множитель. Используя этот подход, вы изолируете код от математического материала и полагаетесь на библиотеку для выполнения вычислений.
Простейший способ (и даже работает от api 1), который тестировался:
getResources().getDimensionPixelSize(R.dimen.example_dimen);
Из документации:
Извлеките размер для определенного идентификатора ресурса для использования в качестве размера в необработанных пикселях. Это то же самое, что и getDimension (int), за исключением того, что возвращаемое значение преобразуется в целочисленные пиксели для использования в качестве размера. Преобразование размера включает округление базового значения и обеспечение того, что ненулевое базовое значение имеет по меньшей мере один пиксель.
Да, это округление значения, но это не очень плохо (просто в нечетных значениях на устройствах hdpi и ldpi необходимо добавить небольшое значение, когда ldpi не очень распространен). Я тестировал устройство xxhdpi, которое преобразует 4dp в 16 (пикселей), и это правда.