溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Androd處理屏幕滑動(dòng)的一些記錄

發(fā)布時(shí)間:2020-07-17 19:43:30 來(lái)源:網(wǎng)絡(luò) 閱讀:586 作者:sinmo 欄目:開(kāi)發(fā)技術(shù)

參考的一些博客地址:

http://blog.csdn.net/vansbelove/article/details/9013731

http://www.eoeandroid.com/thread-178659-1-1.html

http://www.jb51.net/article/35800.htm


scrollBy(int x, int y):將View偏移(x,y),x控制左右方向的偏移,y控制上下方向的偏移。例如:當(dāng)x>0,y=0時(shí),向右移動(dòng)x個(gè)像素。當(dāng)x<0,y=0時(shí),向左移動(dòng)x個(gè)像素。整個(gè)View的大小不會(huì)發(fā)生改變,超出部分會(huì)被擋住。

scrollTo(int x, int y):將View移動(dòng)到(x,y)坐標(biāo)處。整個(gè)View的大小不會(huì)發(fā)生改變,超出部分會(huì)被擋住。

Scroller類(lèi):主要用于控制滑動(dòng)過(guò)程,是滑動(dòng)更平滑,相比scrollTo方法不會(huì)顯得突兀。

VellocityTracker類(lèi):主要用于計(jì)算觸摸速率。用于判斷是快速滑動(dòng)還是慢滑。


onInterceptTouchEvent(MotionEvent ev):--觸發(fā)攔截觸摸事件

    定義于ViewGroup中的一個(gè)方法,用于攔截觸摸事件。此方法默認(rèn)返回false。

onTouchEvent(MotionEvent ev):--觸發(fā)觸摸事件

    定義于View中的一個(gè)方法,處理傳遞到View的手勢(shì)觸摸事件,手勢(shì)事件類(lèi)型包括ACTION_DOWN,ACTION_MOVE,ACTION_UP,ACTION_CANCEL.

    ViewGroup中的onTouchEvent方法默認(rèn)返回false。

    View中的onTouchEvent方法默認(rèn)返回true。

當(dāng)需要處理一些復(fù)雜的事件處理時(shí),可能需要根據(jù)情況重寫(xiě)這兩個(gè)方法來(lái)實(shí)現(xiàn)需求。


下面引入EOE里面一篇帖子的分析:

記錄onInterceptTouchEvent和onTouchEvent調(diào)用關(guān)系,即各種return true和return false的運(yùn)行情況。

return true和return false,代表的是是否消費(fèi)完該事件,也就是該事件是否會(huì)繼續(xù)傳遞給下層或者上層組件繼續(xù)處理。return true代表消費(fèi)完不會(huì)繼續(xù)傳遞,return false代表沒(méi)有消費(fèi)完將會(huì)繼續(xù)傳遞。

如果沒(méi)有onInterceptTouchEvent,只考慮onTouchEvent的話,比較容易分析和理解。假如有三層布局結(jié)構(gòu),linearLayout1,linearLayout2,textView,從前到后是包含的關(guān)系。那么下面分情況說(shuō)明。
1.如果它們的onTouchEvent都返回false的話,DOWN事件會(huì)自上而下(textView位于最上層)依次傳遞,最終都沒(méi)有消費(fèi)完此事件,都只會(huì)進(jìn)入onTouchEvent方法一次并且MotionEvent的action為MotionEvent.ACTION_DOWN,move和up等事件不會(huì)繼續(xù)處理。
2.如果textView的onTouchEvent返回true,表示textView消費(fèi)了此事件,不會(huì)傳給父組件linearLayout2和    linearLayout1了,并且還會(huì)繼續(xù)處理move和up等事件。
3.linearLayout2和linearLayout1的onTouchEvent返回true和上面的情況一樣,都不會(huì)繼續(xù)傳給父容器而且本身繼續(xù)處理move和up等事件。
OK,這種情況還是比較容易理解的。

下面加入onInterceptTouchEvent。
onInterceptTouchEvent只有ViewGroup才會(huì)有,用于在進(jìn)入自身onTouchEvent或者子組件onTouchEvent之前處理事件。注意onTouch是自上而下傳遞,而onInterceptTouch卻是由下而上傳遞的。來(lái)了一個(gè)DOWN事件,首先進(jìn)入的必然是最底層的viewGroup的onInterceptTouchEvent方法,然后根據(jù)return的值進(jìn)入自身或者子組件的onTouch事件,當(dāng)然如果子組件也是viewgroup的話,在進(jìn)入子組件的onTouch之前也會(huì)進(jìn)入子組件的onInterceptTouchEvent方法。
下面也分幾種情況介紹:
1.當(dāng)onInterceptTouchEvent返回false時(shí),表示沒(méi)有消費(fèi)完此事件,會(huì)繼續(xù)傳遞個(gè)子組件的onTouch繼續(xù)處理。注意這種情況不會(huì)就不會(huì)傳遞給這個(gè)ViewGroup自身的onTouch事件處理了。這和onTouch如果返回false,后續(xù)的move、up等事件都不會(huì)繼續(xù)處理了可以做同樣理解。
2.當(dāng)onInterceptTouchEvent返回true時(shí),表示消費(fèi)完此事件,或者說(shuō)將在此組件上消費(fèi)該事件。這種情況該事件會(huì)傳遞給ViewGroup自身的onTouch事件去處理,而不會(huì)傳遞給子組件的onTouch方法了。
由此可以總結(jié),onInterceptTouchEvent返回值只是決定了是要把事件傳遞給自身的onTouch事件還是傳遞給子組件的onTouch事件。返回false表示沒(méi)有消費(fèi)完將傳遞個(gè)子組件的onTouch方法,返回true表示自身消費(fèi)此事件,將傳遞給自身的onTouch方法而不會(huì)傳遞給子組件的onTouch方法了。


附件里面是示例參照別人的示例demo,基本就是自己照著敲一遍熟悉熟悉。

附件:http://down.51cto.com/data/2364513
向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI