序言: 由于产品的需求,有时候不得不在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,那解决可能还得等百度工程师的佳音了。
新闻热点
疑难解答