scrollview中嵌套高德地图,触摸冲突解决
今天做的一个页面,要在scrollview中嵌套高德地图,产生触摸冲突,拖动地图和scrollview的滑动事件冲突。
先说一下最终的解决方案。亲测可用。。。 1、自定义一个viewGroup,继承Relativelayout(或者别的layout)
重点是重写了onInterceptTouchEvent(MotionEvent ev)和onTouchEvent(MotionEvent event)
/**
*解决地图在主scrollview中滑动冲突的问题由于MapView被定义成final class,所以只能在容器中操作了
Created by 苏七 on 2016/8/3
*/public class MapContainer extends RelativeLayout {
private ScrollView scrollView;
public MapContainer(Context context) {
super(context);
}public MapContainer(Context context, AttributeSet attrs) {
super(context, attrs);
}public void setScrollView(ScrollView scrollView) {
this.scrollView = scrollView;
}@Override
public boolean onInterceptTouchEvent(MotionEvent ev) {
if (ev.getAction() == MotionEvent.ACTION_UP) {
scrollView.requestDisallowInterceptTouchEvent(false);
} else {
scrollView.requestDisallowInterceptTouchEvent(true);
}
return false;
}@Override
public boolean onTouchEvent(MotionEvent event) {
return true;
}
}
2、在布局文件中,用上边定义的父控件包裹住高德地图的com.amap.api.maps2d.MapView.当然最外边是咱们的scrollview。
3、在代码中设置一下要关联的Scrollview
scrollView = (ScrollView) findViewById(R.id.scrollview);
map_container = (MapContainer) findViewById(R.id.map_container);
map_container.setScrollView(scrollView);
上边三步做完后就可以完美解决问题。 【scrollview中嵌套高德地图,触摸冲突解决】 另附:网上其他方法,都不怎么好用,亲测的。真心的。
一、这个代码网上出现很多次,但真的不管用啊。假的
//重写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;
}
});
如果是ListView嵌套在ScrollView中,解决方法是一样的。
二、重写scrollview,计算布局MapView所在的矩形区域,在矩形区域的时候,屏蔽scrollview的触摸事件的传递。下边的代码,有作用,但是效果不是很好啊。有的时候能动,有的时候不能。
/**
* Created by 苏七 on 2016/8/3
*/
public class LocationScrollView extends ScrollView{
public LocationScrollView(Context context) {
super(context);
}
public LocationScrollView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}public LocationScrollView(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
}private Boolean mIfOnMap = false;
//是否点击到地图了@Override
public boolean onInterceptTouchEvent(MotionEvent ev)
{int x = (int) ev.getX();
int y = (int) ev.getY();
Rect rect = new Rect();
if (ServiceLocationActivity.mapView != null) {
ServiceLocationActivity.mapView.measure(0,0);
ServiceLocationActivity.mapView.getDrawingRect(rect);
}mIfOnMap = !rect.contains(x, y);
if (mIfOnMap) {
return false;
}else {
return super.onInterceptTouchEvent(ev);
}
}////得到view到 屏幕的距离
//public int[] getLocation(View v) {
//int[] loc = new int[4];
//int[] location = new int[2];
//v.getLocationOnScreen(location);
//loc[0] = location[0];
//loc[1] = location[1];
//int w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
//int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED);
//v.measure(w, h);
//
//loc[2] = v.getMeasuredWidth();
//loc[3] =v.getMeasuredHeight()+loc[1];
//底部距离 屏幕上边的 高
//
//int [] up_down=new int[2];
//up_down[0]=loc[1];
//上边距离屏幕的距离
//up_down[1]=loc[3];
// 底部距离屏幕的距离
////base = computeWH();
//return up_down;
//}}
推荐阅读
- 热闹中的孤独
- Shell-Bash变量与运算符
- JS中的各种宽高度定义及其应用
- 2021-02-17|2021-02-17 小儿按摩膻中穴-舒缓咳嗽
- 深入理解Go之generate
- 异地恋中,逐渐适应一个人到底意味着什么()
- 我眼中的佛系经纪人
- 《魔法科高中的劣等生》第26卷(Invasion篇)发售
- “成长”读书社群招募
- 2020-04-07vue中Axios的封装和API接口的管理