Каков правильный способ задания размеров в DIP из кода Java?

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

android:layout_width="10dip" 

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

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

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

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

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

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

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

Это правильная формула. Хотя 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 для преобразования из 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; 

Я думаю, что лучший способ – не определять какие-либо измерения в коде, а использовать файл values/dimens.xml . Вы всегда можете определить свой размер в желаемом устройстве, например:

 120dp 

а затем обратитесь к этому в своей деятельности, например:

 getResources().getDimensions(R.dimen.my_layout_height); 

Это вернет пиксели после выполнения необходимых преобразований. И, конечно же, вы можете ссылаться на это в своих других XML-типах:

 android:layout_width="@dimen/my_layout_height" 
Давайте будем гением компьютера.