Подтвердить что ты не робот

Android 4.2.1 неправильный кернинг символов (интервал)

При использовании методов Canvas и drawText() я вижу другой рендеринг на Android 4.2.1.

Ниже 4.2:

enter image description here

Для Android 4.2.1 (Nexux 7) я получаю:

enter image description here

Как вы можете видеть текст Потребление очень плотно. Кажется, это проблема кернинга, представленная в 4.2.1. Краска, используемая для рисования текста, ничего особенного:

titlePaint = new Paint();
titlePaint.setAntiAlias(true);
titlePaint.setColor(0xffffffff);
titlePaint.setTextSize(0.125f);
titlePaint.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
titlePaint.setTextAlign(Align.CENTER);
titlePaint.setLinearText(true);

Если я не использую titlePaint.setLinearText(true), я получаю странный результат в 4.2.1, как вы можете видеть там:

Android 4.2 на Nexus 7: canvas.drawText() работает неправильно

EDIT:

Это странное поведение было сообщено команде Android: http://code.google.com/p/android/issues/detail?id=39755, но это все еще не является официальной проблемой.

РЕДАКТИРОВАТЬ (2):

Некоторые слухи утверждают, что проблема заключается в текстовом формате < 1.0f...

4b9b3361

Ответ 1

Обходной путь, который я использую сейчас:

scalePaint.setTextSize(1.5f);

то в методе onDraw:

canvas.save();
canvas.scale(0.01f, 0.01f);
canvas.drawText(""+i, 0.5f*100, 0.8f*100, scalePaint);                  
canvas.restore();

Как вы можете видеть, я отменяю позицию текста, поэтому он должен быть там.

Ответ 2

Я отвечаю на свой вопрос после принятия единственного ответа, который предложил обходной путь для моей конкретной проблемы. Это может быть "хорошим" и "окончательным" решением:

public static void drawTextOnCanvasWithMagnifier(Canvas canvas, String text, float x, float y, Paint paint) {
        if (android.os.Build.VERSION.SDK_INT <= 15) {
            //draw normally
            canvas.drawText(text, x, y, paint);
        }
        else {
            //workaround
            float originalTextSize = paint.getTextSize();
            final float magnifier = 1000f;
            canvas.save();
            canvas.scale(1f / magnifier, 1f / magnifier);
            paint.setTextSize(originalTextSize * magnifier);
            canvas.drawText(text, x * magnifier, y * magnifier, paint);
            canvas.restore();
            paint.setTextSize(originalTextSize);
        }
    }

Ответ 3

Это ошибка на Android, и пока она уже отправлена ​​на отслеживание ошибок, вы можете добавить +1 к ней, чтобы получить некоторое внимание: Проблема 39755