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);

上边三步做完后就可以完美解决问题。




另附:网上其他方法,都不怎么好用,亲测的。真心的。 
一、这个代码网上出现很多次,但真的不管用啊。假的

//       重写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;
//    }

    }





你可能感兴趣的:(Android开发)