問題描述
需求是這樣的,viewpager內部嵌套多個不同的網頁,滑動切換顯示不同html5網頁,想法是好的,但是遇到了一些問題。其中html網頁中也會有一些類似viewpager的可橫向滑動控件,當你嘗試滑動html中的有滑動效果的控件時,發現整個外部viewpager都跟着滑動了,直接切換到另一個網頁,哈哈哈,好棒
解決辦法
解決辦法有三個,其中第一個辦法最苯,第二個還可以,但是略麻煩,第三個辦法最完美,目前沒發現什麼問題,等不及的可以直接看第三個方法
方法1
將屏幕分爲左中右三個區域,當滑動中間部分的時候禁掉外層viewpager的滑動,具體操作是在webview的ontouchevent中,通過判斷觸摸區域調用requestDisallowInterceptTouchEvent(true),當爲true的時候,觸摸事件就被webview攔截,不會傳向父控件,viewpager自然不會滑動了,當然這麼做,用戶使用起來的話會非常蛋疼,而且現在很多手機都有全面屏幕手勢操作,翻個頁還不小心退出應用了,這不是搞笑的嘛,這種方法極其不推薦使用,還不如不滑動翻頁,直接點tab了。
方法2
第二種方法是通過js和android之間通信,js獲取html網頁中可滑動控件的位置,然後傳給android,安卓還是在webview的ontouchevent事件中判斷觸摸的位置,如果觸摸在滑動控件上,就通過requestDisallowInterceptTouchEvent(true)攔截事件,viewpager就不能滑動了,聽上去效果是比上個方法好了一點,至少不用點着viewpager的邊緣才能滑動了,但是實際使用中還會有一些問題,比如頁面剛加載出來的1s之內,可能座標位置還沒返回,這時滑動html中的viewpager還是會整屏滑動的,而且工作量也有點太大了,還好最後沒采用這種辦法。
方法3
上面兩個方法說的都比較簡略,之前在網上搜索到的大部分是那兩種方法,第三種方法要詳細介紹一下了
- 首先明確我們的目的,我們是希望滑動html中的可滑動控件的時候不讓外層viewpager滾動,所以所有辦法的目的都在於明確viewpager的滑動禁用時機
- 那我們可不可以換個思路,一開始就禁用viewpager的滑動,轉而考慮viewpager的滑動啓用時機呢?
- 能想到這裏就離成功不遠了,可以這樣,當點擊到webview的時候,就直接禁用外層viewpager的滑動,這時滑動html中的可滑動控件時,就可以滑動了,而且外層viewpager也不會切換,因爲已經被禁用了嘛。
- 如果這是這樣寫,怎麼切換到其他網頁呢?也就是什麼時候,怎樣啓用外層viewpager的滑動呢?當然是在內層webview劃不動的時候了~
- 沒錯,就是webview,有一個方法叫
protected void onOverScrolled
當我們滾動屏幕內容到達內容邊界時,如果再滾動就會有一個發光效果,這些效果是如何實現的呢?沒錯,就和這個方法有關係了。重寫webview的這個方法,在裏面啓用viewpager的滾動就可以了,webview劃不動的時候,就是webview可以滾動的時候,這麼說是不是更清晰。