Canvas クラスの drawBitmap() メソッドで画像が歪むのはなぜですか? ImageView の setImageBitmap() 関数を使用して ImageView のサブクラスにビットマップを設定すると、画像は完全にレンダリングされます。
現在、Android 4.x にバグがあり、この setImageBitmap が余分なメニュー項目に問題を引き起こしています。余分なメニュー項目 (通常、[その他...] を使用して表示される 6 つのメニュー項目を超える) は、タッチ リスナーを失います。
2 つの異なる方法を使用して画像をレンダリングする方法を示す次のコードがあります。
/**
* draws bitmap icons
*/
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
if(bitmap == null){
bitmap = AppMain.getItemIcon(thisItem);
}
//drawBitmap(canvas, bitmap); //distorts image
drawBitmap(bitmap); //works perfect
}
//draw using setImageBitmap
private void drawBitmap(Bitmap bitmap){
if(bitmap != null){
this.setImageBitmap(bitmap);
Matrix m = this.getImageMatrix();
m.setRectToRect(new RectF(0, 0, bitmap.getWidth(), bitmap.getHeight()),
new RectF(0, 0, this.getWidth(), this.getHeight()),
Matrix.ScaleToFit.CENTER);
this.setImageMatrix(m);
}
}
//draw using canvas.drawBitmap()
private void drawBitmap(Canvas canvas, Bitmap bitmap){
if(bitmap != null){
Matrix m = new Matrix();
m.setRectToRect(new RectF(0, 0, bitmap.getWidth(), bitmap.getHeight()),
new RectF(0, 0, this.getWidth(), this.getHeight()),
Matrix.ScaleToFit.CENTER);
canvas.drawBitmap(bitmap, m, null);
}
}