Странно поведение при щипване на мащабиране на 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, така че тя продължава да я извиква, когато движите пръста си. Така че изображенията, генерирани с новата височина и ширина, са настроени на imageview, който вече е зададен. Опитайте да премахнете всички изгледи, преди да зададете преоразмереното изображение на изгледа на изображението. Надяваме се, че това ще реши проблема ви.

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