在工作中遇到了一種情況,在可以橫向滑動的viewPager其中的一項中嵌套着一個webView,並且在這個webView中也有可以橫向滑動的的類似viewPager的組件,因為webView其中的H5組件我們是無法控制的,因此便會發生滑動沖突,現象則是webView中的H5組件無法滑動。比如下圖

經過筆者的一陣搜索,借鑒了Viewpager與webview滑動沖突的解決方案一文的解決方案,並在其基礎上改進了一下,使之處理起來更加簡單一些。
思路
首先我們先確定滑動沖突是事件分發機制的事情。解決辦法需要在需要的地方進行事件的攔截和分發可以使用下面的方法
wb.requestDisallowInterceptTouchEvent(true);
當為true的時候則說明父控件(也就是viewPager)不攔截事件,點擊事件由子控件(也就是webView)來處理,反之為false的時候,父控件則攔截點擊事件,子控件無法響應點擊事件。
1.交互
此時我們需要Android原生和JS交互一下,來通知我們什么時候攔截事件,什么時候不攔截事件。首先我們要先和H5的小伙伴商量好方法名和參數,在H5中可以監聽到是否點擊了或者滑動了輪播圖,H5的小伙伴可以在監聽值判斷,如果點擊或者滑動了H5中的輪播圖則,調用Android原生的方法參數為true,Android端則進行事件的攔截,反之沒有點擊或者滑動的時候,則調用方法參數為false。
交互方法:
@JavascriptInterface public void disPatchTouchViewPager(boolean param) { isIntercept = param; }
如果有不懂Android原生與H5交互方法的可以看我的一篇文章<Android中webveiw與H5進行交互>
2.攔截
此時我們拿到參數以后就可以進行事件的攔截
wb.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { wb.requestDisallowInterceptTouchEvent(isIntercept); return false; } });
這樣就可以對事件分發進行處理,不過此處需要注意的是攔截事件的方法 wb.requestDisallowInterceptTouchEvent(isIntercept);必須要寫在Touch事件中才可以生效,寫在webview初始化的地方是不可以的。
ok,筆者認為這種方法比H5端去測量輪播圖的位置,然后告訴Android端,Android端再去判斷位置去攔截事件要簡單一些。當然這只是個人想法,還是要感謝借鑒文章的大佬,畢竟是站在了巨人的肩膀上。