Использует ли setWidth (int пикселей) независимый от устройства пиксель или физический пиксель в качестве единицы? Например, устанавливает ли setWidth (100) ширину представления 100 или 100 пикселей?
Спасибо.
Использует ли setWidth (int пикселей) независимый от устройства пиксель или физический пиксель в качестве единицы? Например, устанавливает ли setWidth (100) ширину представления 100 или 100 пикселей?
Спасибо.
Ответы:
Он использует пиксели, но я уверен, что вам интересно, как вместо этого использовать провалы. Ответ в TypedValue.applyDimension()
. Вот пример того, как преобразовать провалы в пиксели в коде:
// Converts 14 dip into its equivalent px
Resources r = getResources();
int px = Math.round(TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, 14,r.getDisplayMetrics()));
Правильный способ получить постоянное количество DIP в коде - создать XML-файл ресурсов, содержащий значения dp, примерно такие:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<dimen name="image_width">100dp</dimen>
<dimen name="image_height">75dp</dimen>
</resources>
Затем обратитесь к ресурсу в своем коде следующим образом:
float width = getResources().getDimension(R.dimen.image_width));
float height = getResources().getDimension(R.dimen.image_height));
Возвращенное число с плавающей запятой будет масштабировано в соответствии с плотностью пикселей устройства, поэтому вам не нужно повторять метод преобразования во всем приложении.
Метод setWidth (100), установите ширину 100 пикселей (не в dp). Таким образом, вы можете столкнуться с проблемами с разной шириной на разных телефонах Android. Поэтому используйте измерение в dp вместо пикселей. Используйте приведенный ниже код, чтобы получить измерение в dp ширины образца. = 300 пикселей и высота = 400 пикселей.
int width = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 300, getResources().getDisplayMetrics());
int Height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 400, getResources().getDisplayMetrics());
float dps = 100;
float pxs = dps * getResources().getDisplayMetrics().density;
Пиксели, конечно, метод запрашивает пиксели в качестве параметра.
Основываясь на приведенных выше ответах, которые мне подходят, я создаю несколько вспомогательных методов , просто добавляю их в свои утилиты, чтобы использовать их во всем проекте.
// value in DP
public static int getValueInDP(Context context, int value){
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, context.getResources().getDisplayMetrics());
}
public static float getValueInDP(Context context, float value){
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, value, context.getResources().getDisplayMetrics());
}
// value in PX
public static int getValueInPixel(Context context, int value){
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, value, context.getResources().getDisplayMetrics());
}
public static float getValueInPixel(Context context, float value){
return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_PX, value, context.getResources().getDisplayMetrics());
}