在画布上平铺位图

时间:2011-01-29 18:53:40

标签: android canvas bitmap tiling

我想通过Canvas为我绘制的Bitmap创建一个'graph paper'外观,并试图找出最佳方法。

我无法将包含方格纸背景的源位图传递给Canvas构造函数,因为我通过.lockCanvas()调用在SurfaceView中获取Canvas。

我尝试过的一些解决方案:

  • 我尝试在我的SurfaceView的Thread.run()中实现this solution,但我认为问题是当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);

    位图b = TileMe.getBitmap(); canvas.drawBitmap(b,0,0,null);

  • 如果我使用Canvas.drawBitmap method that takes a destination RectF as a parameter,看起来位图将被平铺以填充RectF ...但是如何可靠地声明填充整个视图区域的RectF?

  • 将活动背景设置为所需的方格纸外观也不起作用,因为位图/画布布局不透明并阻止其被看到。

任何想法如何实现这一目标?

2 个答案:

答案 0 :(得分:27)

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

  • 使用BitmapDrawable,但不要提取Bitmap,只需调用BitmapDrawable.draw(Canvas)。不要忘记设置drawable的边界以填充绘图区域。
  • 使用BitmapShader创建一个Paint并用它绘制一个矩形(这基本上就是BitmapDrawable的作用)。

答案 1 :(得分:-3)

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

老实说,这并不难。只需获取视图的宽度/高度,然后根据您将Rect绘制到的数据创建一个Bitmap数组。

或者,如果您不需要动态修改实际的平铺背景,只需将其绘制为背景并在其上绘制SurfaceView。您关联的帖子提供了多种解决方案,可以平铺您可以实施的BitmapDrawable