Android 截取两个手指触摸地图视图内部的ViewPager

Android 截取两个手指触摸地图视图内部的ViewPager,android,android-fragments,android-viewpager,android-mapview,Android,Android Fragments,Android Viewpager,Android Mapview,因此,我试图捕捉一个用户应该执行的两个手指手势,以便在地图视图中平移 给定的地图视图位于片段内,该片段是查看页面的页面 预期的行为是ViewPager的默认行为,因此无论用户面对的是哪一页,用一个手指滑动都应该更改页面 唯一的例外是,如果显示包含MapView的片段,用户应该能够用两个手指(并且仅用两个手指)平移地图 到目前为止,我所尝试的: 简单XML: <package.MapRelativeLayout> <com.google.android.gms.maps.

因此,我试图捕捉一个用户应该执行的两个手指手势,以便在地图视图中平移

给定的
地图视图
位于
片段
内,该片段是
查看页面
的页面

预期的行为是ViewPager的默认行为,因此无论用户面对的是哪一页,用一个手指滑动都应该更改页面

唯一的例外是,如果显示包含
MapView
的片段,用户应该能够用两个手指(并且仅用两个手指)平移地图

到目前为止,我所尝试的:

简单XML:

<package.MapRelativeLayout>
    <com.google.android.gms.maps.MapView/>
</package.MapRelativeLayout>
我将
地图视图
包装在自定义
视图组
中,覆盖
onInterceptTouchEvent
,将
运动事件
传递给自定义
手势监听器
,该监听器在
onScroll
中侦听检测到的指针数量,否则返回true/false,但它不起作用


有什么方法可以做到这一点吗?

我也遇到了同样的问题,我可以通过执行以下操作来解决它

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMapOptions;
import com.google.android.gms.maps.MapView;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.UiSettings;

public class EnhanceMapView extends MapView implements OnMapReadyCallback{

    private boolean isScrollable;
    private OnMapReadyCallback onMapReadyCallback;
    private UiSettings uiSettings;

    public EnhanceMapView(Context context) {
        super(context);
    }

    public EnhanceMapView(Context context, AttributeSet attributeSet) {
        super(context, attributeSet);
    }

    public EnhanceMapView(Context context, AttributeSet attributeSet, int i) {
        super(context, attributeSet, i);
    }

    public EnhanceMapView(Context context, GoogleMapOptions googleMapOptions) {
        super(context, googleMapOptions);
    }

    @Override
    public void getMapAsync(OnMapReadyCallback onMapReadyCallback) {
        this.onMapReadyCallback = onMapReadyCallback;
        super.getMapAsync(EnhanceMapView.this);
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        uiSettings = googleMap.getUiSettings();
        isScrollable = false;
        uiSettings.setScrollGesturesEnabled(false);
        onMapReadyCallback.onMapReady(googleMap);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if(isScrollable == uiSettings.isScrollGesturesEnabled()){
            switch (ev.getAction() & MotionEvent.ACTION_MASK) {
                case MotionEvent.ACTION_POINTER_DOWN:
                    isScrollable = true;
                    uiSettings.setScrollGesturesEnabled(true);
                    break;
                case MotionEvent.ACTION_POINTER_UP:
                    isScrollable = false;
                    uiSettings.setScrollGesturesEnabled(false);
                    break;
            }
        }
        return super.dispatchTouchEvent(ev);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return !uiSettings.isScrollGesturesEnabled() && super.onInterceptTouchEvent(ev);
    }
}

创建类后,您可以在调色板/ Project

中选择布局编辑器,您可以考虑使用ButoMavigaseVIEW代替VIEWPER。然后仅在单击导航时处理页面切换。这样,对于地图,您可以保留地图的触摸功能(拖动以平移,双击以旋转)。
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;

import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.GoogleMapOptions;
import com.google.android.gms.maps.MapView;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.UiSettings;

public class EnhanceMapView extends MapView implements OnMapReadyCallback{

    private boolean isScrollable;
    private OnMapReadyCallback onMapReadyCallback;
    private UiSettings uiSettings;

    public EnhanceMapView(Context context) {
        super(context);
    }

    public EnhanceMapView(Context context, AttributeSet attributeSet) {
        super(context, attributeSet);
    }

    public EnhanceMapView(Context context, AttributeSet attributeSet, int i) {
        super(context, attributeSet, i);
    }

    public EnhanceMapView(Context context, GoogleMapOptions googleMapOptions) {
        super(context, googleMapOptions);
    }

    @Override
    public void getMapAsync(OnMapReadyCallback onMapReadyCallback) {
        this.onMapReadyCallback = onMapReadyCallback;
        super.getMapAsync(EnhanceMapView.this);
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        uiSettings = googleMap.getUiSettings();
        isScrollable = false;
        uiSettings.setScrollGesturesEnabled(false);
        onMapReadyCallback.onMapReady(googleMap);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
        if(isScrollable == uiSettings.isScrollGesturesEnabled()){
            switch (ev.getAction() & MotionEvent.ACTION_MASK) {
                case MotionEvent.ACTION_POINTER_DOWN:
                    isScrollable = true;
                    uiSettings.setScrollGesturesEnabled(true);
                    break;
                case MotionEvent.ACTION_POINTER_UP:
                    isScrollable = false;
                    uiSettings.setScrollGesturesEnabled(false);
                    break;
            }
        }
        return super.dispatchTouchEvent(ev);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        return !uiSettings.isScrollGesturesEnabled() && super.onInterceptTouchEvent(ev);
    }
}