序言: 由于產品的需求,有時候不得不在ScrollView中嵌套百度地圖(BaiduMap)。但是,嵌套之后會存在一些問題,兩個比較突出的問題是:1)ScrollView中事件處理與BaiduMap存在沖突。2)在BaiduMap隨著ScrollView拖動的時候,存在黑影問題。很多人遇到過這兩個問題,也比較棘手,所以希望百度能給出官方的解決方案。
解決辦法,狹路相逢勇者勝! 我們發現android給view提供了一個函數requestDisallowInterceptTouchEvent().它的定義是這樣的
Called when a child does not want this parent and its ancestors to intercept touch events with ViewGroup.onInterceptTouchEvent(MotionEvent). This parent should pass this call onto its parents. This parent must obey this request for the duration of the touch (that is, only clear the flag after this parent has received an up or a cancel.意思是說,當Child View 不想他的父View消費事件,而是傳遞給自己的時候,可以調用該函數, “你別動我事件消費,給我放那,我的,別動!”。
然后就有了如下代碼:
// 重寫onTouch()事件,在事件里通過requestDisallowInterceptTouchEvent(boolean)方法來設置父類的不可用,true表示父類的不可用 //解決地圖的touch事件和scrollView的touch事件沖突問題 mMapView.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if(event.getAction() == MotionEvent.ACTION_UP){ scrollView.requestDisallowInterceptTouchEvent(false); }else{ scrollView.requestDisallowInterceptTouchEvent(true); } return false; } });后來可愛的小伙伴一試才發現,這特么不行,博主是個坑,原因是我之前也是以為這樣做就可以了,但是其實不是, 如果你熟悉事件的傳遞順序,這時候你就會猜到,MapView是繼承至ViewGroup,事件一定是被MapView中的某個childView消費了才不會傳遞給MapView,所以我們要先拿到那個view,
View v = mMapView.getChildAt(0);//這個view實際上就是我們看見的繪制在表面的地圖圖層v.setOnTouchListener(new View.OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { if(event.getAction() == MotionEvent.ACTION_UP){ scrollView.requestDisallowInterceptTouchEvent(false); }else{ scrollView.requestDisallowInterceptTouchEvent(true); } return false; } });ok,這下博主不再是個坑了233。
第二個問題; 在BaiduMap隨著ScrollView拖動的時候,存在黑影問題 據我分析,由于百度地圖是用openGl繪制的,黑影可能是在拖動過程中不斷重繪才導致的。其實,百度工程師是不建議在ScrollView中使用百度地圖,除非你逼不得已。 這個如果非得用動態的百度map,那解決可能還得等百度工程師的佳音了。
新聞熱點
疑難解答