關(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ā)事件的時(shí)候,會先將事件分配給onTouch()進(jìn)行處理赎线,然后才分配給onTouchEvent()進(jìn)行處理廷没。
- 如果onTouch()對觸摸事件進(jìn)行了處理,并且返回true垂寥;那么颠黎,該觸摸事件就不會分配在分配給onTouchEvent()進(jìn)行處理了。只有當(dāng)onTouch()沒有處理滞项,或者處理了但返回false時(shí)狭归,才會分配給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)非常深刻了。
簡單來說就是傳遞的時(shí)候用父視圖往子視圖傳遞抗蠢,中間如果某一層視圖的onInterceptTouchEvent返回true举哟,那么就不會接著往下傳遞,然后開始響應(yīng)流程物蝙,從子視圖往父視圖傳遞炎滞,如果中間某一層消費(fèi)了這個(gè)事件,那么父視圖就不會接收到這個(gè)事件诬乞。
涉及到的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)方法