2014-12-07 63 views
1

我確信有一些關於它的帖子,我之前通過它們瀏覽過,但現在找不到它們。當用戶從頁面的邊緣向頁面邊緣滑動viewpager時檢測到

我想檢測用戶從頁面邊緣(例如左邊緣)滑動viewpager時的操作。我想爲這種輕掃做一些特殊處理,比如顯示菜單。

是否有任何ViewPager內置(?)支持?我隱約記得它是。否則,我必須執行我自己的邏輯來檢測這些行爲。

任何人都可以指點我一些信息嗎?

enter image description here

回答

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的最佳方式。

祝你好運!

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() { 
} 
} 

設置你的自定義OnTouchListener in your viewpager object:

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

我希望這對你有所幫助。

4

簡單的檢查edge mask

public void onTouchEvent(MotionEvent event){ 

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

    } 

} 

同樣的邏輯,如果你把片段內onInterceptTouchEvent(MotionEvent event)倍率工作。