此篇文章用內(nèi)部攔截法解決內(nèi)外View滑動方向不一致的沖突問題
1. 重寫ListView如下
public class ListViewEx extends ListView {
int mLastX,mLastY;
public ListViewEx(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
int x = (int) ev.getX();
int y = (int) ev.getY();
switch (ev.getAction()){
case MotionEvent.ACTION_DOWN:
// True if the child does not want the parent to intercept touch events.
// down時不希望父Veiw攔截鼠证,父View攔截后,后續(xù)事件無法傳到子View中
getParent().requestDisallowInterceptTouchEvent(true);
break;
case MotionEvent.ACTION_MOVE:
int deltaX = x - mLastX;
int deltaY = y - mLastY;
if (Math.abs(deltaX)>Math.abs(deltaY)){
// false 子類希望父View攔截(disallowIntercept所禀,不允許攔截竞漾,不攔截為true則不攔截,為false則攔截)
getParent().requestDisallowInterceptTouchEvent(false);
}
break;
case MotionEvent.ACTION_UP:
break;
case MotionEvent.ACTION_CANCEL:
break;
}
mLastX = x;
mLastY = y;
return super.dispatchTouchEvent(ev);
}
}
2. 外部HorizontalScrollViewEx修改攔截方法
@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
int x = (int) event.getX();
int y = (int) event.getY();
int action = event.getAction();
if (action == MotionEvent.ACTION_DOWN) {
mLastX = x;
mLastY = y;
if (!mscroller.isFinished()) {
mscroller.abortAnimation();
return true;
}
return false;
} else {
return true;
}
}
HorizontalScrollViewEx中的onTouchEvent方法是處理它應有的效果的槐臀,如左右滾動(move)時锄蹂,View要左右跟著滾動。松開手指時(up)水慨,要根據(jù)速度判斷得糜,自動滾到下一頁或上一頁。
3. 外部攔截法和內(nèi)部攔截法的區(qū)別
外部攔截法符合事件的分發(fā)流程晰洒,簡單朝抖。內(nèi)部攔截法盡管也能實現(xiàn),但稍顯復雜谍珊,建議使用外部攔截法治宣。