Странное поведение при масштабировании ImageView

У меня есть ImageView, к которому я добавил OnTouchListener, чтобы я мог увеличивать и уменьшать масштаб последнего, используя жест щипка двумя пальцами. Я использую приведенный ниже код, но у меня возникла проблема с изменением размера фактического растрового изображения. Последний размывается, остается прежнего размера и накладывается на версию изображения с измененным размером, как будто новое изображение просто помещается поверх старого, а не заменяется им. Я думаю, что есть проблема с методом drawMatrix...

    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:
            //A change has happened during a press gesture (between ACTION_DOWN and ACTION_UP).
            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);
            } 

            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.1){
            curScale = 0.1f;    
        }

        view.buildDrawingCache();
        Bitmap originalBitmap = view.getDrawingCache();
        Bitmap resizedBitmap;    
        int newHeight = (int) (view.getHeight() * curScale);
        int newWidth = (int) (view.getWidth() * curScale);
        resizedBitmap = Bitmap.createScaledBitmap(originalBitmap, newWidth, newHeight, false);
        view.setImageBitmap(resizedBitmap); 

    }

Когда я несколько раз увеличиваю и уменьшаю масштаб, вот что получается... введите здесь описание изображения

Спасибо за любую помощь, которую я могу получить.


person jpmastermind    schedule 30.10.2012    source источник


Ответы (2)


На самом деле вы вызываете функцию рисования в onmove, поэтому она продолжает вызывать ее, когда вы двигаете пальцем. Таким образом, изображения, созданные с новой высотой и шириной, настраиваются на изображение, которое уже установлено der. Попробуйте удалить все представления, прежде чем устанавливать изображение с измененным размером в изображение. Надеюсь, это решит вашу проблему.

private void drawMatrix(ImageView view){
        float curScale = distCurrent/dist0;
        if (curScale < 0.1){
            curScale = 0.1f;    
        }

        view.buildDrawingCache();
        Bitmap originalBitmap = view.getDrawingCache();
        Bitmap resizedBitmap;    
        int newHeight = (int) (view.getHeight() * curScale);
        int newWidth = (int) (view.getWidth() * curScale);
        resizedBitmap = Bitmap.createScaledBitmap(originalBitmap, newWidth, newHeight, false);
        view.removeallviews();
        view.setImageBitmap(resizedBitmap); 

    }
person Sreedev R    schedule 30.10.2012
comment
Мне жаль, что это не будет работать с изображением. Я опоздал, чтобы проверить это. На самом деле я ищу, чтобы решить, что это скоро вернется, когда я закончу это. дайте мне посмотреть - person Sreedev R; 31.10.2012
comment
Спасибо, жду вашего решения - person jpmastermind; 31.10.2012

Вы можете использовать класс TouchImageView [https://github.com/MikeOrtiz/TouchImageView/blob/master/src/com/example/touch/TouchImageView.java]. Что дает хорошие возможности увеличения и уменьшения масштаба для просмотра изображения.

person mini    schedule 30.10.2012
comment
Я пробовал, дело в том, что я уже сделал возможным перетаскивание в пределах определенной области. С TouchImageView, чтобы сделать его масштабируемым только в этой конкретной области, я должен установить его высоту и ширину в соответствии с размером области, но тогда, если я это сделаю, я не смогу перетащить другой ImageView, который я бросаю в область. .. Мне нужно что-то, что будет масштабировать сам ImageView, а не только изображение внутри него в области ImageView. Вы понимаете? - person jpmastermind; 31.10.2012