0

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

    }

}
4

1 に答える 1

1

おそらく、スケールアップしただけでしょう。デフォルトでImageViewは、バイリニア フィルタリングを使用してスケーリングされたビットマップを描画します。を呼び出すときに有効にしてみてくださいCanvas.drawBitmap対応するフラグを使用して新しいPaintオブジェクトを作成する必要があります(ただし、メソッドではこれを行わないでください)。onDraw

Paint mPaint = new Paint(Paint.FILTER_BITMAP_FLAG);

次に、このPaintオブジェクトをCanvas.drawBitmapメソッドに提供します。

canvas.drawBitmap(bitmap, m, mPaint);
于 2013-04-09T16:12:41.347 に答える