2010-02-10 4 views
51

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

android:layout_width="10dip" 

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

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

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

пикселей * DisplayMetrics.density = падение

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

ответ

43

Это правильная формула. Хотя DisplayMetrics.density не является статическим членом, поэтому, в соответствии с same document you alluded to, правильное использование является:

// 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 
+1

Спасибо, Роман, я как-то упустил эту часть. Есть два дополнительных вопроса, связанных с темой: - будет ли плотность всегда равной для обоих измерений? Кажется, это так (поскольку это только одно значение), но, возможно, есть и другая формула для вычисления этого. - нет ли API для преобразования для меня? Должен ли я писать следующий код в моем коде?В коде компоновки XML можно указать «dip» как единицу, почему это невозможно в Java API? –

+1

Я думаю, вы можете смело предположить, что плотность равна в обоих измерениях. Помните, что DisplayMetrics.density является ** логической плотностью **, а не фактической плотностью экрана (которая может незначительно отличаться от логической плотности). Что касается API конверсии, то тривиально написать вспомогательный метод, например say 'Util.dip', который преобразует dip в пиксели для использования в вызовах функций. В любом случае, это чище обрабатывать единицы в Java. –

91

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

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

+12

Это преобразует пиксели в DIP, а не в DIP в пиксели, которые, как я полагаю, это то, что хотел OP. Конечно, это то, что я хотел. Что вы делаете так: '(int) (желательноDIP * context.getResources(). GetDisplayMetrics(). Плотность)' – mxcl

9

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

Math.round делает актерский состав. '(int) Math.floor (a + 0.5f)' - это то, что Math.round делает под капотом. –

5

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