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

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

Ниже 4.2:

введите описание изображения здесь

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

введите описание изображения здесь

Как вы можете видеть текст Потребление очень плотно. Кажется, это проблема кернинга, представленная в 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 () работает неправильно

РЕДАКТИРОВАТЬ:

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

EDIT (2):

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

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

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

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

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

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

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

Используйте эту функцию для правильного рисования с word wrap , new line break и text alignment

 static void drawTextWithStaticLayout(Canvas canvas, float x, float y, String text, int wrapWidth, TextPaint paint,Layout.Alignment alignment) { if (android.os.Build.VERSION.SDK_INT <= 15) { StaticLayout sl = new StaticLayout(text,paint, wrapWidth, alignment,1.0f,0.0f,false); sl.draw(canvas); } else { float originalTextSize = paint.getTextSize(); final float magnifier = 1000f; canvas.save(); canvas.translate(x,y); canvas.scale(1f / magnifier, 1f / magnifier); paint.setTextSize(originalTextSize * magnifier); StaticLayout sl = new StaticLayout(text,paint, (int)magnifier*wrapWidth, alignment,1.0f,0.0f,false); sl.draw(canvas); canvas.restore(); paint.setTextSize(originalTextSize); } } 
  • Обновление пользовательского интерфейса из разных streamов в JavaFX
  • Как определить направление движения между левым / правым и вверх / вниз
  • MATLAB: как отображать текст в кодировке UTF-8, считанный из файла?
  • Лучшая практика настройки местоположений JFrame
  • Почему большинство пользовательских интерфейсов однопоточных?
  • Почему мои вещи не отображаются в JFrame?
  • JavaFx tableview sort действительно медленный, как улучшить скорость сортировки, как в java swing
  • Создание надежного масштабируемого графического интерфейса Swing Chess
  • Темный прозрачный слой над QMainWindow в Qt
  • Возможно ли программирование графического интерфейса?
  • Какова связь между ContentPane и JPanel?
  • Давайте будем гением компьютера.