Использует ли setWidth(int пикселов) dip или px?
Использует ли setWidth(int пиксели) независимый от устройства пиксель или физический пиксель в качестве единицы измерения? Например, устанавливает ли setWidth(100) ширину представления в 100 dips или 100 px?
Благодарю.
7 ответов
Он использует пиксели, но я уверен, что вам интересно, как использовать провалы вместо этого. Ответ в TypedValue.applyDimension()
, Вот пример того, как конвертировать dips в px в коде:
// 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 px как ширину (не в 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());
}
Функция расширения Kotlin для преобразования пикселей в dp
fun Context.pxToDp(value: Float):Int{
val r: Resources = resources
return TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP, value, r.displayMetrics
).roundToInt()
}
Пиксели, конечно, метод запрашивает пиксели в качестве параметра.