Проблема масштабирования ViewPager и ImageView

Я пытаюсь реализовать галерею изображений с помощью ViewPager. Кроме того, чтобы реализовать функцию масштабирования, я использую TouchImageView из github. Я также пытался использовать ZoomableImageView.

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

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

Следующее представление ViewPager должно загружаться только при достижении конца увеличенного изображения. Как это сделать?

Я не могу найти это. Если я коснусь и перетащу изображение по диагонали, только тогда изображение будет перемещено. или же вызывается перетаскивание ViewPager.

PS: это не дубликат. Масштабирование выполнено. Но проблема после масштабирования изображения.


person Bharath    schedule 13.12.2012    source источник


Ответы (4)


Да у меня тоже была такая же проблема не с TouchImageView.

Слишком решил проблему, что я сделал, отключил ViewPager, когда мое представление получает фокус.

public class EnableDisableViewPager extends ViewPager {

    private boolean enabled = true;

    public EnableDisableViewPager(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent arg0) {
        if(enabled)
            return super.onInterceptTouchEvent(arg0);

        return false;
    }

    public boolean isEnabled() {
        return enabled;
    }

    public void setEnabled(boolean enabled) {
        this.enabled = enabled;
    }
}

поэтому в TouchImageView реализуйте свой слушатель, чтобы вызвать событие, будь то масштабирование или перетаскивание.

установите прослушиватель для вашего объекта просмотра в вашей деятельности. Поэтому, когда это событие происходит, просто отключите представление пейджера.

Примечание: вам также потребуется событие перемещения мыши, чтобы включить просмотр пейджера.

ОТРЕДАКТИРОВАНО

Это будет работать только для Zoom, поэтому, чтобы ViewPager пролистал страницы, вы должны вернуться к исходному масштабу.

Добавьте этот код в свой TouchImageView

    public class TouchImageView extends ImageView {

        ...
    private TouchEventListener touchEventListener;

        private void sharedConstructing(Context context) {
            ...

            setOnTouchListener(new OnTouchListener() {

                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    ...
                        case MotionEvent.ACTION_UP:
                            ...
                            if(touchEventListener != null)
                            {
                                if(saveScale == 1.0)
                                    touchEventListener.onZoomToOriginal();
                                else
                                    touchEventListener.onZoom();
                            }
                            break;

                        ...
                    }
                    ...
                }

            });
        }

        ...

public TouchEventListener getTouchEventListener() {
        return touchEventListener;
    }

    public void setTouchEventListener(TouchEventListener touchEventListener) {
        this.touchEventListener = touchEventListener;
    }


        public interface TouchEventListener 
        {
            void onZoom();
            void onZoomToOriginal();
        }
    }

ЛУЧШЕЕ РЕШЕНИЕ

Мы могли бы добиться этого, не расширяя ViewPager до нового класса, используя метод, указанный ниже.

requestDisallowInterceptTouchEvent(true);

И с этим мы могли бы провести пальцем, не уменьшая масштаб до исходного положения, как мы видим в галерее и многих других приложениях.

public class TouchImageView extends ImageView {

        ...
private void stopInterceptEvent()
{
    getParent().requestDisallowInterceptTouchEvent(true);
}

private void startInterceptEvent()
{
    getParent().requestDisallowInterceptTouchEvent(false);
}

private void sharedConstructing(Context context) {
    super.setClickable(true);
    this.context = context;
    mScaleDetector = new ScaleGestureDetector(context, new ScaleListener());
    matrix.setTranslate(1f, 1f);
    m = new float[9];
    setImageMatrix(matrix);
    setScaleType(ScaleType.MATRIX);

    setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            mScaleDetector.onTouchEvent(event);

            matrix.getValues(m);
            float x = m[Matrix.MTRANS_X];
            float y = m[Matrix.MTRANS_Y];
            PointF curr = new PointF(event.getX(), event.getY());

            switch (event.getAction()) {
                case MotionEvent.ACTION_DOWN:
                    last.set(event.getX(), event.getY());
                    start.set(last);
                    mode = DRAG;
                    stopInterceptEvent();
                    break;
                case MotionEvent.ACTION_MOVE:
                    if (mode == DRAG) {
                        float deltaX = curr.x - last.x;
                        float deltaY = curr.y - last.y;
                        float scaleWidth = Math.round(origWidth * saveScale);
                        float scaleHeight = Math.round(origHeight * saveScale);
                        if (scaleWidth < width) {
                            deltaX = 0;
                            if (y + deltaY > 0)
                                deltaY = -y;
                            else if (y + deltaY < -bottom)
                                deltaY = -(y + bottom); 
                        } else if (scaleHeight < height) {
                            deltaY = 0;
                            if (x + deltaX > 0)
                                deltaX = -x;
                            else if (x + deltaX < -right)
                                deltaX = -(x + right);
                        } else {
                            if (x + deltaX > 0)
                                deltaX = -x;
                            else if (x + deltaX < -right)
                                deltaX = -(x + right);

                            if (y + deltaY > 0)
                                deltaY = -y;
                            else if (y + deltaY < -bottom)
                                deltaY = -(y + bottom);
                        }

                        if(deltaX == 0)
                            startInterceptEvent();
                        else
                            stopInterceptEvent();

                        matrix.postTranslate(deltaX, deltaY);
                        last.set(curr.x, curr.y);
                    }
                    break;

                case MotionEvent.ACTION_UP:
                    mode = NONE;
                    int xDiff = (int) Math.abs(curr.x - start.x);
                    int yDiff = (int) Math.abs(curr.y - start.y);
                    if (xDiff < CLICK && yDiff < CLICK)
                        performClick();
                    startInterceptEvent();
                    break;

                case MotionEvent.ACTION_POINTER_UP:
                    mode = NONE;
                    break;
            }
            setImageMatrix(matrix);
            invalidate();
            return true; // indicate event was handled
        }

    });
}
}
person Vivek Khandelwal    schedule 13.12.2012
comment
Я, пожалуйста, пересмотрите TouchImageView. Я действительно очень много работаю над этим. Я не могу найти решение. Было бы очень полезно, если бы вы могли помочь мне в этом!! Пожалуйста, обновите свой ответ с исправленным TouchImageView. - person Bharath; 13.12.2012
comment
Спасибо! Вы спасли мой день! - person lorenzo-s; 24.07.2013
comment
Какие переменные ширина, высота, право, дно? не упомянул об этом. - person Gangnaminmo Ako; 13.11.2013
comment
Спасибо @VivekKhandelwal - person Pratik Butani; 16.11.2013
comment
@VivekKhandelwal Большое спасибо, но изображение все еще иногда обрезается по краям другим изображением; Кроме того, мое изображение заполняло своего родителя, теперь оно меньше, почему? Благодарю. - person Learning Android; 14.01.2014
comment
Спасибо, Вивек, у меня это работает, много времени сэкономлено, еще раз спасибо! - person Anil Deshmukh; 13.05.2014
comment
@VivekKhandelwal Большое спасибо, все работает нормально - person sandeepmaaram; 23.02.2015
comment
@VivekKhandelwal Что такое ширина, высота, право и низ? - person Nitesh Kumar; 09.08.2015
comment
проверьте мой форк GitHub в комментариях выше, вы получите полный исходный код - person Vivek Khandelwal; 10.08.2015
comment
Большое спасибо. Вы спасаете мои дни :) - person Tuan Chau; 17.08.2015

Я заставил его работать, добавив этот код:

if(deltaX == 0 &&  saveScale == 1.0 )
    startInterceptEvent();
else
    stopInterceptEvent();
person Danilo80    schedule 03.07.2013

Наконец-то я нашел библиотеку Subsampling Scale Image View, которая работает даже со стандартным ViewPager. из пакета поддержки Android без каких-либо настроек.

person lobzik    schedule 15.04.2016

Если у кого-то есть горизонтальный вьюпейджер, важно изменить код @kirit-vaghela:

if(deltaX == 0 || saveScale == 1.0 )
    startInterceptEvent();
else
    stopInterceptEvent();

To

if(saveScale == 1.0 )
    startInterceptEvent();
else
    stopInterceptEvent();

Так что адаптер изменит картинку только когда будет 1.0

person Faustino Gagneten    schedule 02.03.2017