gpt4 book ai didi

android - Canvas.drawBitmap() 忽略绘画的平铺模式

转载 作者:太空宇宙 更新时间:2023-11-03 12:23:19 25 4
gpt4 key购买 nike

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

我将所有变量设置如下:

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

最佳答案

我发现了问题,简而言之:位图上的着色器不能那样工作。

绘制一个用特定 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);

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

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

关于android - Canvas.drawBitmap() 忽略绘画的平铺模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9061625/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com