Google 地图动画在 android 中 运行 时如何禁用触摸检测

How to disable touch detection while Google Map animation is running in android

当我使用下面的方法在google地图上执行动画时,如果我们在动画执行期间触摸屏幕,动画就会结束。

googleMap.animateCamera(
                        CameraUpdateFactory.newCameraPosition(cameraPosition1),400,
                        new CancelableCallback() {

                              @Override
                              public void onFinish() {
                              }

                              @Override
                              public void onCancel() {
                              }
        });

我试过使用下面的代码禁用触摸检测

mapFragment.getView().setEnabled(false); 

googleMap.getUiSettings().setAllGesturesEnabled(false);

但尽管有上述行,应用程序仍检测到触摸。 如何正确禁用触摸?

不要使用 setEnabled(false) 作为视图,而是使用 setClickable(false)

mapFragment.getView().setClickable(false);

这应该有效。

编辑

显然这是在此处提交的错误

https://code.google.com/p/gmaps-api-issues/issues/detail?id=5114

作为解决方法,您可以部署一个透明层,它将接收触摸事件而不是 MapFragment

目前不可用(但已请求 here)。

现在,您可以在 MapFragment 之上放置一个视图,并为其添加始终 returns true 的 OnTouchListener。

只要您希望阻止 MapFragment 上的触摸事件,就可以创建此视图 "visible"。否则,您将其可见性设置为 "gone".

以下是我在以编程方式添加地图时的做法:

<FrameLayout
    android:id="@+id/mapFragmentContainerFl"
    android:layout_width="match_parent"
    android:layout_height="150dp"
    android:layout_marginEnd="@dimen/screen_horizontal_margin"
    android:layout_marginStart="@dimen/screen_horizontal_margin"
    android:layout_marginTop="12dp"
    app:layout_constraintTop_toBottomOf="@+id/locationDescriptionTv"
    android:background="#10000000">

    <View
        android:id="@+id/mapClickListenerView"
        android:layout_width="match_parent"
        android:layout_height="150dp"
        android:clickable="true"
        android:focusable="true"
        android:translationZ="12dp"/>

</FrameLayout>

private fun initMapFragment() {
    val mapOptions = GoogleMapOptions().apply {
        zoomControlsEnabled(false)
        zoomGesturesEnabled(false)
        ambientEnabled(false)
        rotateGesturesEnabled(false)
        tiltGesturesEnabled(false)
        scrollGesturesEnabled(false)
        compassEnabled(false)
    }
    val mapFragment = SupportMapFragment.newInstance(mapOptions)
    childFragmentManager.beginTransaction()
            .add(R.id.mapFragmentContainerFl, mapFragment)
            .commit()
    mapFragment.getMapAsync(::onMapReady)
}
 mMap.setOnCameraMoveStartedListener(new GoogleMap.OnCameraMoveStartedListener() {
        @Override
        public void onCameraMoveStarted(int reason) {
            mCameraMoveReason = reason;
            if (mCameraMoveReason != GoogleMap.OnCameraMoveStartedListener.REASON_GESTURE)
                mMap.getUiSettings().setAllGesturesEnabled(false);
        }
    });



@Override
public void onCameraIdle() {
    mMap.getUiSettings().setAllGesturesEnabled(true);
    }


  @Override
public void onMapReady(GoogleMap googleMap) {
    mMap = googleMap;
}

mMap.getUiSettings().setAllGesturesEnabled() 执行 enable/disable 触摸手势。希望这有帮助,

正确的做法是:

在您的 xml 文件中,像这样在 map fragment 中添加相应的属性:

<fragment
            android:id="@+id/map"
            android:name="com.google.android.gms.maps.SupportMapFragment"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            map:uiCompass="false"
            map:uiRotateGestures="false"
            map:uiScrollGestures="false"
            map:uiTiltGestures="false"
            map:uiZoomControls="false"
            map:uiZoomGestures="false"
            tools:context=".rider.ui.fragment.RiderMapsFragment" />

并在您的根布局中添加以下行:

xmlns:map="http://schemas.android.com/apk/res-auto"