Каков правильный способ задания размеров в DIP из кода Java?
Я обнаружил, что можно установить размеры элементов интерфейса в XML-макетах с использованием DIP, как в следующем fragmentе:
android:layout_width="10dip"
Но весь интерфейс Java принимает целочисленные аргументы, и в DIP не указывается размер. Каков правильный способ рассчитать это?
Я понял, что мне нужно использовать плотность свойств classа DisplayMetrics
но это правильный способ?
- Управление диаграммой MS с двумя Y-осями
- Правильный способ предоставления пользователям доступа к дополнительным схемам в Oracle
- Действительно ли исключения для исключительных ошибок?
- SQL Server: как разрешить схемы?
- Есть ли простой способ заполнения раскрывающегося списка в этой схеме базы данных доступа?
Могу ли я полагаться на эту формулу, которая всегда правильная?
пикселей * 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"