3.5 View的滑動沖突(三)

此篇文章用內部攔截法解決內外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攔截后,后續事件無法傳到子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),要根據速度判斷,自動滾到下一頁或上一頁。

3. 外部攔截法和內部攔截法的區別

外部攔截法符合事件的分發流程,簡單。內部攔截法盡管也能實現,但稍顯復雜,建議使用外部攔截法。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容