当前位置 : 主页 > 手机开发 > android >

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

来源:互联网 收集:自由互联 发布时间:2021-06-11
我想绘制位图的子部分,但大小不同.如果大小比位图中的源矩形大,那么我希望位图的该部分平铺以填充目标区域.然而,他们没有得到平铺,而是被拉伸了. 我设置了所有变量如下: Bitmap
我想绘制位图的子部分,但大小不同.如果大小比位图中的源矩形大,那么我希望位图的该部分平铺以填充目标区域.然而,他们没有得到平铺,而是被拉伸了.

我设置了所有变量如下:

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,以便我的位图子部分被平铺?

我发现了这个问题,简洁明了:位图上的着色器不能那样工作.

要绘制使用特定位图平铺的矩形,您必须使用Canvas.drawRect(),并使用具有BitmapShader的Paint.但是,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);

然后你最终可以绘制到目标矩形,但首先你必须为着色器设置一个平移矩阵,否则它不会从正确的位置开始,如果你的tile模式是CLAMP,它可能会完全错误:

Matrix m = new Matrix();
m.postTranslate(dstRect.left, dstRect.right);
p.getShader().setMatrix(m);
canvas.drawRect(dstRect, p);
网友评论