2013-04-09 2 views
0

Canvas 클래스의 drawBitmap() 메서드가 왜 이미지를 왜곡합니까? ImageView의 setImageBitmap() 함수를 사용하여 ImageView의 하위 클래스에 비트 맵을 설정하면 이미지가 완벽하게 렌더링됩니다.Canvas 클래스의 drawBitmap 메서드가 왜 이미지를 왜곡합니까

이제 Android 4.x에 버그가 있으며이 setImageBitmap이 추가 메뉴 항목에 문제를 발생시킵니다. 추가 메뉴 항목 (일반적으로 기타 ...를 사용하여 표시되는 6 개 메뉴 항목 초과)은 터치 리스너를 느슨하게합니다.

두 가지 다른 방법을 사용하여 이미지를 렌더링하는 방법을 보여주는 다음 코드가 있습니다.

/** 
* 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은 bilinear 필터링을 사용하여 스케일 된 비트 맵을 그립니다. Canvas.drawBitmap에 전화 할 때 사용하도록 설정할 수 있습니다. Canvas.drawBitmap 방법이 Paint 객체를 공급 한 후

Paint mPaint = new Paint(Paint.FILTER_BITMAP_FLAG); 

을 그리고 :

canvas.drawBitmap(bitmap, m, mPaint); 
당신은 corresponding 플래그 새로운 Paint 객체를 생성해야합니다 (그러나 onDraw 방법에서이 작업을 수행하지 않음)
관련 문제