2014-11-04 2 views
8

canvas.DrawTextOnPath, похоже, не работает на устройстве Lollipop. См. Разницу здесь. (Нексус 10 изображение является правильным, но леденец не правильно отображать)Canvas.drawTextOnPath (...) не работает на Lollipop

Image

Код простой путь ничья.

// Path for the inner circle 
unitPath = new Path(); 
unitPath.addArc(unitRect, 180.0f, 180.0f); 

// Draw the text and the path 
canvas.drawTextOnPath("Inner Circle", unitPath, 0.0f, 0.0f, unitPaint); 
canvas.drawPath(unitPath,unitPaint); 

Проект тестирования Android Studio, иллюстрирующий этот вопрос, можно увидеть здесь для тех, кто хочет его увидеть. https://dl.dropboxusercontent.com/u/6768304/WebLinks/TestApp.rar

Есть что-то «разные» Мне нужно сделать на этом устройстве?

+0

Вы уверены, что путь правильный? Каков источник пути? –

+0

Это приложение работает на обоих устройствах. Вы можете увидеть путь на картинке. Последние 2 строки кода выше - это текст внутреннего круга и заполненный полукруг. – Kuffs

ответ

3

ОК, так что кажется, что DrawTextOnPath немного сломана теперь с размерами шрифта ниже 1.0f

Решение масштабировать все вверх, сделать то текст уменьшить его обратно вниз.

Метод drawTitle в демонстрационном проекте изменится от этого:

private void drawTitle(Canvas canvas) { 
    canvas.drawTextOnPath(upperTitle, upperTitlePath, 0.0f, 0.02f, unitPaint); 
    canvas.drawTextOnPath(lowerTitle, lowerTitlePath, 0.0f, 0.0f, unitPaint); 
    canvas.drawTextOnPath(unitTitle, unitPath, 0.0f, 0.0f, unitPaint); 
    canvas.drawPath(unitPath,unitPaint); 
} 

к этому:

private void drawTitle(Canvas canvas) { 
    //Save original font size 
    float originalTextSize = unitPaint.getTextSize(); 

    // set a magnification factor 
    final float magnifier = 100f; 

    // Scale the canvas 
    canvas.save(); 
    canvas.scale(1f/magnifier, 1f/magnifier); 

    // create new rects and paths based on the new scale 
    unitRect = new RectF(); 
    unitRect.set((faceRect.left + unitPosition) * magnifier, (faceRect.top + unitPosition) * magnifier, (faceRect.right - unitPosition) * magnifier, (faceRect.bottom - unitPosition) * magnifier); 
    unitPath = new Path(); 
    unitPath.addArc(unitRect, 180.0f, 180.0f); 

    titleRect = new RectF(); 
    titleRect.set((faceRect.left + titlePosition) * magnifier, (faceRect.top + titlePosition) * magnifier, (faceRect.right - titlePosition) * magnifier, (faceRect.bottom - titlePosition) * magnifier); 
    upperTitlePath = new Path(); 
    upperTitlePath.addArc(titleRect, 180.0f, 180.0f); 

    titleRect = new RectF(); 
    titleRect.set((faceRect.left + titlePosition) * magnifier, (faceRect.top + titlePosition) * magnifier, (faceRect.right - titlePosition) * magnifier, (faceRect.bottom - titlePosition) * magnifier); 
    lowerTitlePath = new Path(); 
    lowerTitlePath.addArc(titleRect, -180.0f, -180.0f); 

    // increase the font size 
    unitPaint.setTextSize(originalTextSize * magnifier); 

    // do the drawing of the text 
    canvas.drawTextOnPath(unitTitle, unitPath, 0.0f, 0.0f, unitPaint); 
    canvas.drawTextOnPath(upperTitle, upperTitlePath, 0.0f, 0.02f, unitPaint); 
    canvas.drawTextOnPath(lowerTitle, lowerTitlePath, 0.0f, 0.0f, unitPaint); 

    // bring everything back to normal 
    canvas.restore(); 
    unitPaint.setTextSize(originalTextSize); 

    canvas.drawPath(unitPath, unitPaint); 
} 
+0

u спас меня от жизни. – bakriOnFire

0

Да, сломана леденцов. Отлично работает в 4.4.4.

https://code.google.com/p/android/issues/detail?id=40965

Я устанавливаю размер текста 5.F если он был меньше, масштабирование холста вниз, и масштабирование базового пути соответствующим образом. Медленно, но это работает, я не могу дождаться, когда смогу удалить эту ужасную группу.

Смежные вопросы