2015-07-05 9 views
1

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

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. Как настроить порог, чтобы запускать соответствующие методы только при выводе за пределы для половины или одной трети размера экрана? Или даже лучше, отключите эти методы, пока изображение будет увеличено? Любая помощь приветствуется.

ответ

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; 

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