Нежелательный эффект деформации рисования текста на пути 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);
перед рисованием на экране, поскольку более низкое качество может означать более простое преобразование текста. Это просто гадание конечно. В настоящее время ваша единственная настройка высокого качества перед записью на диск. Или просто удалите его из метода записи на диск, чтобы проверить, влияет ли это на способ отображения текста.