Java Android Canvas.drawText(...) одинаково большой на всех экранах
Я нарисовал текст с canvas.drawText(...)
в моем проекте и протестированы с различными устройствами.
Тем не менее, размер текста сильно варьируется от экрана к экрану.
Я пытался умножить это с getResources().getDisplayMetrics().density
но они все еще немного не одного размера.
Есть ли способ получить одинаковый размер текста на разных устройствах?
4 ответа
Привет, вы можете посмотреть на этот пост, http://catchthecows.com/?p=72, я думаю, что это поможет вам. @ Переопределить защищенный void onSizeChanged (int w, int h, int oldw, int oldh) {super.onSizeChanged (w, h, oldw, oldh);
// save view size
mViewWidth = w;
mViewHeight = h;
// first determine font point size
adjustTextSize();
// then determine width scaling
// this is done in two steps in case the
// point size change affects the width boundary
adjustTextScale();
}
void adjustTextSize() {
mTextPaint.setTextSize(100);
mTextPaint.setTextScaleX(1.0f);
Rect bounds = new Rect();
// ask the paint for the bounding rect if it were to draw this
// text
mTextPaint.getTextBounds(mText, 0, mText.length(), bounds);
// get the height that would have been produced
int h = bounds.bottom - bounds.top;
// make the text text up 70% of the height
float target = (float)mViewHeight*.7f;
// figure out what textSize setting would create that height
// of text
float size = ((target/h)*100f);
// and set it into the paint
mTextPaint.setTextSize(size);
}
void adjustTextScale() {
// do calculation with scale of 1.0 (no scale)
mTextPaint.setTextScaleX(1.0f);
Rect bounds = new Rect();
// ask the paint for the bounding rect if it were to draw this
// text.
mTextPaint.getTextBounds(mText, 0, mText.length(), bounds);
// determine the width
int w = bounds.right - bounds.left;
// calculate the baseline to use so that the
// entire text is visible including the descenders
int text_h = bounds.bottom-bounds.top;
mTextBaseline=bounds.bottom+((mViewHeight-text_h)/2);
// determine how much to scale the width to fit the view
float xscale = ((float) (mViewWidth-getPaddingLeft()-getPaddingRight())) / w;
// set the scale for the text paint
mTextPaint.setTextScaleX(xscale);
}
@Override
protected void onDraw(Canvas canvas) {
// let the ImageButton paint background as normal
super.onDraw(canvas);
// draw the text
// position is centered on width
// and the baseline is calculated to be positioned from the
// view bottom
canvas.drawText(mText, mViewWidth/2, mViewHeight-mTextBaseline, mTextPaint);
}
Класс Paint принимает размер текста в пикселях. Если вы собираетесь рисовать текст непосредственно через него, вам нужно обработать преобразования единиц перед вызовом paint.setTextSize(размер с плавающей запятой). Всегда используйте единицы sp или dp, и вы можете включить хотя бы отдельные ресурсы измерения. XML для небольших, обычных, больших и больших экранов.
Что это
GetResources().getDisplayMetrics(). Плотность
делает то, что это делает его похожим на экране одинакового размера с разной плотностью. Цени свой шаг.
Есть два решения вашей проблемы. 1. Попробуйте использовать большие, большие и нормальные макеты. Отрегулируйте их соответствующим образом на соответствующих макетов, чтобы выглядеть ровно.
- Получите процент заполнения экрана (высота / ширина и правая / левая / верхняя / нижняя часть холста в процентах для их равномерной настройки на разных экранах) холста. И применять его как layoutParams.
При звонке Canvas.drawText()
размер текста сначала определяется переданным в Paint
объект, который можно установить через Paint.setTextSize()
, Размер текста автоматически масштабируется Canvas
на основе плотности холста, которая может быть найдена с помощью Canvas.getDensity()
,
При настройке размера текста для объекта рисования, который будет отображаться в Canvas, используйте значение единицы dp
или же sp
и пусть Canvas справится с масштабированием для вас.
И, конечно, вам может потребоваться указать различные значения в зависимости от размера экрана: поддержка нескольких экранов