检测用户何时从页面边缘滑动viewpager

时间:2014-12-07 18:13:06

标签: android android-viewpager swipe

我确信有一些关于它的帖子,我之前浏览过它们,但现在我找不到它们。

我想检测用户从页面边缘(例如左边缘)滑动viewpager时的操作。我想对这种滑动进行一些特殊处理,例如显示菜单。

是否有任何ViewPager内置(?)支持?我隐约记得它是。否则,我必须实现自己的逻辑来检测这些动作。

有人能指出一些信息吗?

enter image description here

3 个答案:

答案 0 :(得分:4)

只需检查edge mask

即可
public void onTouchEvent(MotionEvent event){

    if (ev.getAction() == MotionEvent.ACTION_DOWN && ev.getEdgeFlags() == MotionEvent.EDGE_LEFT) {

    }

} 

如果将代码段置于onInterceptTouchEvent(MotionEvent event)覆盖范围内,则相同的逻辑将起作用。

答案 1 :(得分:0)

通过此示例,您可以在ViewPager中控制所有类型的手势,现在只需添加一些条件来处理onSwipeLeft()onSwipeRight()中的边缘

public class OnSwipeTouchListener implements OnTouchListener {

@SuppressWarnings("deprecation")
private final GestureDetector gestureDetector = new GestureDetector(new GestureListener());

public boolean onTouch(final View v, final MotionEvent event) {
    return gestureDetector.onTouchEvent(event);
}

private final class GestureListener extends SimpleOnGestureListener {

private static final int SWIPE_THRESHOLD = 100;
private static final int SWIPE_VELOCITY_THRESHOLD = 100;

@Override
public boolean onDown(MotionEvent e) {
    return true;
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
    onTouch(e);
    return true;
}


@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
    boolean result = false;
    try {
        float diffY = e2.getY() - e1.getY();
        float diffX = e2.getX() - e1.getX();
        if (Math.abs(diffX) > Math.abs(diffY)) {
            if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
                if (diffX > 0) {
                    onSwipeRight();
                } else {
                    onSwipeLeft();
                }
            }
        } else {
           // onTouch(e);
        }
    } catch (Exception exception) {
        exception.printStackTrace();
    }
    return result;
}
}
public void onTouch(MotionEvent e) {
}
public void onSwipeRight() {
//call this only if your condition was set
}

public void onSwipeLeft() {
//nothing, this means,swipes to left will be ignored
}

public void onSwipeTop() {
}

public void onSwipeBottom() {
}
}

在viewpager对象中设置自定义 OnTouchListener

viewPager.setOnTouchListener(new OnSwipeTouchListener() {
public void onSwipeRight() {
   if(your conditionIsMet){
   // move your pager view to the right
   }
}
});

我希望这对你有帮助。

答案 2 :(得分:0)

我认为,您应该覆盖ViewPager容器的几种方法。例如,如果它是LinearLayout

public class Liner extends LinearLayout {

public Liner(Context context, AttributeSet attrs, int defStyle) {
    super(context, attrs, defStyle);
    // TODO Auto-generated constructor stub
}

//Remember start points
float mInitX;
float mInitY;
// TouchSlop value
float mSomeValue=20F;
// 
boolean mCatched=false;

@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {

    switch (ev.getAction()) {
    case MotionEvent.ACTION_DOWN:
        mInitX=ev.getX();
        mInitY=ev.getY();
        break;

    default:
        break;
    }

    mCatched=mInitX<10 && Math.abs(ev.getX()-mInitX)>mSomeValue;

    return mCatched;
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    if(mCatched){
        //Do all you want here
    }
    return true;
}

}

如果你与TeRRo anrwer结合使用(将他的探测器放在onTouchEvent()中),你可能会得到很好的结果。但是使用DrawerLayout的最佳方式。

祝你好运!