增加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 MapRotateEnable = false
var IS_VIDEO_SPEED by kotlin.properties.Delegates.notNull<Boolean>()
const val message_status_late = "预约,待发送"

View File

@ -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
*/

View File

@ -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<MapPosition>()
/**
* 是否自动定位
*/
val liveDataAutoLocation = MutableLiveData<Boolean>()
// 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()
}
/**
* 开启测量工具
*/

View File

@ -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<PersonalCenterViewModel>().value }
private val viewMainModel by activityViewModels<MainViewModel>()
@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()

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"
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" />

View File

@ -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" />
<androidx.core.widget.NestedScrollView

View File

@ -36,26 +36,24 @@
android:visible="false"
android:icon="@drawable/ic_baseline_sim_card_download_24"
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
android:id="@+id/personal_center_menu_version"
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 android:checkableBehavior="single">
<item android:title="小标题">
<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
android:id="@+id/personal_center_menu_open_all_layer"
android:icon="@drawable/baseline_person_24"

View File

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