解決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的滑動沖突