【问题标题】:Tiling a Bitmap on a Canvas在画布上平铺位图
【发布时间】:2011-06-17 20:22:45
【问题描述】:

我想为我通过 Canvas 绘制的位图创建一个“方格纸”外观,并试图找出最好的方法。

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

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

  • 我尝试在 SurfaceView 的 Thread.run() 中实现 this solution,但我认为问题是当 BitmapDrawable 转换为位图时......它会丢失平铺属性。

    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?

  • 将活动背景设置为所需的方格纸外观也不起作用,因为位图/画布布局是不透明的,并且会被挡住。

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

【问题讨论】:

    标签: android canvas bitmap tiling


    【解决方案1】:

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

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

    或者,如果您不需要即时修改实际的平铺背景,只需将其绘制为背景并在其顶部绘制SurfaceView。您链接的那篇文章提供了多种解决方案来平铺您可以实施的BitmapDrawable

    【讨论】:

    • 您可以将 BitmapDrawable 与 Canvas 一起使用。您所要做的就是编写 theDrawable.draw(canvas)。
    【解决方案2】:

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

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

    【讨论】:

    • 使用了BitmapDrawable.draw(Canvas)方法,效果很好,谢谢!
    • 也许值得一提的是你必须设置 myBitmapDrawable.setTileModeX(Shader.TileMode.REPEAT);和 myBitmapDrawable.setTileModeY(Shader.TileMode.REPEAT);实际绘制平铺...
    猜你喜欢
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 2010-11-21
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多