安卓viewpager嵌套webview的滑動衝突解決

問題描述

需求是這樣的,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可以滾動的時候,這麼說是不是更清晰。

好了,上代碼

這是代碼

代碼有一個小問題,已經有人在issue中提出並修復了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章