Каков правильный способ указания размеров в DIP из кода Java?
Я обнаружил, что можно задать размеры элементов интерфейса в XML-макетах, используя DIP, как в следующем фрагменте:
android:layout_width="10dip"
Но весь интерфейс Java принимает целочисленные аргументы, и нет способа указывать измерения в DIP. Каков правильный способ рассчитать это?
Я решил, что мне нужно использовать плотность свойств класса DisplayMetrics
, но это правильный способ?
Можно ли полагаться на правильность этой формулы?
пикселей * DisplayMetrics.density = dip
Есть ли утилита для преобразования где-нибудь в Android?
Ответы
Ответ 1
Существует существующий метод утилиты, созданный под названием 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), вы получите номер с плавающей запятой.
Я столкнулся с той же проблемой и нашел это, просунув код.
Ответ 2
Это правильная формула. Хотя 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
Ответ 3
Используя поле плотности показателей отображения, вы можете получить коэффициент масштабирования для преобразования в/из провалов. Используйте метод Math.round для преобразования из float в 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;
Ответ 4
Я думаю, что лучший способ - не определять какие-либо измерения в коде, а вместо этого использовать 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"