Какая единица измерения использует Paint.setTextSize(float)?
Я хочу нарисовать текст с определенной высотой (в пикселях) с помощью Canvas
. Можете ли вы просто использовать Paint.setTextSize(float)
с количеством пикселей или с помощью dp
или sp
?
Ответы
Ответ 1
Он использует пиксели, но вы можете преобразовать его в dp с помощью этого кода:
double getDPFromPixels(double pixels) {
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
switch(metrics.densityDpi){
case DisplayMetrics.DENSITY_LOW:
pixels = pixels * 0.75;
break;
case DisplayMetrics.DENSITY_MEDIUM:
//pixels = pixels * 1;
break;
case DisplayMetrics.DENSITY_HIGH:
pixels = pixels * 1.5;
break;
}
return pixels;
}
Ответ 2
Самый простой способ получить значение px для таких методов - просто определить соответствующее значение dp или sp в файле dimens.xml и получить его следующим образом:
int sizeInPx = context.getResources().getDimensionPixelSize(R.dimen.sizeInSp);
На самом деле у вас есть 3 метода, которые можно использовать в зависимости от ваших потребностей:
-
getDimension()
Возвращает float в пикселях.
-
getDimensionPixelSize()
Возвращает int в пикселях. Это то же самое, что и getDimension(), за исключением того, что возвращаемое значение равно ROUNDED до ближайшего целочисленного значения и гарантирует, что ненулевое входное значение приведет к ненулевому выходному значению (например, 0,1 возвращается как 1, а не 0).
-
getDimensionPixelOffset()
Возвращает int в пикселях. Это то же самое, что и getDimension(), за исключением того, что возвращаемое значение TRUNCATED (т.е. округлено вниз). Результат может быть равен нулю.
Ответ 3
Эти методы включают DisplayMetrics
, которые можно добавить в будущий Android SDK.
Пикселы для окунания:
public static float getDipFromPixels(float px) {
return TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_PX,
px,
Resources.getSystem().getDisplayMetrics()
);
}
Dip to pixels:
public static float getPixelsFromDip(float dip) {
return TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP,
dip,
Resources.getSystem().getDisplayMetrics()
);
}