我確信有一些關於它的帖子,我之前通過它們瀏覽過,但現在找不到它們。當用戶從頁面的邊緣向頁面邊緣滑動viewpager時檢測到
我想檢測用戶從頁面邊緣(例如左邊緣)滑動viewpager時的操作。我想爲這種輕掃做一些特殊處理,比如顯示菜單。
是否有任何ViewPager內置(?)支持?我隱約記得它是。否則,我必須執行我自己的邏輯來檢測這些行爲。
任何人都可以指點我一些信息嗎?
我確信有一些關於它的帖子,我之前通過它們瀏覽過,但現在找不到它們。當用戶從頁面的邊緣向頁面邊緣滑動viewpager時檢測到
我想檢測用戶從頁面邊緣(例如左邊緣)滑動viewpager時的操作。我想爲這種輕掃做一些特殊處理,比如顯示菜單。
是否有任何ViewPager內置(?)支持?我隱約記得它是。否則,我必須執行我自己的邏輯來檢測這些行爲。
任何人都可以指點我一些信息嗎?
我認爲,你應該覆蓋你的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的最佳方式。
祝你好運!
有了這個例子中,你可以控制所有類型的手勢在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
}
}
});
我希望這對你有所幫助。
簡單的檢查edge mask
public void onTouchEvent(MotionEvent event){
if (ev.getAction() == MotionEvent.ACTION_DOWN && ev.getEdgeFlags() == MotionEvent.EDGE_LEFT) {
}
}
同樣的邏輯,如果你把片段內onInterceptTouchEvent(MotionEvent event)
倍率工作。