最近項(xiàng)目中需要實(shí)現(xiàn)手勢(shì)上滑或者點(diǎn)擊滑出界面的效果,實(shí)現(xiàn)上是利用GestureDetector,然后在onFling中判斷,但遇到一個(gè)問(wèn)題:手勢(shì)上滑是針對(duì)整個(gè)布局的,但如果有對(duì)單獨(dú)的View設(shè)置點(diǎn)擊監(jiān)聽(tīng),在該View上的手勢(shì)上滑會(huì)失效。
如果這個(gè)View本身就是專(zhuān)門(mén)用于點(diǎn)擊的,那并沒(méi)有什么問(wèn)題,可惜的是,這個(gè)View的尺寸不大,所以要求擴(kuò)大點(diǎn)擊區(qū)域。
我們首先能想到的方法就是用一個(gè)容器將該View包起來(lái),類(lèi)似RelativeLayout,LinearLayout等,但這樣布局的層級(jí)就會(huì)再加多一層。
我們能否想到不用增加層級(jí)也能實(shí)現(xiàn)點(diǎn)擊區(qū)域擴(kuò)大的方法呢?
GestureDetector是Android提供的手勢(shì)操作類(lèi),它提供了單擊,雙擊,長(zhǎng)按等操作,并且會(huì)將這些事件傳給onTouch,因此我們可以利用這個(gè)來(lái)判斷觸發(fā)單擊事件的到底是哪個(gè)控件。
但是我們的問(wèn)題是擴(kuò)大點(diǎn)擊區(qū)域,而不是識(shí)別控件,因此需要知道用戶(hù)的點(diǎn)擊動(dòng)作到底是落在哪個(gè)區(qū)域。
所幸,MotionEvent提供了事件發(fā)生時(shí)候的坐標(biāo),這樣我們就能知道單擊時(shí)候的坐標(biāo),進(jìn)一步確定是否在指定的區(qū)域范圍內(nèi)。
MotionEvent是Android中觸控方面編碼的一個(gè)至關(guān)重要的類(lèi),它提供了用戶(hù)在屏幕上的觸控信息。我們可以通過(guò)MotionEvent獲取到觸控的事件類(lèi)型,觸控的坐標(biāo),并且現(xiàn)在已經(jīng)支持多點(diǎn)觸碰,還能進(jìn)一步獲取觸控的索引信息。
我們先上代碼:
延伸閱讀
學(xué)習(xí)是年輕人改變自己的最好方式