Как правильно указать размеры в DIP из кода Java? - PullRequest
51 голосов
/ 10 февраля 2010

Я обнаружил, что можно установить размеры элементов интерфейса в макетах XML с использованием DIP, как показано в следующем фрагменте:

android:layout_width="10dip"

Но весь интерфейс Java принимает целочисленные значения в качестве аргументов, и невозможно указать размеры в DIP. Как правильно рассчитать это?

Я подумал, что должен использовать плотность свойств класса DisplayMetrics, но правильно ли это?

Могу ли я рассчитывать на то, что эта формула всегда верна?

пикселей * DisplayMetrics.density = dip

Есть ли какая-нибудь утилита для конвертации где-нибудь в Android?

Ответы [ 4 ]

91 голосов
/ 21 апреля 2010

Существует существующий служебный метод с именем 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, вы получите число с плавающей запятой.

Я столкнулся с той же проблемой и нашел ее, ковыряясь в коде.

45 голосов
/ 10 февраля 2010

Это правильная формула там. Хотя 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
9 голосов
/ 27 апреля 2011

Используя поле плотности отображаемых метрик, вы можете получить коэффициент масштабирования для преобразования в / из провалов. Используйте метод 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;
5 голосов
/ 06 марта 2014

Я думаю, что лучший способ - не определять какие-либо измерения в коде, а вместо этого использовать файл 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"
...