Вычислить порог в onInterceptTouchEvent пользовательского ViewPager

Я создаю приложение для комиксов/манги, в котором есть действие, содержащее viewpager для отображения изображений в каждой главе. Я хочу, чтобы ViewPager начинал новую главу, когда пользователь выходил за пределы первой/последней страницы. Для этого я нашел решение на SO, используя собственный ViewPager и переопределив onInterceptTouchEvent

public class CustomViewPager extends ViewPager {

float mStartDragX;
OnSwipeOutListener mListener;

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

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

public void setOnSwipeOutListener(OnSwipeOutListener listener) {
    mListener = listener;
}


@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
    float x = ev.getX();
    switch (ev.getAction()) {
        case MotionEvent.ACTION_DOWN:
            mStartDragX = x;
            break;
        case MotionEvent.ACTION_MOVE:
            if (mStartDragX < x && getCurrentItem() == 0) {
                mListener.onSwipeOutAtStart();
            } else if (mStartDragX > x && getCurrentItem() == getAdapter().getCount() - 1) {
                mListener.onSwipeOutAtEnd();
            }
            break;
    }
    return super.onInterceptTouchEvent(ev);
}

public interface OnSwipeOutListener {
    void onSwipeOutAtStart();
    void onSwipeOutAtEnd();
}

}

Этот подход работает до определенной степени. Дело в том, что мой ViewPager использует TouchImageView, который позволяет масштабировать изображение, и если я использую эту функцию на первой/последней странице, то любое движение перетаскивания (наименьшее событие) вызовет onSwipeOutAtStart и onSwipeOutAtEnd. Как я могу настроить порог для запуска соответствующих методов только при пролистывании за пределы половины или одной трети размера экрана? Или, что еще лучше, отключить эти методы при увеличении изображения? Любая помощь приветствуется.


person Hải Nguyễn    schedule 05.07.2015    source источник


Ответы (1)


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

layout.setTag(position);

Я установил тег как позицию страницы. Затем измените MotionEvent.ACTION_MOVE на:

case MotionEvent.ACTION_MOVE:
            if (mStartDragX < x && getCurrentItem() == 0) {
                View view = findViewWithTag(0);
                if (view != null) {
                    TouchImageView img = (TouchImageView) view.findViewById(R.id.img);
                    if (!img.isZoomed()) {
                        mListener.onSwipeOutAtStart();
                    }
                }
            } else if (mStartDragX > x && getCurrentItem() == getAdapter().getCount() - 1) {
                View view = findViewWithTag(getAdapter().getCount() - 1);
                if (view != null) {
                    TouchImageView img = (TouchImageView) view.findViewById(R.id.img);
                    if (!img.isZoomed()) {
                        mListener.onSwipeOutAtEnd();
                    }
                }
            }
            break;

Не уверен, что это правильный путь, но он работает. Насчет порога свайпа решения пока не нашел.

person Hải Nguyễn    schedule 05.07.2015