關(guān)于view的Touch事件、關(guān)于ViewGroup的touch事件
View的觸摸事件:
dispatchTouchEvent、onTouchEvent、setOnTouchListener
onTouch()和onTouchEvent的區(qū)別:
- onTouch()是View提供給用戶,讓用戶自己處理觸摸事件的接口。而onTouchEvent()是Android系統(tǒng)自己實(shí)現(xiàn)的接口。
- onTouch()的優(yōu)先級比onTouchEvent()的優(yōu)先級更高。dispatchTouchEvent()中分發(fā)事件的時候,會先將事件分配給onTouch()進(jìn)行處理,然后才分配給onTouchEvent()進(jìn)行處理。
- 如果onTouch()對觸摸事件進(jìn)行了處理,并且返回true;那么,該觸摸事件就不會分配在分配給onTouchEvent()進(jìn)行處理了。只有當(dāng)onTouch()沒有處理,或者處理了但返回false時,才會分配給onTouchEvent()進(jìn)行處理。
傳遞流程:
- Android事件分發(fā)是先傳遞到ViewGroup,再由ViewGroup傳遞到View的。
- 在ViewGroup中可以通過onInterceptTouchEvent方法對事件傳遞進(jìn)行攔截,onInterceptTouchEvent方法返回true代表不允許事件繼續(xù)向子View傳遞,返回false代表不對事件進(jìn)行攔截,默認(rèn)返回false。
- 子View中如果將傳遞的事件消費(fèi)掉,ViewGroup中將無法接收到任何事件。
好了,Android事件分發(fā)機(jī)制完全解析到此全部結(jié)束,結(jié)合上下兩篇,相信大家對事件分發(fā)的理解已經(jīng)非常深刻了。
簡單來說就是傳遞的時候用父視圖往子視圖傳遞,中間如果某一層視圖的onInterceptTouchEvent返回true,那么就不會接著往下傳遞,然后開始響應(yīng)流程,從子視圖往父視圖傳遞,如果中間某一層消費(fèi)了這個事件,那么父視圖就不會接收到這個事件。
涉及到的API:
MotionEvent : 觸屏事件
- int ACTION_DOWN=0 : 代表down
- Int ACTION_MOVE=2 ; 代表move
- Int ACTION_UP=1 : 代表up
- getAction() : 得到事件類型值
- getX() : 得到事件發(fā)生的x軸坐標(biāo)(相對于當(dāng)前視圖)
- getRawX() :得到事件發(fā)生的x軸坐標(biāo)(相對于屏幕左頂點(diǎn))
- getY() : 得到事件發(fā)生的y軸坐標(biāo)(相對于當(dāng)前視圖)
- getRawY() :得到事件發(fā)生的y軸坐標(biāo)(相對于屏幕左頂點(diǎn))
Activity
- boolean dispatchTouchEvent(MotionEvent event) : 分發(fā)事件
- boolean onTouchEvent(MotionEvent event) : 處理事件的回調(diào)
View
- boolean dispatchTouchEvent(MotionEvent event) : 分發(fā)事件
- boolean onTouchEvent(MotionEvent event) : 處理事件的回調(diào)方法
- void setOnTouchListener(OnTouchListener l) : 設(shè)置事件監(jiān)聽器
- void setOnClickListener(OnClickListener l) : 設(shè)置點(diǎn)擊監(jiān)聽
- void setOnLongClickListener(OnLongClickListener l) : 設(shè)置長按監(jiān)聽
- void setOnCreateContextMenuListener(OnCreateContextMenuListener l):用于創(chuàng)建菜單
ViewGroup
- boolean dispatchTouchEvent(MotionEvent ev) : 分發(fā)事件
- boolean onInterceptTouchEvent(MotionEvent ev) : 攔截事件的回調(diào)方法