天天看點

解決android子控件與父控件滑動沖突的問題解決android子控件與父控件滑動沖突的問題

解決android子控件與父控件滑動沖突的問題

開發過程中會遇到可滑動控件互相嵌套導緻滑動沖突的問題

考慮到滑動沖突是由于父view的onInterceptTouchEvent(MotionEvent ev)函數調用導緻的,可以通過調用父view的requestDisallowInterceptTouchEvent方法達到滑動子view不影響父view滑動的效果

繼承自view 的控件都可以重寫如下函數:

public boolean dispatchTouchEvent (MotionEventev)  //此方法分發觸發事件
           

重寫子類控件的上訴方法如下:

@Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        switch (ev.getAction()) {
            case MotionEvent.ACTION_DOWN:
                getParent().requestDisallowInterceptTouchEvent(true);
                break;
            case MotionEvent.ACTION_UP:
            case MotionEvent.ACTION_CANCEL:
                getParent().requestDisallowInterceptTouchEvent(false);
                break;
        }
        return super.dispatchTouchEvent(ev);
    }
           

這麼寫的好處是不影響childview的點選事件的觸發,相對影響較小。

壞處是這個自定義view的所有觸發事件父view都不能再響應,如果隻想處理一個方向上的滑動,可以加一條case條件判斷滑動方向來,在合适的方向上調用

getParent().requestDisallowInterceptTouchEvent(false);
           

允許父view處理滑動事件

參考:

Android觸摸事件分發機制

ListView與ViewPager的滑動沖突