画布和九补丁?

时间:2011-05-16 08:25:11

标签: android

我使用NinePatch绘制到Canvas。 Canvas绘制的位图是1024px×128px。但是,无论我在哪里开始绘制NinePatch或它的宽度,NinePatch都不会在X轴上绘制超过550px。

这是我正在使用的NinePatch图像。

NinePatch PNG

这是创建和绘制的Bitmap的直接FileOutputStream。 NinePatch试图从(500,0)到(1024,128)。

NinePatch Error or Bug

我使用略微不透明的ARGB(32,255,0,0)值填充整个位图,以便轻松查看位图的边界。

以下是执行绘图的代码片段:

// Create a bitmap
Bitmap texture_bmp = Bitmap.createBitmap(1024, 128, DEFAULT_BITMAP_CONFIG);
mCanvas.setBitmap(texture_bmp);
mCanvas.drawARGB(32, 255, 0, 0); //Fill with color to see bitmap easily

Bitmap nine_patch_bmp = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.test_nine_patch);
NinePatch my_nine_patch = new NinePatch(nine_patch_bmp, nine_patch_bmp.getNinePatchChunk(), null);
my_nine_patch.draw(mCanvas, new Rect(500, 0, 1024, 128));

// Write texture to file ...

我的默认位图配置是ARGB_8888。我依次尝试了每个配置,结果相同。

我尝试使用Canvas.drawCircle()方法在550px标记处绘制一个圆圈,它画了一个圆圈,但NinePatch仍然剪裁。

我尝试使用NinePatchDrawable而不是NinePatch只是为了踢 - 没有区别。

即使使用不同的九个补丁图像,同样的问题仍在继续发生。

最后,我认为这可能与Canvas有剪辑区域集有关。所以我在绘制NinePatch之前跟踪了Canvas的剪辑区域:

mCanvas.getClipBounds()的直接Traceview输出:

05-16 01:59:47.439: mCanvas.getClipBounds(): Rect(0, 0 - 1024, 128)

剪辑矩形似乎完全包含了我的Bitmap。但为了好玩,我决定尝试在NinePatch绘制之前直接添加这一行:

mCanvas.clipRect(new Rect(0,0,1024,128));

它有效! NinePatch现在超出550px标记没问题。

现在,经过这个冗长的解释,我的问题是

为什么我必须明确设置Canvas'剪辑矩形?我完全错过了什么或是某种错误吗?

谢谢。

0 个答案:

没有答案