2011-01-29 61 views
11

我想創建一個'圖紙'看我正在通過畫布繪製的位圖,並試圖找出最好的方法來做到這一點。在畫布上平鋪一個位圖

我無法將包含圖形紙張背景的源位圖傳遞給畫布構造函數,因爲我通過.lockCanvas()調用獲取了SurfaceView中的畫布。

一些解決方案,我已經試過:

  • 我試着在我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以填充整個視區?

  • 將活動背景設置爲所需的圖形紙外觀也不起作用,因爲位圖/畫布佈局是不透明的並且阻止了它被看到。

任何想法如何實現這一目標?

回答

27

你有兩個簡單的解決方案:

  • 要麼使用BitmapDrawable,但不是提取的位圖,只需調用BitmapDrawable.draw(畫布)。不要忘記設置drawable的邊界來填充繪圖區域。
  • 使用BitmapShader創建一個Paint並用它繪製一個矩形(這基本上是BitmapDrawable的作用)。
+2

使用BitmapDrawable.draw(Canvas)方法,完美工作,謝謝! – 2011-01-30 06:08:52

-3

我確定有一種方法可以使用SurfaceView獲得平鋪效果。不幸的是,它看起來像你不能在畫布上使用BitmapDrawable。因此,您可能必須通過在Canvas上創建自己的Rect系列併爲每個位圖繪製縮放位圖來實現自己的自定義平鋪方法。

說實話不會那麼難。只需獲取視圖的寬度/高度,並根據此數據創建一個Rect的數組,您將繪製Bitmap即可。

或者,如果您不需要對實際平鋪背景進行實時修改,只需將其作爲背景進行繪製並在其上繪製SurfaceView即可。您鏈接的這篇文章提供了多種解決方案來平鋪您可以實現的BitmapDrawable

+2

您可以在Canvas中使用BitmapDrawable。你所要做的就是編寫theDrawable.draw(canvas)。 – 2011-01-29 20:17:30