ViewPager 禁止滑動背後的思考

2021-10-04 09:14:01 字數 1321 閱讀 5791

實現

在viewpager進行事件分發時,自己不攔截事件,將事件交給child消耗。當viewpager接收到事件時,自身的 dispatchtouchevent 一定會被呼叫,其結果受自身的 onintercepttouchevent 影響,在這裡我將 onintercepttouchevent -> return false,表示pager本身不攔截事件,事件會傳遞到child view,同時子view 的 dispatchtouchevent 會被呼叫,如果子view 的 dispatchtouchevent -> return false,可以對應子view onintercepttouchevent -> return true 攔截了事件,但是子view ontouchevent -> return false 並未處理事件這種情況,那麼pagers本身的 ontouchevent 即被呼叫,來消耗該事件。**如下:

public

class

noscrollvp

extends

viewpager

public

noscrollvp

(context context,attributeset attrs)

@override

public

boolean

onintercepttouchevent

(motionevent ev)

@override

public

boolean

ontouchevent

(motionevent ev)

}

pager原始碼
if

(mscrollstate == scroll_state_settling

&& math.

abs(mscroller.

getfinalx()

- mscroller.

getcurrx()

)> mcloseenough)

else

這是在pager的 onintercepttouchevent 方法中呼叫的,misbeingdragged 引數很關鍵,這是 onintercepttouchevent 方法的返回值。當我們在滑動結束 up 時候,如果滾動 ✖️偏移量的絕對距離 > mcloseenough,那麼pager會自己攔截掉事件,反之,則往下傳遞下去。其中mcloseenough = 2dp * 螢幕密度(160dpi螢幕,密度為1;120dpi螢幕,密度0.75,可依此類推)。當然pager的實際處理邏輯要複雜的多,例如在move的時候,是否需要攔截事件也做了一系列判斷,但是事件的分發思想都是一樣的。

禁止ViewPager左右滑動

有時候我們需要禁止掉viewpager的左右滑動,怎麼做呢,一般是自定viewpager。然後覆蓋viewpager的onintercepttouchevent motionevent arg0 方法和ontouchevent motionevent arg0 方法,這兩個方法的返回值都是boole...

禁止滑動的ViewPager

viewpager非常好用,但有時候需要在viewpager的裡面再嵌入viewpager,那麼就有衝突了,簡單粗暴的方法就是直接把乙個viewpager禁止滑動。注意 禁止滑動的同時不能禁止 setcurrentitem 方法。實現思路 重寫viewpager,覆蓋 ontouchevent 和 ...

禁止滑動的ViewPager

viewpager非常好用,但有時候需要在viewpager的裡面再嵌入viewpager,那麼就有衝突了,簡單粗暴的方法就是直接把乙個viewpager禁止滑動。注意 禁止滑動的同時不能禁止 setcurrentitem 方法。實現思路 重寫viewpager,覆蓋 ontouchevent 和 ...