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"
当我使用下面的方法在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"