2012-01-30 2 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

私はこの問題を発見しました。簡単に言えば、ビットマップのシェーダはそのようには機能しません。あなたがBitmapShaderを持ってPaintで、Canvas.drawRect()を使用する必要があり、特定のBitmapとタイル張りの四角形を描画するには

。しかし、Androidデベロッパーはこれほどシンプルではありません。

まずそのようにあなたは、(私はこれが安い操作ではないと思いますので、このどこかにキャッシュする)Bitmap別々にsrcRectをカットする必要があります。

Bitmap t = Bitmap.createBitmap(b, srcRect.left, srcRect.top, srcRect.right-srcRect.left, srcRect.bottom-srcRect.top); 

は、その後、あなたがPaintを作成する必要がありますそしてBitmapShader

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); 
関連する問題