android onTouchEvent處理機制總結
專案中涉及到scrollview巢狀scrollview,對於觸控事件攔截的處理不知道怎麼弄,找到一個關於觸控事件的詳細總結,解決了我的問題,記錄下
專案中總會用到一些觸控事件,每次使用都是百度各種資料,看各種大神的分析筆記。這次我自己總結下關於觸控事件的一些知識點。一來可以讓自己對觸控事件印象更加深刻,也給以後的專案做一個參考。最難理解的其實是onTouchEvent方法。
一. 概述
1.只有view,ViewGroup,Activity 具有事件分發和消費的功能。
2.Activity因為上最先接觸到觸控事件,因此Activity沒有事件攔截方法。即沒有dispatchTouchEvent方法。
3.對於不能新增子控制元件的view,不能對事件進行分發和攔截,它只有onTouchEvent事件。
二.三個方法
1.public boolean dispatchTouchEvent(MotionEvent ev)
當觸控事件發生的時候,首先會被當前的activity進行分發,即當前activity的dispatchTouchEvent方法會被執行。
這個時候,該方法有三種返回的情況:
return false: 表明事件不會被進行分發。事件會以冒泡的方式被傳遞給上層的view或activity的onTouchEvent方法進行消費掉。
return true:表明該時間已經被處理。事件會被當前view或activity的dispatchTouchEvent給消費掉。不會再進行傳遞,事件到此結束。
return super.dispatchTouchEvent(ev):表明該事件將會被分發。此時當前View的onIntercepterTouchEvent方法會捕獲該事件,判斷需不需要進行事件的攔截。
2.public boolean onInterceptTouchEvent(MotionEvent ev)
該方法使用者攔截被傳遞過來的事件,用於判斷被傳遞過來的事件是否需要被當前的view進行處理。
return false : 不對事件進行攔截,放行該事件。事件會被傳遞到當前view的子控制元件中,由子控制元件中的dispatchTouchEvent方法進行分發處理。
return true : 攔截該事件,將該事件交給當前view的onTouchEvent方法進行處理。
return super.inInterceptTouchEvent(ev):預設攔截方式,和return true一樣。該事件會被攔截,將該事件交給當前view的onTouchEvent方法進行處理。(這裡需要有一點說明,當有兩個view。A view中有一個B view.點選A.A中如果onInterceptTouchEvent()返回super.interceptTouchEvent(ev),則事件將會被A進行攔截,交給A的onTouchEvent()進行處理,如果點選的是B,A中如果onInterceptTouchEvent()返回super.interceptTouchEvent(ev),則事件將不會被攔截,會被分發到子控制元件中)
3.public boolean onTouchEvent(MotionEvent event)
當前的view把事件進行了攔截,則事件則會被傳遞到該方法中
return false:表明沒有消費該事件,事件將會以冒泡的方式一直被傳遞到上層的view或Activity中的onTouchEvent事件處理。如果最上層的view或Activity中的onTouchEvent還是返回false。則該事件將消失。接下來來的一系列事件都將會直接被上層的onTouchEvent方法捕獲
return true: 表明消費了該事件,事件到此結束。
return super.onTouchEvent(event):預設情況,和return false一樣。