因为项目需要,需要在googleMap上面自定义指南针,实现指南针实时根据地图方位变化转动,点击指南针方位回正两个功能。
可以参考高德地图导航开始后地图旋转的指南针效果。
因为手机像素过高的原因,导致我没法一次上传上来,这个是旋转效果。

定位回正

关于GoogleMap的引用可以先看这篇《Android使用GoogleMap实现定位及定位回正》
我们新建一个activity,修改activity_google_maps.xml(compass的图标可以去阿里巴巴图标库等去找即可):
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.stationdm.kawasaki.GoogleMapsActivity">
<fragment
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="com.google.android.gms.maps.SupportMapFragment"
android:id="@+id/map"/>
<com.google.android.material.floatingactionbutton.FloatingActionButton
android:id="@+id/fab_compass_location"
android:layout_width="48dp"
android:layout_height="48dp"
android:src="@drawable/ic_map_compass_icon"
app:fabCustomSize="48dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginEnd="16dp"
android:layout_marginTop="16dp" />
androidx.constraintlayout.widget.ConstraintLayout>
修改GoogleMapsActivity:
private var map:GoogleMap? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityGoogleMapsBinding.inflate(layoutInflater)
setContentView(binding.root)
val mapFragment : SupportMapFragment = supportFragmentManager.findFragmentById(R.id.map) as SupportMapFragment
mapFragment.getMapAsync(this)
//指南针回正
binding.fabCompassLocation.setOnSingleClickListener {
map?.cameraPosition?.target?.let {
val cameraPosition = CameraPosition.Builder()
.target(LatLng(it.latitude, it.longitude))
.zoom(map!!.cameraPosition.zoom)
.bearing(0f)
.tilt(map!!.cameraPosition.tilt)
.build()
map!!.animateCamera(CameraUpdateFactory.newCameraPosition(cameraPosition))
}
}
}
@SuppressLint("MissingPermission")
override fun onMapReady(googleMap: GoogleMap) {
map = googleMap
googleMap.mapType = GoogleMap.MAP_TYPE_HYBRID
//关于定位权限在我这里就不做赘述了,这里假设定位以及成功了
map?.setCompassEnabled(false)//这里可以打开看一下我们实际效果和自带的是否有差异
//添加相机移动的监听和空闲监听用来作为控制指南针监听的开关
map?.setOnCameraMoveStartedListener(this)
map?.setOnCameraIdleListener(this)
//页面继承方法
}
override fun onCameraMoveStarted(p0: Int) {
when (p0) {
GoogleMap.OnCameraMoveStartedListener.REASON_GESTURE -> {//手势引起的地图移动
openRotation(true)
}
}
}
override fun onCameraIdle() {
openRotation(false)
}
//是否开启旋转
private fun openRotation(isOpen: Boolean) {
if (isOpen) {
job?.cancel()
job = lifecycleScope.launch {
delay(100) //测试发现延迟0.1ms效果比较流畅
map?.cameraPosition?.bearing?.let {
binding.fabCompassLocation.rotation = -it
openRotation(isOpen)
}
}
}
}
本篇到此就结束了,有问题欢迎批评指教,觉得不错的也请点个赞,谢谢