我想绘制位图的子部分,但尺寸不同。如果大小比位图中的源矩形大,那么我希望位图的该部分平铺以填充目标区域。然而,他们没有被平铺,而是被拉伸了。
我按如下方式设置所有变量:
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
,以便我的位图子部分得到平铺?
答案 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);
然后您必须创建Paint
和BitmapShader
:
BitmapShader bs = new BitmapShader(t, TileMode.REPEAT, TileMode.REPEAT);
Paint p = new Paint();
p.setShader(bs);
然后您最终可以绘制到目标矩形,但首先必须为着色器设置转换矩阵,否则它将无法从正确的位置开始,如果您的切片模式为{{1 }}:
CLAMP