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