Холст.drawTextOnPath(...) не работает на Lollipop

холст.DrawTextOnPath не работает на Lollipop устройства. Вот в чем разница. (Nexus 10 изображение правильное, но Леденец не отображается правильно)

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

там что-то "другое" мне нужно сделать на этом устройстве?

2 ответов


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

решение состоит в том, чтобы масштабировать все вверх, рисовать текст, а затем сжимать его обратно.

метод 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);
}

да, сломанный, как леденец. Прекрасно работал в 4.4.4.

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

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