實現
在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 和 ...