2013-03-31 4 views
2

Я пытаюсь нарисовать текст на холсте, а затем поверните холст, чтобы текст отображался с ног на голову. Однако он все еще не отображается вверх ногами. Растровое изображение отображается вверх ногами, но текст отсутствует.Невозможно нарисовать текст с ног на голову в Canvas

Canvas canvas = new Canvas(bm); 
    canvas.drawText(text, 0, bm.getHeight()/2, paint); 
    canvas.rotate(180, bm.getWidth()/2, bm.getHeight()/2); 
+1

http://stackoverflow.com/questions/3167928/drawing-rotated-text-on-a-html5-canvas может помочь. –

+0

Сначала поверните холст, а затем нарисуйте текст на повернутом холсте. – Luis

+0

@ Leco С вращением [вы все еще не получаете] (http://jsfiddle.net/4dQ9V/) перевернутый текст. См. Мой ответ ниже – Raffaele

ответ

3

Когда вы превращаете холст, вы на самом деле выполнения обновления на transformation matrix, так что последующие вызовы живописи будут преобразованы. В качестве примера, если вы хотите, чтобы «подушка» ваша картина, сначала перевести холст:

canvas.translate(10.0f, 0); 

, а затем красят Rect на (0, 0):

canvas.drawRect(0, 0, 20, 10); 

Прямоугольник будет рисовать с его началом, переведенным в (10, 0), так что вы бы назвали drawRect(10, 0), потому что каждая двумерная точка умножается на текущую матрицу преобразования. То же самое относится и к другим affine transformations, таким как вращение и масштабирование. Поэтому, если вы хотите перевести перевернутый текст, вам необходимо применить преобразование сначала и , затем.

Кстати, чтобы нарисовать текст на самом деле вниз, преобразование вы ищете не вращение, но своп из Y координат:

canvas.scale(1, -1); 
canvas.drawText(text, 0, bm.getHeight()/2, paint); 

Кроме того, убедитесь, чтобы понять разница между Canvas и Bitmap: первая - это класс API Android, используемый для раскрытия различных API рисования, последний представляет собой массив фактических пикселей на изображении (и, насколько я помню, до 2,3 он выделяется из родных библиотек, поэтому никогда не забудьте позвонить Bitmap.recycle() или вы скоро получите доступное пространство d получить OutOfMemoryException s.

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