觸摸事件分發(fā)
幾個(gè)重要的方法
-
觸摸事件分發(fā):定義在
View
中@Override public boolean dispatchTouchEvent(MotionEvent ev) { return super.dispatchTouchEvent(ev); }
- 這個(gè)方法一般不去處理。
- 這個(gè)方法內(nèi)部調(diào)用了事件打斷和事件處理方法
- 本次觸摸事件中控件或者其子控件處理了事件就返回
true
-
觸摸事件打斷:定義在
ViewGroup
@Override public boolean onInterceptTouchEvent(MotionEvent ev) { return super.onInterceptTouchEvent(ev); }
- 打斷觸摸事件的傳遞(父控件收回子控件對(duì)觸摸事件的處理權(quán))
- 不能打斷自己處理的事件
- 打斷子控件對(duì)事件的處理的時(shí)候,子控件會(huì)調(diào)用
action_cancel
,子控件可能需要對(duì)這個(gè)事件進(jìn)行處理
-
觸摸事件處理:定義在
View
@Override public boolean onTouchEvent(MotionEvent event) { return super.onTouchEvent(event); }
- 是否處理只在
action_down
時(shí)有效:如果在action_down
的時(shí)候返回true
表示它要處理本次所有的觸摸事件 - 內(nèi)部調(diào)用
onTouch()
,如果用戶實(shí)現(xiàn)了setOnTouchListener
監(jiān)聽,它的返回值就是onTouchEvent的返回值
- 是否處理只在
觸摸事件處理(U型):事件從父控件-->子控件分發(fā),事件處理從子控件-->父控件直到被處理;
事件沖突處理例子
SlidingPaneLayout布局里面子控件有ViewPager的時(shí)候,SlidingPaneLayout打斷ViewPager的滑動(dòng)事件處理
解決方案一:ViewPager添加setOnTouchListener
pager.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
// v就是viewpager
ViewGroup parent = (ViewGroup) v.getParent();
float x = event.getX();
if (event.getAction() == MotionEvent.ACTION_DOWN) {
if (x < parent.getWidth() / 5) { // 不要寫定值
parent.requestDisallowInterceptTouchEvent(false); // 打斷,收回子控件對(duì)觸摸事件的處理權(quán),這個(gè)時(shí)候可以拉出SlidingPaneLayout
} else {
parent.requestDisallowInterceptTouchEvent(true); // 不被打斷,滑動(dòng)操作ViewPager
}
}
return false;
}
});
解決方案二:自定義SlidingPaneLayout
public class PagerAdapter extends android.support.v4.view.PagerAdapter {
// 重寫打斷方法
@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_DOWN) {
flag = isOpen() || (ev.getX() < getWidth() / 5);
}
return flag && super.onInterceptTouchEvent(ev);
}
}