Отключение вертикального пейджера при увеличении изображения в TouchImageView

Я использую VerticalViewPager и TouchImageView для увеличения/уменьшения изображения. Когда я увеличиваю изображение и пытаюсь перетащить изображение вниз (чтобы просмотреть нижнюю часть изображения), пейджер просмотра переходит ко второму изображению. Любая помощь будет оценена. Мне нужно отключить просмотр пейджера. Я пытался изменить функцию canScroll пейджера вертикального просмотра, но это не помогло.

Вот код, который я изменил:

protected boolean canScroll(View v, boolean checkV, int dy, int x, int y) {
   if(v instanceof TouchImageView)
   {
       Log.d("Here","Here");
       if(((TouchImageView) v).getCurrentZoom()!=1)
       {
           Log.d("Here","HereAgain");

           return false;
       }
   }

   else  if (v instanceof ViewGroup) {
        final ViewGroup group = (ViewGroup) v;
        final int scrollX = v.getScrollX();
        final int scrollY = v.getScrollY();
        final int count = group.getChildCount();
        // Count backwards - let topmost views consume scroll distance first.
        for (int i = count - 1; i >= 0; i--) {
            // TODO: Add versioned support here for transformed views.
            // This will not work for transformed views in Honeycomb+
            final View child = group.getChildAt(i);
            if (y + scrollY >= child.getTop() && y + scrollY < child.getBottom() &&
                    x + scrollX >= child.getLeft() && x + scrollX < child.getRight() &&
                    canScroll(child, true, dy, x + scrollX - child.getLeft(),
                            y + scrollY - child.getTop())) {
                return true;
            }
        }

       return checkV && ViewCompat.canScrollVertically(v, -dy);
    }

   return false;
}

person AAA DDE    schedule 07.12.2014    source источник


Ответы (2)


Чтобы решить эту проблему, создайте собственный класс VerticalViewPager, который переопределяет события прокрутки (onTouchEvent , onInterceptTouchEvent), а затем возвращает из него true или false в зависимости от того, хотите ли вы прокручивать или нет, и это будет достигнуто с помощью предопределенного логического значения переменная:

import android.content.Context;
import android.view.MotionEvent;

public class CustomizongVVP extends VerticalViewPager {

    public boolean scroll = true;

    public CustomizongVVP(Context context) {
        super(context);
    }

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

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return scroll && super.onTouchEvent(event);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent event) {
        return scroll && super.onInterceptTouchEvent(event);
    }

    public void setScroll(boolean scroll) {
        this.scroll = scroll;
    }

}

и определить:

CustomizongVVP custom_vvp = new CustomizongVVP(this);
custom_vvp.setScroll(true); // to allow scrolling
custom_vvp.setScroll(false); // to disable scrolling

Таким образом, вы можете в любое время переключаться между true и false, чтобы разрешить или отключить прокрутку с помощью метода custom_vvp.setScroll().

person Muhammed Refaat    schedule 07.12.2014
comment
Я расширил класс пейджера с вертикальным представлением, но когда я определил пользовательский вид в файле макета, это выдало мне ошибку. - person AAA DDE; 07.12.2014
comment
Я исправил проблему с макетом. - person AAA DDE; 07.12.2014
comment
@sohaibfarooqi какую ошибку выдает? а какую задачу ты решил? - person Muhammed Refaat; 07.12.2014
comment
Это дало мне ошибку при раздувании XML-файла, на самом деле я пропустил конструктор с двумя аргументами в CustomizedViewPager. - person AAA DDE; 07.12.2014
comment
@sohaibfarooqi да, верно, может быть, я тоже это пропустил. Итак, как обстоят дела сейчас, это сработало? - person Muhammed Refaat; 07.12.2014
comment
Да, это сработало отлично. Большое спасибо. Я протестировал его, и он отключает просмотр пейджера. - person AAA DDE; 07.12.2014

Другой подход заключается в создании подкласса TouchImageView и переопределении метода canScrollVertically, например:

@Override
public boolean canScrollVertically(int direction) {
    matrix.getValues(m);
    float y = m[Matrix.MTRANS_Y];

    if (getImageHeight() < viewHeight) {
        return false;

    } else if (y >= -1 && direction < 0) {
        return false;

    } else if (Math.abs(y) + viewHeight + 1 >= getImageHeight() && direction > 0) {
        return false;
    }

    return true;
}

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

Надеюсь, это полезно

person Paul    schedule 26.10.2015