1. 程式人生 > >webview輪播圖與Android滑動衝突的解決辦法

webview輪播圖與Android滑動衝突的解決辦法

在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包。

如果有更好的處理方式 歡迎評論 留言。