我想绘制位图的子部分,但大小不同.如果大小比位图中的源矩形大,那么我希望位图的该部分平铺以填充目标区域.然而,他们没有得到平铺,而是被拉伸了. 我设置了所有变量如下: 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);