2012-01-30 91 views
3

我想繪製位圖的子部分,但大小不同。如果尺寸大於位圖中的源矩形,則我希望位圖的該部分平鋪以填充目標區域。然而,他們並沒有平鋪,而是越來越緊張。Canvas.drawBitmap()忽略油漆的平鋪模式

我成立了所有的變量如下:

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); 

我在做什麼錯?我應該如何繪製srcRectdstRect,這樣我的位圖子部分才能平鋪?

回答

7

我發現了這個問題,簡單地說:位圖上的着色器不能以這種方式工作。

來繪製一個特定的瓷磚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); 

然後你終於可以畫到目標矩形,但首先你必須設置爲着色器的轉換矩陣,否則它不會從正確的地方和MI啓動如果您的平鋪模式是CLAMP

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