Android觸摸機(jī)制學(xué)習(xí)

關(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)方法
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容