Как правильно указать размеры в DIP из кода Java?
Я обнаружил, что можно установить размеры элементов интерфейса в макетах XML с использованием DIP, как показано в следующем фрагменте:
android:layout_width="10dip"
Но весь Java-интерфейс принимает целочисленные значения в качестве аргументов, и нет никакого способа указать измерения в DIP. Как правильно рассчитать это?
Я подумал, что я должен использовать плотность свойств DisplayMetrics
класс, но это правильный путь?
Могу ли я рассчитывать на то, что эта формула всегда верна?
пикселей * DisplayMetrics.density = dip
Есть ли в Android функция утилит для конвертации?
4 ответа
Существует существующий служебный метод, который называется TypedValue.applyDimensions(int, float, DisplayMetrics)
это делает это
Вот как это использовать:
// returns the number of pixels for 123.4dip
int value = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP,
(float) 123.4, getResources().getDisplayMetrics());
Есть список других типов, которые вы можете использовать с ним, в том числе COMPLEX_UNIT_SP
, COMPLEX_UNIT_PT
все найдено на странице, на которую я ссылался выше. Если вы исключите (int) typecast, вы получите число с плавающей запятой.
Я столкнулся с той же проблемой и нашел это, ковыряясь в коде.
Это правильная формула там. Хотя DisplayMetrics.density
не является статическим членом, поэтому, согласно тому же документу, на который вы ссылались, правильное использование:
// Maybe store this in a static field?
final float SCALE = getContext().getResources().getDisplayMetrics().density;
// Convert dips to pixels
float valueDips = 16.0f;
int valuePixels = (int)(valueDips * SCALE + 0.5f); // 0.5f for rounding
Используя поле плотности отображения метрик, вы можете получить коэффициент масштабирования для преобразования в / из провалов. Используйте метод Math.round для преобразования из числа с плавающей точкой в int, не нуждаясь в приведении или добавлении 0.5
// Converting dips to pixels
float dips = 20.0f;
float scale = getContext().getResources().getDisplayMetrics().density;
int pixels = Math.round(dips * scale);
// Converting pixels to dips
int pixels = 15;
float scale = getContext().getResources().getDisplayMetrics().density;
float dips = pixels / scale;
Я думаю, что лучший способ - не определять какие-либо измерения в коде, а использовать values/dimens.xml
файл вместо. Вы всегда можете определить свое измерение в желаемой единице, например:
<dimen name="my_layout_height">120dp</dimen>
а затем обратитесь к этому в вашей деятельности, как:
getResources().getDimensions(R.dimen.my_layout_height);
Это вернет пиксели после выполнения необходимых преобразований. И, конечно же, вы можете ссылаться на это в других XML-файлах, например:
android:layout_width="@dimen/my_layout_height"