画布局部文字绘图

时间:2016-12-30 15:48:54

标签: android android-canvas android-bitmap

我需要在2个连续的位图上绘制文本,形成一个连续的位图。

  • 文本可以从第一个位图开始,到第二个位图结束。
  • 一封信可以从第一个位图开始,但以第二个位图结束。

enter image description here

我可以使用第二个位图上的负偏移量将文本全部绘制两次

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

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

似乎解决问题的方法不对,我想支持 n 位图,我正在寻找更好的解决方案。

有什么想法吗?

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

答案是否定的。您无法使用drawText部分绘制一个位图,然后再绘制另一个位图。 drawText是一个单一的原子方法调用,可以在Canvas的单个实例上执行。并且您无法在drawText调用过程中切换画布的位图。

但也有其他选择。如果你要同时在内存中有Bitmap1Bitmap2,并且你没有寻找任何分层效果(xFermode绘图)那么你可以只使用一个Bitmap然后得到其中有两个位图。

但是如果您要绘制2位图以避免OutOfMemory错误,那么您可以执行以下操作。

  1. 不需要2个画布对象。只需一个画布并使用setBitmap()切换位图。
  2. Canvas中的任何绘制操作都是原子的。因此,您需要将drawText(text)拆分为两个,然后在第一个位图中绘制一个而在第二个位图中绘制另一个,而不是使用单个text。您可以使用Paint.getTextBounds()Paint.measureText()了解如何拆分text。但这真的很乱,你需要计算很多东西。
  3. drawText是一个非常快速的电话。即使用大文本称呼它10次也不会花费太多时间。所以我根本不认为你需要所有这些优化。但是,如果您要使用' drawText'然后' drawCircle'然后' drawRect' (多个绘制调用),然后您可以在Picture中记录这些调用。然后,您可以通过切换位图在“画布”上播放此图片。这将减少方法开销时间。