2013-04-09 166 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);