Google 地图 API 手势无效(缩放-旋转...)

Google Maps API gestures not working (zoom-rotate...)

编辑:我发现了我的问题,请参阅下面的回答

原文post:
我正在创建一个包含地图的 activity,但我无法添加缩放和其他手势功能。我可以双击放大,我可以通过

添加+/-符号来放大
googleMap.getUiSettings().setAllGesturesEnabled(true);

这是我的代码:

Activity的xml (tracking_order.xml)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal">

<fragment
    android:id="@+id/mapFragment"
    class="com.example.OrderMapFragment"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="3" />

<FrameLayout
    android:id="@+id/clientsFragment"
    android:layout_width="0dp"
    android:layout_height="match_parent"
    android:layout_weight="1" />

OrderMapFragment.java

public class OrderMapFragment extends SupportMapFragment implements OnMapReadyCallback, GoogleMap.OnMarkerClickListener {

    public static OrderMapFragment newInstance() {
        OrderMapFragment fragment = new OrderMapFragment();
        Bundle args = new Bundle();
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        ((OrderMapFragment.OnOrderMarkerClickListener) context).setMapObject(this);
        getMapAsync(this);
    }

    @Override
    public void onMapReady(final GoogleMap googleMap) {
        googleMap.getUiSettings().setZoomControlsEnabled(true); //this one is working
        googleMap.getUiSettings().setZoomGesturesEnabled(true); //not working

        googleMap.getUiSettings().setAllGesturesEnabled(true);  //not working
        // ... (removed code used to fetch markers data)
    }

    @Override
    public boolean onMarkerClick(Marker marker) {
        return listener.filterListByMarker(marker);
    }

    public interface OnOrderMarkerClickListener {
        /**
         * Action to be taken when a marker has been clicked
         *
         * @param marker
         * @return true if the listener has consumed the event (i.e., the default behavior should not occur);
         * false otherwise (i.e., the default behavior should occur).
         * The default behavior is for the camera to move to the marker and an info window to appear.
         */
        boolean filterListByMarker(Marker marker); //the class that implements this doesn't do anything for now it just returns false
    }
}

谢谢

评论这一行

googleMap.getUiSettings().setZoomGesturesEnabled(true); //not working

现在你试试吧,它会成功的。如果您需要任何特定或少数手势方式,请单独启用,否则如果您需要全部,只需调用此行

googleMap.getUiSettings().setAllGesturesEnabled(true);

我终于找到问题了:
包含 mapFragment 的 activity 正在扩展自定义 class。 class 覆盖了以下方法:

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    if (ev.getAction() == MotionEvent.ACTION_UP) {
        return super.dispatchTouchEvent(ev);
    }
    if (ev.getPointerCount() > 1)  //here was the problem
        return true;
    return super.dispatchTouchEvent(ev);
}

所以我创建了一个方法并将其更改为:

@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
    if (ev.getAction() == MotionEvent.ACTION_UP) {
        return super.dispatchTouchEvent(ev);
    }
    if (ev.getPointerCount() > 1 && !enableMultiTouch())
        return true;
    return super.dispatchTouchEvent(ev);
}

protected boolean enableMultiTouch(){
    return false;  //and override it to true in my activity
}

希望对大家有所帮助:)

在我的例子中,它有助于设置 map.getUiSettings().setAllGesturesEnabled(true); 并覆盖生命周期方法,如 MapView documentation:

中所述
    @Override
    public void onCreate(Bundle bundle) {
        super.onCreate(bundle);
        mapView.onCreate(bundle);
    }

    @Override
    public void onSaveInstanceState()
    {
        super.onSaveInstanceState();
        mapView.onSaveInstanceState();
    }

    @Override
    public void onPause()
    {
        super.onPause();
        mapView.onPause();
    }

    @Override
    public void onStart()
    {
        super.onStart();
        mapView.onStart();
    }

    @Override
    public void onResume()
    {
        super.onResume();
        mapView.onResume();
    }

    @Override
    public void onLowMemory()
    {
        super.onLowMemory();
        mapView.onLowMemory();
    }

    @Override
    public void onDestroy()
    {
        super.onDestroy();
        mapView.onDestroy();
    }

    @Override
    public void onStop()
    {
        super.onStop();
        mapView.onStop();
    }