Canvas.drawBitmap()忽略了paint的tile模式

时间:2012-01-30 09:16:45

标签: android bitmap android-canvas

我想绘制位图的子部分,但尺寸不同。如果大小比位图中的源矩形大,那么我希望位图的该部分平铺以填充目标区域。然而,他们没有被平铺,而是被拉伸了。

我按如下方式设置所有变量:

Bitmap b = BitmapFactory.decodeResource(getResources(), R.drawable.image);
Rect srcRect = ...
Rect dstRect = ...
Paint p = new Paint();
p.setShader(new BitmapShader(b, Shader.TileMode.REPEAT, Shader.TileMode.REPEAT));

然后在draw()方法中绘制如下:

canvas.drawBitmap(b, srcRect, dstRect, p);

我做错了什么?我应该如何将srcRect绘制到dstRect,以便我的位图子部分得到平铺?

1 个答案:

答案 0 :(得分:7)

我发现了这个问题,简洁明了:位图上的着色器无法正常工作。

要绘制一个平铺有特定Bitmap的矩形,您必须使用Canvas.drawRect()Paint具有BitmapShader。但是,Android开发者不可能那么简单。

首先,您必须将srcRect切换为单独的Bitmap(因为我不认为这是一个便宜的操作,因此将其缓存到此处),如下所示:

Bitmap t = Bitmap.createBitmap(b, srcRect.left, srcRect.top, srcRect.right-srcRect.left, srcRect.bottom-srcRect.top);

然后您必须创建PaintBitmapShader

BitmapShader bs = new BitmapShader(t, TileMode.REPEAT, TileMode.REPEAT);
Paint p = new Paint();
p.setShader(bs);

然后您最终可以绘制到目标矩形,但首先必须为着色器设置转换矩阵,否则它将无法从正确的位置开始,如果您的切片模式为{{1 }}:

CLAMP