2013-04-09 161 views
0

爲什麼Canvas類中的drawBitmap()方法會扭曲圖像? 當我使用ImageView的setImageBitmap()函數在ImageView的子類上設置位圖時,圖像完美呈現。爲什麼Canvas類中的drawBitmap方法扭曲圖像

現在在Android 4.x中有一個錯誤,並且這個setImageBitmap會導致額外菜單項的問題。額外的菜單項目(通常超出使用More ...顯示的六個菜單項目)會丟失觸摸監聽器。

我有以下代碼,顯示如何使用兩種不同的方法呈現圖像。

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

    } 

} 

回答

1

可能它只是放大了。默認情況下,ImageView使用雙線性過濾繪製縮放的位圖。致電Canvas.drawBitmap時,您可以嘗試啓用它。您需要創建新的對象Paintcorresponding標誌(但不這樣做在onDraw法):

Paint mPaint = new Paint(Paint.FILTER_BITMAP_FLAG); 

,然後提供此Paint對象的Canvas.drawBitmap方法:

canvas.drawBitmap(bitmap, m, mPaint);