0

为什么 Canvas 类中的 drawBitmap() 方法会扭曲图像?当我使用 ImageView 的 setImageBitmap() 函数在 ImageView 的子类上设置位图时,图像被完美渲染。

现在在 Android 4.x 中有一个错误,这个 setImageBitmap 会导致额外的菜单项出现问题。额外的菜单项(通常超过使用更多...显示的六个菜单项)失去了触摸侦听器。

我有以下代码显示如何使用两种不同的方法渲染图像。

/**
 * 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 回答