Нежелательный эффект деформации рисования текста на пути Android

Я делаю несколько тестов на рисование текста на пути. Я сделал фоновую картинку, установив растровое изображение на холст. Затем я рисую текст по пути к холсту, повернутому по матрице. Я должен сократить код, я опубликую только важную часть, потому что она слишком длинная. Эти изображения, показанные ниже, обрезаны с gimp, поэтому не раздражайтесь из-за разных размеров. Мои объекты Rect,Path и Matrix:

    RectF drawTextOval;
    Path drawTextPath;
    Matrix mDrawnMatrix;

Теперь, это то, что я делаю, чтобы нарисовать текст на пути круга:

    drawTextOval.set(drawTextPosX - drawTextArc, drawTextPosY
                    - drawTextArc, drawTextPosX + drawTextArc, drawTextPosY
                    + drawTextArc);
            drawTextPath.addArc(drawTextOval, 0, 360);

            drawTextPath.computeBounds(drawTextOval, true);
            mDrawnMatrix.postRotate(drawTextArcStart,
                    (drawTextOval.right + drawTextOval.left) / 2,
                    (drawTextOval.bottom + drawTextOval.top) / 2);
            drawTextPath.transform(mDrawnMatrix);

            patternCanvas.drawTextOnPath(drawText, drawTextPath, 0, 0,
                    mFixedTextPaint); 

До этого момента все выглядит нормально

Но после сохранения всего экрана повернутый текст выглядит искривленным на сохраненном.png изображении. Все остальные компоненты выглядят хорошо. Я сделал несколько других рисунков с текстом, линейным или угловым, все это работает. Даже некоторые растровые изображения.png рисуют на холст и фоновое изображение... все выглядит нормально. Но нарисованный текст по кругу выглядит так:

Я не делаю масштабирования на растровом изображении, просто сохраняю изображение холста с помощью:

    FileOutputStream fos = new FileOutputStream(saveFile);
        this.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
        Bitmap bitmap = this.getDrawingCache();


        bitmap.compress(CompressFormat.PNG, 100, fos);
        fos.flush();
        fos.close();

Почему текст выглядит искаженным? Кто-нибудь видит мою ошибку? Заранее спасибо....

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

Я попробовал кое-что и обнаружил, что установка anyDensity в false или отключение аппаратного ускорения в Manifest покажет эффект во время выполнения перед сохранением. Это говорит мне о том, что при сохранении растрового изображения с помощью getDrawingCache(), в настоящее время масштабирование отключено. Но почему?

Последнее, что я обнаружил, - чем меньше кривизна, тем меньше масштабирование текста. Если текст немного изогнут, это кажется хорошим.

1 ответ

Я бы попробовал установить

this.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);

перед рисованием на экране, поскольку более низкое качество может означать более простое преобразование текста. Это просто гадание конечно. В настоящее время ваша единственная настройка высокого качества перед записью на диск. Или просто удалите его из метода записи на диск, чтобы проверить, влияет ли это на способ отображения текста.

Другие вопросы по тегам