重新缩放ImageView的位图时图像质量下降

时间:2012-11-08 06:24:57

标签: android matrix imageview scale

所以我有一个ImageView,我已经设置了一个OnTouchListener。 OnTouch方法如下所示。

//Touch event related variables
int touchState;
final int IDLE = 0;
final int TOUCH = 1;
final int PINCH = 2;
float dist0, distCurrent;

public boolean onTouch(View view, MotionEvent event) {
    boolean handledHere = false;

    float distx, disty;

    final int action = event.getAction();

    switch(action & MotionEvent.ACTION_MASK){           
    case MotionEvent.ACTION_DOWN:
        //A pressed gesture has started, the motion contains the initial starting location.
        touchState = TOUCH;
        break;
    case MotionEvent.ACTION_POINTER_DOWN:
        //A non-primary pointer has gone down.
        touchState = PINCH;

        //Get the distance when the second pointer touch
        distx = event.getX(0) - event.getX(1);
        disty = event.getY(0) - event.getY(1);
        dist0 = FloatMath.sqrt(distx * distx + disty * disty);

        break;
    case MotionEvent.ACTION_MOVE:
        if(touchState == PINCH){                        
            //Get the current distance
            distx = event.getX(0) - event.getX(1);
            disty = event.getY(0) - event.getY(1);
            distCurrent = FloatMath.sqrt(distx * distx + disty * disty);

            drawMatrix((ImageView) view);

        } else {
            handledHere = startDrag (view);
        }

        break;
    case MotionEvent.ACTION_UP:
        //A pressed gesture has finished.
        touchState = IDLE;
        break;
    case MotionEvent.ACTION_POINTER_UP:
        //A non-primary pointer has gone up.
        touchState = TOUCH;
        break;

    }

    return handledHere;
}

private void drawMatrix(ImageView view){
    float curScale = distCurrent/dist0;

    if (curScale < 0.5){
        curScale = 0.5f;    
    } else if (curScale > 1.5){
        curScale = 1.2f;
    }

    Bitmap originalBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888); //view.getDrawingCache();
    Canvas canvas = new Canvas(originalBitmap);
    view.draw(canvas);
    int[] originalSize = (int[]) view.getTag();
    int newHeight = (int) (originalSize[1] * curScale); 
    int newWidth = (int) (originalSize[0] * curScale); 

    view.setImageBitmap(getResizedBitmap(originalBitmap, newHeight, newWidth));
    view.getLayoutParams().height=newHeight;
    view.getLayoutParams().width=newWidth;

}

private Bitmap getResizedBitmap(Bitmap bm, int newHeight, int newWidth) {
    int width = bm.getWidth();
    int height = bm.getHeight();
    float scaleWidth = ((float) newWidth) / width;
    float scaleHeight = ((float) newHeight) / height;
    // create a matrix for the manipulation
    Matrix matrix = new Matrix();
    // resize the bit map
    matrix.postScale(scaleWidth, scaleHeight);
    // recreate the new Bitmap
    Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, false);
    return resizedBitmap;
}

问题是,当我使用手指手势放大或缩小时,图像质量会下降。例如,如果图像是PNG图像,具有半透明渐变,则渐变将变为固体模糊颜色,并且图像的其余部分变为像素化...任何人都有这样的解决方案,或者遇到相同的问题问题

1 个答案:

答案 0 :(得分:1)

在getResizedBitmap()中添加过滤:

Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height, matrix, true);