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...
Ответы
Ответ 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