增加10S自动定位及指北模式

This commit is contained in:
qiji4215
2023-09-12 17:18:01 +08:00
parent 3caaa57e20
commit f40f1a1881
10 changed files with 130 additions and 48 deletions

View File

@@ -103,6 +103,11 @@ class Constant {
*/ */
var AUTO_LOCATION = false var AUTO_LOCATION = false
/**
* 地图视角是否锁定
*/
var MapRotateEnable = false
var IS_VIDEO_SPEED by kotlin.properties.Delegates.notNull<Boolean>() var IS_VIDEO_SPEED by kotlin.properties.Delegates.notNull<Boolean>()
const val message_status_late = "预约,待发送" const val message_status_late = "预约,待发送"

View File

@@ -325,12 +325,18 @@ class MainActivity : BaseActivity() {
7, RoundingMode.HALF_UP 7, RoundingMode.HALF_UP
) )
},${BigDecimal(it.latitude).setScale(7, RoundingMode.HALF_UP)}" },${BigDecimal(it.latitude).setScale(7, RoundingMode.HALF_UP)}"
viewModel.startAutoLocationTimer()
binding.mainActivityLocation.setImageResource(R.drawable.icon_location)
} }
} catch (e: Exception) { } catch (e: Exception) {
Log.e("qj", "异常 $e") Log.e("qj", "异常 $e")
} }
} }
viewModel.liveDataAutoLocation.observe(this){
if(it==true){
onClickLocation()
}
}
viewModel.liveDataSignMoreInfo.observe(this) { viewModel.liveDataSignMoreInfo.observe(this) {
val fragment = val fragment =
supportFragmentManager.findFragmentById(R.id.main_activity_sign_more_info_fragment) supportFragmentManager.findFragmentById(R.id.main_activity_sign_more_info_fragment)
@@ -1129,6 +1135,14 @@ class MainActivity : BaseActivity() {
rightController.navigate(R.id.NoteFragment) rightController.navigate(R.id.NoteFragment)
} }
/**
* 点击定位按钮
*/
fun onClickLocation() {
binding.mainActivityLocation.setImageResource(R.drawable.icon_location_north)
viewModel.onClickLocationButton()
}
/** /**
* 新增评测link * 新增评测link
*/ */

View File

@@ -51,7 +51,6 @@ import io.realm.RealmSet
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay import kotlinx.coroutines.delay
import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.flow import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
@@ -132,6 +131,11 @@ class MainViewModel @Inject constructor(
*/ */
val liveDataCenterPoint = MutableLiveData<MapPosition>() val liveDataCenterPoint = MutableLiveData<MapPosition>()
/**
* 是否自动定位
*/
val liveDataAutoLocation = MutableLiveData<Boolean>()
// var testPoint = GeoPoint(0, 0) // var testPoint = GeoPoint(0, 0)
//uuid标识用于记录轨迹组 //uuid标识用于记录轨迹组
@@ -209,6 +213,11 @@ class MainViewModel @Inject constructor(
private var timer: Timer? = null private var timer: Timer? = null
//自动定位
private var autoLocationTimer: Timer? = null
private var disAutoLocationTime: Long = 10000
private var disTime: Long = 1000 private var disTime: Long = 1000
private var currentMapZoomLevel: Int = 0 private var currentMapZoomLevel: Int = 0
@@ -227,6 +236,7 @@ class MainViewModel @Inject constructor(
when (e) { when (e) {
Map.SCALE_EVENT, Map.MOVE_EVENT, Map.ROTATE_EVENT -> liveDataCenterPoint.value = Map.SCALE_EVENT, Map.MOVE_EVENT, Map.ROTATE_EVENT -> liveDataCenterPoint.value =
mapPosition mapPosition
//Map.CLEAR_EVENT->startAutoLocationTimer()
} }
currentMapZoomLevel = mapController.mMapView.vtmMap.mapPosition.zoomLevel currentMapZoomLevel = mapController.mMapView.vtmMap.mapPosition.zoomLevel
@@ -652,12 +662,6 @@ class MainViewModel @Inject constructor(
) )
) )
} }
withContext(Dispatchers.Main) {
if (Constant.AUTO_LOCATION) {
mapController.mMapView.vtmMap.animator()
.animateTo(GeoPoint(location.latitude, location.longitude))
}
}
} }
} }
//显示轨迹图层 //显示轨迹图层
@@ -674,7 +678,7 @@ class MainViewModel @Inject constructor(
point.longitude, point.longitude,
point.latitude point.latitude
), ),
buffer = 2.0, catchAll = false, buffer = 2.4, catchAll = false,
) )
//增加道路线过滤原则 //增加道路线过滤原则
val filterResult = itemList.filter { val filterResult = itemList.filter {
@@ -887,6 +891,9 @@ class MainViewModel @Inject constructor(
* 点击我的位置,回到我的位置 * 点击我的位置,回到我的位置
*/ */
fun onClickLocationButton() { fun onClickLocationButton() {
val mapPosition: MapPosition = mapController.mMapView.vtmMap.getMapPosition()
mapPosition.setBearing(0f) // 锁定角度,自动将地图旋转到正北方向
mapController.mMapView.vtmMap.setMapPosition(mapPosition)
mapController.locationLayerHandler.animateToCurrentPosition() mapController.locationLayerHandler.animateToCurrentPosition()
} }
@@ -1390,6 +1397,27 @@ class MainViewModel @Inject constructor(
} }
/**
* 开启自动定位
*/
fun startAutoLocationTimer(){
if (autoLocationTimer != null) {
cancelAutoLocation()
}
autoLocationTimer = fixedRateTimer("", false, disAutoLocationTime, disAutoLocationTime) {
liveDataAutoLocation.postValue(true)
Log.e("qj","自动定位开始执行")
startAutoLocationTimer()
}
}
/**
* 结束自动定位
*/
fun cancelAutoLocation() {
autoLocationTimer?.cancel()
}
/** /**
* 开启测量工具 * 开启测量工具
*/ */

View File

@@ -10,6 +10,8 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.Toast import android.widget.Toast
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import androidx.core.view.forEach
import androidx.fragment.app.activityViewModels
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController import androidx.navigation.fragment.findNavController
import com.blankj.utilcode.util.ToastUtils import com.blankj.utilcode.util.ToastUtils
@@ -26,24 +28,28 @@ import com.navinfo.omqs.databinding.FragmentPersonalCenterBinding
import com.navinfo.omqs.db.ImportOMDBHelper import com.navinfo.omqs.db.ImportOMDBHelper
import com.navinfo.omqs.hilt.ImportOMDBHiltFactory import com.navinfo.omqs.hilt.ImportOMDBHiltFactory
import com.navinfo.omqs.tools.CoroutineUtils import com.navinfo.omqs.tools.CoroutineUtils
import com.navinfo.omqs.ui.fragment.BaseFragment import com.navinfo.omqs.ui.activity.map.MainViewModel
import com.navinfo.omqs.ui.activity.scan.QrCodeActivity import com.navinfo.omqs.ui.activity.scan.QrCodeActivity
import com.navinfo.omqs.ui.fragment.BaseFragment
import com.permissionx.guolindev.PermissionX import com.permissionx.guolindev.PermissionX
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import org.oscim.core.GeoPoint import org.oscim.core.GeoPoint
import org.oscim.core.MapPosition
import javax.inject.Inject import javax.inject.Inject
/** /**
* 个人中心 * 个人中心
*/ */
@AndroidEntryPoint @AndroidEntryPoint
class PersonalCenterFragment(private var indoorDataListener: ((Boolean) -> Unit?)? = null) : BaseFragment(), class PersonalCenterFragment(private var indoorDataListener: ((Boolean) -> Unit?)? = null) :
BaseFragment(),
FSAFActivityCallbacks { FSAFActivityCallbacks {
private var _binding: FragmentPersonalCenterBinding? = null private var _binding: FragmentPersonalCenterBinding? = null
private val binding get() = _binding!! private val binding get() = _binding!!
private val fileChooser by lazy { FileChooser(requireContext()) } private val fileChooser by lazy { FileChooser(requireContext()) }
private val viewModel by lazy { viewModels<PersonalCenterViewModel>().value } private val viewModel by lazy { viewModels<PersonalCenterViewModel>().value }
private val viewMainModel by activityViewModels<MainViewModel>()
@Inject @Inject
lateinit var importOMDBHiltFactory: ImportOMDBHiltFactory lateinit var importOMDBHiltFactory: ImportOMDBHiltFactory
@@ -66,6 +72,7 @@ class PersonalCenterFragment(private var indoorDataListener: ((Boolean) -> Unit?
when (it.itemId) { when (it.itemId) {
R.id.personal_center_menu_offline_map -> R.id.personal_center_menu_offline_map ->
findNavController().navigate(R.id.OfflineMapFragment) findNavController().navigate(R.id.OfflineMapFragment)
R.id.personal_center_menu_obtain_data -> { // 生成数据根据sqlite文件生成对应的zip文件 R.id.personal_center_menu_obtain_data -> { // 生成数据根据sqlite文件生成对应的zip文件
fileChooser.openChooseFileDialog(object : FileChooserCallback() { fileChooser.openChooseFileDialog(object : FileChooserCallback() {
override fun onCancel(reason: String) { override fun onCancel(reason: String) {
@@ -90,6 +97,7 @@ class PersonalCenterFragment(private var indoorDataListener: ((Boolean) -> Unit?
} }
}) })
} }
R.id.personal_center_menu_import_data -> { // 导入zip数据 R.id.personal_center_menu_import_data -> { // 导入zip数据
fileChooser.openChooseFileDialog(object : FileChooserCallback() { fileChooser.openChooseFileDialog(object : FileChooserCallback() {
override fun onCancel(reason: String) { override fun onCancel(reason: String) {
@@ -106,6 +114,7 @@ class PersonalCenterFragment(private var indoorDataListener: ((Boolean) -> Unit?
} }
}) })
} }
R.id.personal_center_menu_import_yuan_data -> { R.id.personal_center_menu_import_yuan_data -> {
// 用户选中导入数据,打开文件选择器,用户选择导入的数据文件目录 // 用户选中导入数据,打开文件选择器,用户选择导入的数据文件目录
fileChooser.openChooseFileDialog(object : FileChooserCallback() { fileChooser.openChooseFileDialog(object : FileChooserCallback() {
@@ -117,49 +126,59 @@ class PersonalCenterFragment(private var indoorDataListener: ((Boolean) -> Unit?
} }
}) })
} }
R.id.personal_center_menu_open_auto_location -> { R.id.personal_center_menu_open_auto_location -> {
Constant.AUTO_LOCATION = true Constant.AUTO_LOCATION = !Constant.AUTO_LOCATION
if (Constant.AUTO_LOCATION) {
it.title = "关闭自动定位"
viewMainModel.startAutoLocationTimer()
} else {
it.title = "开启10S自动定位"
viewMainModel.cancelAutoLocation()
}
} }
R.id.personal_center_menu_close_auto_location -> {
Constant.AUTO_LOCATION = false R.id.personal_center_menu_rotate_over_look -> {
niMapController.mMapView.vtmMap.eventLayer.enableTilt(Constant.MapRotateEnable)
niMapController.mMapView.vtmMap.eventLayer.enableRotation(Constant.MapRotateEnable)
Constant.MapRotateEnable = !Constant.MapRotateEnable
if (Constant.MapRotateEnable) {
val mapPosition: MapPosition =
niMapController.mMapView.vtmMap.getMapPosition()
mapPosition.setBearing(0f) // 锁定角度,自动将地图旋转到正北方向
niMapController.mMapView.vtmMap.setMapPosition(mapPosition)
it.title = "开启地图旋转及视角"
} else {
it.title = "锁定地图旋转及视角"
}
} }
R.id.personal_center_menu_test -> { R.id.personal_center_menu_test -> {
viewModel.readRealmData() viewModel.readRealmData()
//116.25017070328308 40.061730653134696 //116.25017070328308 40.061730653134696
// 定位到指定位置 // 定位到指定位置
niMapController.mMapView.vtmMap.animator() niMapController.mMapView.vtmMap.animator()
// .animateTo(GeoPoint( 40.05108004733645, 116.29187746293708 )) // .animateTo(GeoPoint( 40.05108004733645, 116.29187746293708 ))
.animateTo(GeoPoint(40.51850916836801,115.78801387178642)) .animateTo(GeoPoint(40.51850916836801, 115.78801387178642))
} }
R.id.personal_center_menu_open_all_layer -> { R.id.personal_center_menu_open_all_layer -> {
MapParamUtils.setDataLayerEnum(DataLayerEnum.SHOW_ALL_LAYERS) MapParamUtils.setDataLayerEnum(DataLayerEnum.SHOW_ALL_LAYERS)
niMapController.layerManagerHandler.updateOMDBVectorTileLayer() niMapController.layerManagerHandler.updateOMDBVectorTileLayer()
viewModel.realmOperateHelper.updateRealmDefaultInstance() viewModel.realmOperateHelper.updateRealmDefaultInstance()
} }
R.id.personal_center_menu_close_hide_layer -> { R.id.personal_center_menu_close_hide_layer -> {
MapParamUtils.setDataLayerEnum(DataLayerEnum.ONLY_ENABLE_LAYERS) MapParamUtils.setDataLayerEnum(DataLayerEnum.ONLY_ENABLE_LAYERS)
niMapController.layerManagerHandler.updateOMDBVectorTileLayer() niMapController.layerManagerHandler.updateOMDBVectorTileLayer()
viewModel.realmOperateHelper.updateRealmDefaultInstance() viewModel.realmOperateHelper.updateRealmDefaultInstance()
} }
// R.id.personal_center_menu_task_list -> {
// findNavController().navigate(R.id.TaskManagerFragment)
// }
// R.id.personal_center_menu_qs_record_list -> {
// findNavController().navigate(R.id.QsRecordListFragment)
// }
// R.id.personal_center_menu_layer_manager -> { // 图层管理
// findNavController().navigate(R.id.QsLayerManagerFragment)
// }
/* R.id.personal_center_menu_qs_record_list -> {
findNavController().navigate(R.id.QsRecordListFragment)
}
R.id.personal_center_menu_layer_manager -> { // 图层管理
findNavController().navigate(R.id.QsLayerManagerFragment)
}*/
R.id.personal_center_menu_scan_qr_code -> { R.id.personal_center_menu_scan_qr_code -> {
//跳转二维码扫描界面 //跳转二维码扫描界面
checkPermission() checkPermission()
} }
R.id.personal_center_menu_scan_indoor_data -> { R.id.personal_center_menu_scan_indoor_data -> {
indoorDataListener?.invoke(true) indoorDataListener?.invoke(true)
} }
@@ -171,6 +190,24 @@ class PersonalCenterFragment(private var indoorDataListener: ((Boolean) -> Unit?
ToastUtils.showShort(it) ToastUtils.showShort(it)
} }
fileChooser.setCallbacks(this@PersonalCenterFragment) fileChooser.setCallbacks(this@PersonalCenterFragment)
binding.root.menu.forEach {
when (it.itemId) {
R.id.personal_center_menu_open_auto_location -> {
if (Constant.AUTO_LOCATION) {
it.title = "关闭自动定位"
} else {
it.title = "开启10S自动定位"
}
}
R.id.personal_center_menu_rotate_over_look -> {
if (Constant.MapRotateEnable) {
it.title = "开启地图旋转及视角"
} else {
it.title = "锁定地图旋转及视角"
}
}
}
}
} }
private fun intentTOQRCode() { private fun intentTOQRCode() {
@@ -198,7 +235,7 @@ class PersonalCenterFragment(private var indoorDataListener: ((Boolean) -> Unit?
.request { allGranted, grantedList, deniedList -> .request { allGranted, grantedList, deniedList ->
if (allGranted) { if (allGranted) {
//所有权限已经授权 //所有权限已经授权
Toast.makeText(context,"授权成功",Toast.LENGTH_LONG).show() Toast.makeText(context, "授权成功", Toast.LENGTH_LONG).show()
intentTOQRCode() intentTOQRCode()
} else { } else {
Toast.makeText(context, "拒绝权限: $deniedList", Toast.LENGTH_LONG).show() Toast.makeText(context, "拒绝权限: $deniedList", Toast.LENGTH_LONG).show()

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

View File

@@ -284,8 +284,8 @@
android:id="@+id/main_activity_location" android:id="@+id/main_activity_location"
style="@style/zoom_btns_style" style="@style/zoom_btns_style"
android:layout_marginBottom="12dp" android:layout_marginBottom="12dp"
android:onClick="@{()->viewModel.onClickLocationButton()}" android:onClick="@{()->mainActivity.onClickLocation()}"
android:src="@drawable/icon_location" android:src="@drawable/icon_location_north"
app:layout_constraintBottom_toTopOf="@id/main_activity_map_update" app:layout_constraintBottom_toTopOf="@id/main_activity_map_update"
app:layout_constraintRight_toRightOf="@id/main_activity_map_update" /> app:layout_constraintRight_toRightOf="@id/main_activity_map_update" />

View File

@@ -41,7 +41,7 @@
android:layout_marginRight="5dp" android:layout_marginRight="5dp"
android:background="@color/transparent" android:background="@color/transparent"
android:src="@drawable/icon_delete" android:src="@drawable/icon_delete"
app:layout_constraintRight_toLeftOf="@id/note_bar_cancel" app:layout_constraintRight_toLeftOf="@id/note_bar_save"
app:layout_constraintTop_toTopOf="@id/note_bar_save" /> app:layout_constraintTop_toTopOf="@id/note_bar_save" />
<androidx.core.widget.NestedScrollView <androidx.core.widget.NestedScrollView

View File

@@ -36,26 +36,24 @@
android:visible="false" android:visible="false"
android:icon="@drawable/ic_baseline_sim_card_download_24" android:icon="@drawable/ic_baseline_sim_card_download_24"
android:title="备份数据" /> android:title="备份数据" />
<item
android:id="@+id/personal_center_menu_open_auto_location"
android:icon="@drawable/baseline_person_24"
android:visible="true"
android:title="开启10S自动定位" />
<item
android:id="@+id/personal_center_menu_rotate_over_look"
android:icon="@drawable/baseline_person_24"
android:visible="true"
android:title="锁定地图旋转及视角" />
<item <item
android:id="@+id/personal_center_menu_version" android:id="@+id/personal_center_menu_version"
android:icon="@drawable/ic_baseline_layers_24" android:icon="@drawable/ic_baseline_layers_24"
android:title="版本:ONE_23QE4_V1.5.0_20230904_A" /> android:title="版本23QE4_V1.5.0_20230904_A" />
</group> </group>
<group android:checkableBehavior="single"> <group android:checkableBehavior="single">
<item android:title="小标题"> <item android:title="小标题">
<menu> <menu>
<item
android:id="@+id/personal_center_menu_open_auto_location"
android:icon="@drawable/baseline_person_24"
android:visible="true"
android:title="开启自动定位" />
<item
android:id="@+id/personal_center_menu_close_auto_location"
android:icon="@drawable/baseline_person_24"
android:visible="true"
android:title="关闭自动定位" />
<item <item
android:id="@+id/personal_center_menu_open_all_layer" android:id="@+id/personal_center_menu_open_all_layer"
android:icon="@drawable/baseline_person_24" android:icon="@drawable/baseline_person_24"

View File

@@ -28,7 +28,7 @@ class LineHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler(
//高亮线绘制线 样式 //高亮线绘制线 样式
val defaultLineStyle = Style.builder() val defaultLineStyle = Style.builder()
.stippleColor(context.resources.getColor(R.color.draw_line_blue2_color)) .stippleColor(context.resources.getColor(R.color.draw_line_blue2_color))
.strokeWidth(10f) .strokeWidth(5f)
.fillColor(context.resources.getColor(R.color.teal_200)) .fillColor(context.resources.getColor(R.color.teal_200))
.fillAlpha(0.5f) .fillAlpha(0.5f)
.strokeColor(context.resources.getColor(R.color.teal_200)) .strokeColor(context.resources.getColor(R.color.teal_200))