在画布上瓦片化位图

11
我想在通过Canvas绘制的Bitmap上创建“方格纸”外观,并尝试找出最佳方法来实现这一点。 由于我是通过.lockCanvas()调用从SurfaceView中获取Canvas,因此无法将包含方格纸背景的源Bitmap传递给Canvas构造函数。
我尝试过以下解决方案: 1. 我尝试在SurfaceView的Thread.run()中实现此解决方案,但问题可能是当BitmapDrawable转换为Bitmap时...它会丢失平铺属性。 canvas = mSurfaceHolder.lockCanvas(null); BitmapDrawable TileMe = new BitmapDrawable(BitmapFactory.decodeResource(getResources(), R.drawable.editor_graph)); TileMe.setTileModeX(Shader.TileMode.REPEAT); TileMe.setTileModeY(Shader.TileMode.REPEAT); Bitmap b = TileMe.getBitmap(); canvas.drawBitmap(b, 0, 0, null);
2. 如果我使用Canvas.drawBitmap方法,该方法以目标RectF作为参数,则似乎位图将被平铺以填充RectF...但是如何可靠地声明一个填充整个视图区域的RectF?
3. 将活动背景设置为所需的方格纸外观也不起作用,因为位图/画布布局是不透明的,并且阻止了其被看到。
有什么想法可以实现这个吗?
2个回答

27

您有两个简单的解决方案:

  • 要么使用BitmapDrawable,但不是提取位图,而是调用BitmapDrawable.draw(Canvas)。别忘了将可绘制对象的边界设置为填充您的绘图区域。
  • 使用带有BitmapShader的Paint创建一个矩形,并用它进行绘制(这基本上就是BitmapDrawable所做的)。

2
使用了BitmapDrawable.draw(Canvas)方法,完美运行,谢谢! - Unpossible
6
或许值得注意的是,您需要设置myBitmapDrawable.setTileModeX(Shader.TileMode.REPEAT)和myBitmapDrawable.setTileModeY(Shader.TileMode.REPEAT),才能实际上以平铺方式绘制它。 - bk138

-3

我相信有一种方法可以使用SurfaceView实现平铺效果。不幸的是,看起来你不能在画布上使用BitmapDrawable。因此,您可能需要通过在Canvas上创建自己的一系列Rect并向每个矩形绘制缩放位图来实现自己的自定义平铺方法。

这其实并不难。只需获取视图的宽度/高度,并根据此数据创建一个Rect数组,您将在其中绘制Bitmap

或者,如果您不需要对实际平铺背景进行修改,只需将其作为背景绘制,并在其上方绘制SurfaceView。您链接的帖子提供了多种解决方案,可用于实现平铺BitmapDrawable


2
你可以在Canvas中使用BitmapDrawable。你所需要做的就是写下theDrawable.draw(canvas)。 - Romain Guy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接