Я хочу нарисовать текст определенной высоты (в пикселях) в представлении, используя Canvas
. Можете ли вы просто использовать Paint.setTextSize(float)
с количеством пикселей или это использование dp
или sp
?
Какую единицу измерения использует Paint.setTextSize(float)?
Ответы (3)
Он использует пиксели, но вы можете преобразовать его в 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;
}
getContext()
для получения Context
, после чего вы можете вызвать Context.getSystemService(Context.WINDOW_SERVICE)
для получения WindowManager
. Подробнее об этом здесь developer.android.com/reference/android/view/WindowManager. HTMLа>.
- person Tzoiker; 27.03.2014
dp
это px/density
. На самом деле это можно упростить, заменив switch
на pixels /= metrics.density
.
- person Tzoiker; 27.03.2014
switch
на pixels /= metrics.density
.
- person Tzoiker; 28.02.2015
Самый простой способ получить значение px для таких методов — просто определить соответствующее значение dp или sp в файле dimens.xml и получить его следующим образом:
int sizeInPx = context.getResources().getDimensionPixelSize(R.dimen.sizeInSp);
На самом деле у вас есть 3 метода, которые можно использовать в зависимости от ваших потребностей:
getDimension()
Возвращает число с плавающей запятой в пикселях.getDimensionPixelSize()
Возвращает целое число в пикселях. Это то же самое, что и getDimension(), за исключением того, что возвращаемое значение ОКРУГЛЕНО до ближайшего целого числа, и это гарантирует, что ненулевое входное значение приводит к ненулевому выходному значению (например, 0,1 возвращается как 1, а не 0).getDimensionPixelOffset()
Возвращает целое число в пикселях. Это то же самое, что и getDimension(), за исключением того, что возвращаемое значение TRUNCATED (т.е. округлено в меньшую сторону). Результат может быть нулевым.
22sp
выглядит хорошо на большом экране (например, Pixel XL — 1440x2560, 560 точек на дюйм), но на маленьком (например, Nexus One — 480x800 hdpi = 240 точек на дюйм) он даже не удобочитаемый. Например, myPaint.setTextSize(80)
текст выглядит хорошо на обоих экранах, а также имеет примерно одинаковый размер (всегда есть некоторая разница в размерах на разных устройствах, хотя обычно они очень маленькие).
- person Neph; 14.05.2020
R.dimen.textSize
), и это единственное, что действительно сработало - ни одно из других предложений по вычислению размер текста сделал.
- person Neph; 19.05.2020
PhotoView
(Chris Bane), чтобы иметь возможность масштабировать... изображение. Раньше я случайно использовал холст меньшего размера, но тогда он не рисовал в нужном месте. Спасибо за совет с правильным подходом, попробую, когда будет время, а пока оставлю так, потому что в итоге работает на разных устройствах, чего я и хотел. ;)
- person Neph; 20.05.2020
Эти методы включают DisplayMetrics
, которые могут быть добавлены в будущий Android SDK.
Пиксели для погружения:
public static float getDipFromPixels(float px) {
return TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_PX,
px,
Resources.getSystem().getDisplayMetrics()
);
}
Погружаемся в пиксели:
public static float getPixelsFromDip(float dip) {
return TypedValue.applyDimension(
TypedValue.COMPLEX_UNIT_DIP,
dip,
Resources.getSystem().getDisplayMetrics()
);
}