webview輪播圖與Android滑動衝突的解決辦法
阿新 • • 發佈:2018-12-22
在Android中我們經常需要左右滑動,其中內嵌的web頁面也有滑動動作。輪播圖舉例:需要左右翻頁時,會觸發Android中的ViewPager導致翻頁到另一個頁面輪播圖翻頁翻不動,或失效。但是由於安卓是父,而Web是子。在Web中不論你做什麼處理,都管不了父視窗的事情,所以需要Android做處理,而前端最好能給Android傳遞輪播圖的位置,讓這塊區域的viewPager失效。
上程式碼:
前端用的Vux框架,@on-get-height會獲取當前輪播圖的高度。
<template> <div @click="navigation"> <group-title></group-title> <swiper id="swiper" @on-get-height="getByheight" :show-dots="true" style="width:100%;margin:0 auto;" :aspect-ratio="400/800" loop auto :list="demo07_list" :index="demo07_index" @on-index-change="demo07_onIndexChange" ></swiper> <!--<p>current index: {{demo07_index}}</p>--> </div> </template> //掛載進Window全域性中,給Adroid呼叫, window.downState=function(msg){ android.getPagerDesc(msg) } export default { name:'pet_home', data(){ return{ demo07_list:[{img: '../../../static/lunbotu1.png',title: ''}, //輪播圖 {img: '../../../static/img1.png',title: ''}, {img: '../../../static/lunbotu1.png',title: ''}], demo07_index: 0,//輪播圖Index角標 swiperItemIndex: 1, Slide:'', } }, methods: { demo07_onIndexChange (index) { this.demo07_index = index }, getByheight(res){//獲取輪播圖寬高 // var swiperWidth = document.getElementById("swiper").clientWidth+"px" var swiperHeight = res this.Slide=swiperHeight }, }, watch:{ //因為高度生命週期的問題,我們必須要在獲取到高度並賦值給Data變數,在傳遞給Android Slide(value){//監聽Slide的值變動,不為空時呼叫downState推個Android if(value!=""){ // console.log(value) downState(value) } }, }, }
Android程式碼:
這個的意思就是,我要讓區域內距離頂部大於69px,小於輪播圖高度的區域內的viewPager滑動失效,不在監聽這裡的滑動效果。
注:因為我頭部距離頂部是固定的70px ,如果不是固定,則需要獲取他的高度,這個也借鑑了別人的處理方式,只是把這個地方簡化了一點。大致這樣輪播圖的衝突就沒有了。
webView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { //獲取y軸座標 float y = event.getRawY(); switch (event.getAction()) { case MotionEvent.ACTION_DOWN: //如果觸控點的座標在輪播區域內,則由webview來處理事件,否則由viewpager來處理 if (y > 69 && y < (69 + Integer.valueOf(height.split("px")[0]))) { webView.requestDisallowInterceptTouchEvent(true); }else{ webView.requestDisallowInterceptTouchEvent(false); } break; case MotionEvent.ACTION_UP: break; case MotionEvent.ACTION_MOVE: break; } return false; } });
本來開始想的處理方案是:看用java能不能獲取到元件Dom節點,直接讓Dom節點失效viewpager。可惜沒找到jar包。
如果有更好的處理方式 歡迎評論 留言。