2016-12-30 5 views
0

Мне нужно нарисовать текст на двух последовательных растровых изображениях, которые образуют одно растровое изображение.Листинг частичного текста на холсте

  • Текст может начинаться с первого растрового изображения и заканчиваться на втором растровом изображении.
  • Письмо может начинаться с первого растрового изображения, но заканчиваться на втором растровом изображении.

enter image description here

Я могу нарисовать текст в полном объеме в два раза, используя отрицательное смещение на второй битовой

//first bitmap 
canvas1.drawText(text, position, top, paint); 

//second bitmap 
canvas2.drawText(text, -lengthOfTextOnFirstBitmap, top, paint); 

кажется, неправильный путь решения проблемы, я хотел бы поддержать n растровые изображения, и я ищу лучшее решение.

Любые мысли?

+0

У вас есть только одно текстовое поле и несколько растровых изображений, расположенных за ним? –

+0

@SergChernata нет, это не проблема TextView, я должен делать собственную печать с использованием холста. – aviran

+0

Вы попробовали этот пример кода на github https://github.com/amulyakhare/TextDrawable ?? –

ответ

1

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

//first bitmap 
canvas1.drawText(text, position, top, paint); 

//second bitmap 
canvas2.translate(width_of_1st_bitmap, 0); 
canvas2.drawText(text, position, top, paint); 
canvas2.translate(-width_of_1st_bitmap, 0); 
+0

. Это другой подход к использованию смещений, по-прежнему требует полные рисунки текста для каждого растрового изображения и не решает мою задачу оптимизации для n растровых изображений. – aviran

0

Ответ Нет, вы не можете использовать drawText частично рисовать в одном Bitmap, а затем в другом растровом изображении. drawText - это один вызов атомарного метода, который может быть выполнен в одном экземпляре Canvas. И вы не можете переключать растровые изображения холста в середине вызова drawText.

Но есть альтернативы. Если вы будете иметь Bitmap1 и Bitmap2 в памяти одновременно, и вы не ищете никаких эффектов наложения (рисунок xFermode), тогда вы можете просто использовать один битмап, а затем извлечь из него два растровых изображения.

Но если вы собираетесь нарисовать 2 растровых изображения, чтобы избежать ошибки OutOfMemory, вы можете сделать что-то, как показано ниже.

  1. Нет необходимости в двух предметах из полотна. Просто используйте один холст и используйте setBitmap() для переключения растровых изображений.
  2. Любая операция ничьей в Canvas является атомной. Поэтому вместо того, чтобы использовать один drawText(text), вам нужно разбить text на два, а затем нарисуйте один в первом растровом изображении, а другой во втором. Вы можете использовать Paint.getTextBounds() или Paint.measureText(), чтобы знать, как разделить text. Но это действительно грязно, и вам нужно рассчитать много вещей.
  3. drawText - очень быстрый вызов. Это не займет много времени, даже если вы назовете его большим текстом в 10 раз. Поэтому я действительно не думаю, что вам нужны все эти оптимизации вообще. Однако, если вы собираетесь использовать «drawText», а затем «drawCircle», а затем «drawRect» (несколько вызовов рисования), вы можете записать эти вызовы в Picture. И затем вы можете воспроизвести это изображение на холсте, переключив растровые изображения. Это уменьшит время работы метода.