Рисование холста с фиксированной шкалой - PullRequest
0 голосов
/ 26 августа 2018

У меня есть кнопка, нарисованная методом canvas onDraw.Сама кнопка может изменить размер в зависимости от устройства, но я хочу, чтобы текст, который я рисую внутри, оставался неизменным, даже если пользователь установил другой размер экрана или размер шрифта в настройках.Вот почему я делаю это в пикселях.

@Override
public void onDraw(Canvas canvas) {
    // 1. draw background
    paint.setStyle(Paint.Style.FILL);
    paint.setColor(colorBg);
    canvas.drawRect(padding, padding, w-padding, h-padding, paint);

    // 2. draw border
    paint.setStyle(Paint.Style.STROKE);
    paint.setColor(colorBorder);
    canvas.drawRect(padding, padding, w-padding, h-padding, paint);

    // 3. draw text
    int fontSizeTextNew = canvas.getHeight() / 100 * 19;
    int fontSizePaddingNew = canvas.getHeight() / 100 * 19;

    textPaint.setTextSize(fontSizeTextNew);
    textPaint.setShader(blackShader);
    textPaint.setTypeface(Typeface.DEFAULT);
    textPaint.getTextBounds(
            prefTitle, // text
            0, // start
            prefTitle.length(), // end
            rectangle // bounds
    );

    canvas.drawText(
            prefTitle,
            canvas.getWidth()/2,
            Math.abs(rectangle.height()) + padding + fontSizePaddingNew,
            textPaint
    );

    // 4. draw icon
    int fontSizeIconNew = canvas.getHeight() / 100 * 55;
    String str = prefIcon;
    textPaint.setTypeface(awesomeFont);
    textPaint.setTextSize(fontSizeIconNew);
    textPaint.setShader(yellowShader);
    // center for the text
    // https://stackoverflow.com/questions/11120392/android-center-text-on-canvas
    int yPos = (int) ((canvas.getHeight() / 2) - ((textPaint.descent() + textPaint.ascent()) / 2)) ;
    canvas.drawText(
            str,
            canvas.getWidth()/2,
            Math.abs(yPos) + fontSizeIconPadding,
            textPaint
    );
}

Сейчас эти 19% выглядят неплохо, но на разных экранах они будут выглядеть иначе.Как вы подходите к этой проблеме?как бы вы решили эту проблему?

Button1 Вот как это может выглядеть

...