diff --git a/app/src/main/java/com/navinfo/omqs/Constant.kt b/app/src/main/java/com/navinfo/omqs/Constant.kt index a3b1c92f..11424dff 100644 --- a/app/src/main/java/com/navinfo/omqs/Constant.kt +++ b/app/src/main/java/com/navinfo/omqs/Constant.kt @@ -103,6 +103,11 @@ class Constant { */ var AUTO_LOCATION = false + /** + * 地图视角是否锁定 + */ + var MapRotateEnable = false + var IS_VIDEO_SPEED by kotlin.properties.Delegates.notNull() const val message_status_late = "预约,待发送" diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt index b6213b70..1b1b8038 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt @@ -325,12 +325,18 @@ class MainActivity : BaseActivity() { 7, RoundingMode.HALF_UP ) },${BigDecimal(it.latitude).setScale(7, RoundingMode.HALF_UP)}" + viewModel.startAutoLocationTimer() + binding.mainActivityLocation.setImageResource(R.drawable.icon_location) } } catch (e: Exception) { Log.e("qj", "异常 $e") } } - + viewModel.liveDataAutoLocation.observe(this){ + if(it==true){ + onClickLocation() + } + } viewModel.liveDataSignMoreInfo.observe(this) { val fragment = supportFragmentManager.findFragmentById(R.id.main_activity_sign_more_info_fragment) @@ -1129,6 +1135,14 @@ class MainActivity : BaseActivity() { rightController.navigate(R.id.NoteFragment) } + /** + * 点击定位按钮 + */ + fun onClickLocation() { + binding.mainActivityLocation.setImageResource(R.drawable.icon_location_north) + viewModel.onClickLocationButton() + } + /** * 新增评测link */ diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt index 384e994f..0b93dcc6 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt @@ -51,7 +51,6 @@ import io.realm.RealmSet import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay import kotlinx.coroutines.flow.Flow -import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.flow import kotlinx.coroutines.launch @@ -132,6 +131,11 @@ class MainViewModel @Inject constructor( */ val liveDataCenterPoint = MutableLiveData() + /** + * 是否自动定位 + */ + val liveDataAutoLocation = MutableLiveData() + // var testPoint = GeoPoint(0, 0) //uuid标识,用于记录轨迹组 @@ -209,6 +213,11 @@ class MainViewModel @Inject constructor( private var timer: Timer? = null + //自动定位 + private var autoLocationTimer: Timer? = null + + private var disAutoLocationTime: Long = 10000 + private var disTime: Long = 1000 private var currentMapZoomLevel: Int = 0 @@ -227,6 +236,7 @@ class MainViewModel @Inject constructor( when (e) { Map.SCALE_EVENT, Map.MOVE_EVENT, Map.ROTATE_EVENT -> liveDataCenterPoint.value = mapPosition + //Map.CLEAR_EVENT->startAutoLocationTimer() } 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.latitude ), - buffer = 2.0, catchAll = false, + buffer = 2.4, catchAll = false, ) //增加道路线过滤原则 val filterResult = itemList.filter { @@ -887,6 +891,9 @@ class MainViewModel @Inject constructor( * 点击我的位置,回到我的位置 */ fun onClickLocationButton() { + val mapPosition: MapPosition = mapController.mMapView.vtmMap.getMapPosition() + mapPosition.setBearing(0f) // 锁定角度,自动将地图旋转到正北方向 + mapController.mMapView.vtmMap.setMapPosition(mapPosition) 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() + } + /** * 开启测量工具 */ diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt index 90fa5f37..d5ae7409 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterFragment.kt @@ -10,6 +10,8 @@ import android.view.View import android.view.ViewGroup import android.widget.Toast import androidx.annotation.RequiresApi +import androidx.core.view.forEach +import androidx.fragment.app.activityViewModels import androidx.fragment.app.viewModels import androidx.navigation.fragment.findNavController 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.hilt.ImportOMDBHiltFactory 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.fragment.BaseFragment import com.permissionx.guolindev.PermissionX import dagger.hilt.android.AndroidEntryPoint import org.oscim.core.GeoPoint +import org.oscim.core.MapPosition import javax.inject.Inject /** * 个人中心 */ @AndroidEntryPoint -class PersonalCenterFragment(private var indoorDataListener: ((Boolean) -> Unit?)? = null) : BaseFragment(), +class PersonalCenterFragment(private var indoorDataListener: ((Boolean) -> Unit?)? = null) : + BaseFragment(), FSAFActivityCallbacks { private var _binding: FragmentPersonalCenterBinding? = null private val binding get() = _binding!! private val fileChooser by lazy { FileChooser(requireContext()) } private val viewModel by lazy { viewModels().value } + private val viewMainModel by activityViewModels() @Inject lateinit var importOMDBHiltFactory: ImportOMDBHiltFactory @@ -66,6 +72,7 @@ class PersonalCenterFragment(private var indoorDataListener: ((Boolean) -> Unit? when (it.itemId) { R.id.personal_center_menu_offline_map -> findNavController().navigate(R.id.OfflineMapFragment) + R.id.personal_center_menu_obtain_data -> { // 生成数据,根据sqlite文件生成对应的zip文件 fileChooser.openChooseFileDialog(object : FileChooserCallback() { override fun onCancel(reason: String) { @@ -90,6 +97,7 @@ class PersonalCenterFragment(private var indoorDataListener: ((Boolean) -> Unit? } }) } + R.id.personal_center_menu_import_data -> { // 导入zip数据 fileChooser.openChooseFileDialog(object : FileChooserCallback() { override fun onCancel(reason: String) { @@ -106,6 +114,7 @@ class PersonalCenterFragment(private var indoorDataListener: ((Boolean) -> Unit? } }) } + R.id.personal_center_menu_import_yuan_data -> { // 用户选中导入数据,打开文件选择器,用户选择导入的数据文件目录 fileChooser.openChooseFileDialog(object : FileChooserCallback() { @@ -117,49 +126,59 @@ class PersonalCenterFragment(private var indoorDataListener: ((Boolean) -> Unit? } }) } + 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 -> { viewModel.readRealmData() //116.25017070328308 40.061730653134696 // 定位到指定位置 niMapController.mMapView.vtmMap.animator() // .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 -> { MapParamUtils.setDataLayerEnum(DataLayerEnum.SHOW_ALL_LAYERS) niMapController.layerManagerHandler.updateOMDBVectorTileLayer() viewModel.realmOperateHelper.updateRealmDefaultInstance() } + R.id.personal_center_menu_close_hide_layer -> { MapParamUtils.setDataLayerEnum(DataLayerEnum.ONLY_ENABLE_LAYERS) niMapController.layerManagerHandler.updateOMDBVectorTileLayer() 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 -> { //跳转二维码扫描界面 checkPermission() } + R.id.personal_center_menu_scan_indoor_data -> { indoorDataListener?.invoke(true) } @@ -171,6 +190,24 @@ class PersonalCenterFragment(private var indoorDataListener: ((Boolean) -> Unit? ToastUtils.showShort(it) } 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() { @@ -198,7 +235,7 @@ class PersonalCenterFragment(private var indoorDataListener: ((Boolean) -> Unit? .request { allGranted, grantedList, deniedList -> if (allGranted) { //所有权限已经授权 - Toast.makeText(context,"授权成功",Toast.LENGTH_LONG).show() + Toast.makeText(context, "授权成功", Toast.LENGTH_LONG).show() intentTOQRCode() } else { Toast.makeText(context, "拒绝权限: $deniedList", Toast.LENGTH_LONG).show() diff --git a/app/src/main/res/drawable-xxhdpi/icon_location_north.png b/app/src/main/res/drawable-xxhdpi/icon_location_north.png new file mode 100644 index 00000000..a68efa1a Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/icon_location_north.png differ diff --git a/app/src/main/res/drawable-xxhdpi/icon_location_reset.png b/app/src/main/res/drawable-xxhdpi/icon_location_reset.png new file mode 100644 index 00000000..25244ad0 Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/icon_location_reset.png differ diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 81439ebf..95e1f5b9 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -284,8 +284,8 @@ android:id="@+id/main_activity_location" style="@style/zoom_btns_style" android:layout_marginBottom="12dp" - android:onClick="@{()->viewModel.onClickLocationButton()}" - android:src="@drawable/icon_location" + android:onClick="@{()->mainActivity.onClickLocation()}" + android:src="@drawable/icon_location_north" app:layout_constraintBottom_toTopOf="@id/main_activity_map_update" app:layout_constraintRight_toRightOf="@id/main_activity_map_update" /> diff --git a/app/src/main/res/layout/fragment_note.xml b/app/src/main/res/layout/fragment_note.xml index 121d4b04..d45bdfba 100644 --- a/app/src/main/res/layout/fragment_note.xml +++ b/app/src/main/res/layout/fragment_note.xml @@ -41,7 +41,7 @@ android:layout_marginRight="5dp" android:background="@color/transparent" 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" /> + + + android:title="版本:23QE4_V1.5.0_20230904_A" /> - - - -