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);
}

https://github.com/catchthecows/BigTextButton

Класс Paint принимает размер текста в пикселях. Если вы собираетесь рисовать текст непосредственно через него, вам нужно обработать преобразования единиц перед вызовом paint.setTextSize(размер с плавающей запятой). Всегда используйте единицы sp или dp, и вы можете включить хотя бы отдельные ресурсы измерения. XML для небольших, обычных, больших и больших экранов.

Что это

GetResources().getDisplayMetrics(). Плотность

делает то, что это делает его похожим на экране одинакового размера с разной плотностью. Цени свой шаг.

Есть два решения вашей проблемы. 1. Попробуйте использовать большие, большие и нормальные макеты. Отрегулируйте их соответствующим образом на соответствующих макетов, чтобы выглядеть ровно.

  1. Получите процент заполнения экрана (высота / ширина и правая / левая / верхняя / нижняя часть холста в процентах для их равномерной настройки на разных экранах) холста. И применять его как layoutParams.

При звонке Canvas.drawText() размер текста сначала определяется переданным в Paint объект, который можно установить через Paint.setTextSize(), Размер текста автоматически масштабируется Canvas на основе плотности холста, которая может быть найдена с помощью Canvas.getDensity(),

При настройке размера текста для объекта рисования, который будет отображаться в Canvas, используйте значение единицы dp или же sp и пусть Canvas справится с масштабированием для вас.

И, конечно, вам может потребоваться указать различные значения в зависимости от размера экрана: поддержка нескольких экранов

Другие вопросы по тегам