From d84356415c453459d3d64aeb7ab1bfef388393d3 Mon Sep 17 00:00:00 2001 From: squallzhjch Date: Fri, 30 Jun 2023 14:31:51 +0800 Subject: [PATCH 01/40] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=A4=9A=E5=AA=92?= =?UTF-8?q?=E4=BD=93=E7=85=A7=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EvaluationResultFragment.kt | 61 ++++++++++++++----- .../EvaluationResultViewModel.kt | 24 ++++++-- 2 files changed, 63 insertions(+), 22 deletions(-) diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultFragment.kt index 54af711c..6dd0d883 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultFragment.kt @@ -1,12 +1,13 @@ package com.navinfo.omqs.ui.fragment.evaluationresult +import android.app.Activity +import android.content.Intent import android.os.Build import android.os.Bundle +import android.provider.MediaStore import android.util.Log -import android.view.LayoutInflater -import android.view.MotionEvent -import android.view.View -import android.view.ViewGroup +import android.view.* +import androidx.activity.result.contract.ActivityResultContracts import androidx.databinding.DataBindingUtil import androidx.navigation.NavOptions import androidx.navigation.findNavController @@ -21,7 +22,6 @@ import com.navinfo.omqs.ui.dialog.FirstDialog import com.navinfo.omqs.ui.fragment.BaseFragment import com.navinfo.omqs.ui.other.shareViewModels import dagger.hilt.android.AndroidEntryPoint -import org.videolan.vlc.Util @AndroidEntryPoint @@ -106,15 +106,26 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener { val list = mutableListOf("1", "2", "3") pictureAdapter.refreshData(list) + //照片左右选择键点击监听 binding.evaluationPictureLeft.setOnClickListener(this) binding.evaluationPictureRight.setOnClickListener(this) + binding.evaluationCamera.setOnClickListener(this) + //设置照片偏移量 + val viewPager = binding.evaluationPictureViewpager + val vto = viewPager.viewTreeObserver + vto.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener { + override fun onGlobalLayout() { + val width = viewPager.width + // 处理View宽度 + // 在回调完成后,需要将监听器从View树中移除,以避免重复调用 + viewPager.viewTreeObserver.removeOnGlobalLayoutListener(this) + val recyclerView = viewPager.getChildAt(0) as RecyclerView - val recyclerView = binding.evaluationPictureViewpager.getChildAt(0) as RecyclerView - - recyclerView.setPadding(0, 0, Util.convertDpToPx(requireContext(), 50), 0) - recyclerView.clipToPadding = false - + recyclerView.setPadding(0, 0, width / 2, 0) + recyclerView.clipToPadding = false + } + }) binding.evaluationVoice.setOnTouchListener { _, event -> Log.e("qj", event?.action.toString()) @@ -123,11 +134,7 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener { voiceOnTouchStart()//Do Something } - MotionEvent.ACTION_UP -> { - voiceOnTouchStop()//Do Something - } - - MotionEvent.ACTION_CANCEL -> { + MotionEvent.ACTION_UP, MotionEvent.ACTION_CANCEL, MotionEvent.ACTION_OUTSIDE -> { voiceOnTouchStop()//Do Something } } @@ -338,7 +345,9 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener { } } - + R.id.evaluation_camera -> { + takePhoto() + } else -> {} } } @@ -362,4 +371,24 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener { return true } + private fun takePhoto() { + try { + val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) + + val someActivityResultLauncher = + registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> + if (result.resultCode == Activity.RESULT_OK) { + val data: Intent? = result.data + // 处理返回的结果 + } + } + + someActivityResultLauncher.launch(intent) + + } catch (e: Exception) { + Log.d("TTTT", e.toString()) + } + } + + } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt index e5f47088..aa679ccb 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt @@ -201,7 +201,8 @@ class EvaluationResultViewModel @Inject constructor( var classCode = list[0].elementCode liveDataLeftTypeList.postValue(it) if (bean != null) { - val classType2 = roomAppDatabase.getScProblemTypeDao().findClassTypeByCode(bean.renderEntity.code) + val classType2 = roomAppDatabase.getScProblemTypeDao() + .findClassTypeByCode(bean.renderEntity.code) if (classType2 != null) { classType = classType2 } @@ -364,13 +365,19 @@ class EvaluationResultViewModel @Inject constructor( Realm.getDefaultInstance().use { realm -> realm.executeTransactionAsync { bgRealm -> // find the item - val objects = bgRealm.where(QsRecordBean::class.java).equalTo("id", id).findFirst() + val objects = + bgRealm.where(QsRecordBean::class.java).equalTo("id", id).findFirst() if (objects != null) { oldBean = bgRealm.copyFromRealm(objects) oldBean?.let { liveDataQsRecordBean.postValue(it.copy()) val p = GeometryTools.createGeoPoint(it.geometry) - mapController.markerHandle.addMarker(GeoPoint(p.latitude, p.longitude), markerTitle) + mapController.markerHandle.addMarker( + GeoPoint( + p.latitude, + p.longitude + ), markerTitle + ) //获取linkid if (it.linkId.isNotEmpty()) { @@ -381,7 +388,8 @@ class EvaluationResultViewModel @Inject constructor( } } } - liveDataQsRecordBean.value?.attachmentBeanList = it.attachmentBeanList + liveDataQsRecordBean.value?.attachmentBeanList = + it.attachmentBeanList // 显示语音数据到界面 getChatMsgEntityList() } @@ -508,9 +516,13 @@ class EvaluationResultViewModel @Inject constructor( fun stopSoundMeter() { //先重置标识,防止按钮抬起时触发语音结束 Constant.IS_VIDEO_SPEED = false - if (mSoundMeter != null && mSoundMeter!!.isStartSound()) { + if (mSoundMeter != null && mSoundMeter!!.isStartSound) { mSoundMeter!!.stop() } - if (pop != null && pop!!.isShowing) pop!!.dismiss() + pop?.let { + if(it.isShowing){ + it.dismiss() + } + } } } \ No newline at end of file From 7c57a451f1d08b87a9ab5f5b8c83eeda63427486 Mon Sep 17 00:00:00 2001 From: qiji4215 Date: Wed, 5 Jul 2023 14:09:45 +0800 Subject: [PATCH 02/40] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=BD=A6=E9=81=93?= =?UTF-8?q?=E9=9D=A2=E4=B8=BA=E8=BD=A6=E9=81=93=E4=B8=AD=E5=BF=83=E7=BA=BF?= =?UTF-8?q?=E5=B9=B6=E5=9C=A8=E8=BE=85=E5=8A=A9=E8=A1=A8=E4=B8=AD=E5=AD=98?= =?UTF-8?q?=E5=82=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/omdb_config.json | 10 +++++++++- .../java/com/navinfo/omqs/db/ImportPreProcess.kt | 15 +++++++++++++++ .../personalcenter/PersonalCenterFragment.kt | 2 +- .../omqs/ui/fragment/tasklist/TaskListAdapter.kt | 6 +++++- .../omqs/ui/fragment/tasklist/TaskListFragment.kt | 10 +++++++++- .../omqs/ui/fragment/tasklist/TaskViewModel.kt | 13 ++++++++++++- collect-library/src/main/assets/editormarker.xml | 13 +++++++++---- 7 files changed, 60 insertions(+), 9 deletions(-) diff --git a/app/src/main/assets/omdb_config.json b/app/src/main/assets/omdb_config.json index a211f51e..87fe4af1 100644 --- a/app/src/main/assets/omdb_config.json +++ b/app/src/main/assets/omdb_config.json @@ -269,7 +269,15 @@ "5001":{ "table": "OMDB_LANE_LINK_LG", "code": 5001, - "name": "车道中心线" + "name": "车道中心线", + "transformer": [ + { + "k": "geometry", + "v": "~", + "klib": "geometry", + "vlib": "generateAddWidthLine()" + } + ] }, "5002":{ "table": "OMDB_AREA", diff --git a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt index de475584..47a480d8 100644 --- a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt +++ b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt @@ -299,6 +299,21 @@ class ImportPreProcess { } } + /** + * 生成车道中心线面宽度 + * */ + fun generateAddWidthLine(renderEntity: RenderEntity) { + // 添加车道中心面渲染原则,根据车道宽度进行渲染 + val angleReference = ReferenceEntity() + angleReference.renderEntityId = renderEntity.id + angleReference.name = "${renderEntity.name}车道中线面" + angleReference.table = renderEntity.table + angleReference.geometry = renderEntity.geometry + angleReference.properties["qi_table"] = renderEntity.table + angleReference.properties["width"] = "3" + Realm.getDefaultInstance().insert(angleReference) + } + /** * 生成默认路口数据的参考数据 * */ 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 51d28ec0..83e3be9d 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 @@ -115,7 +115,7 @@ class PersonalCenterFragment(private var backListener: (() -> Unit?)? = null) : viewModel.readRealmData() // 定位到指定位置 niMapController.mMapView.vtmMap.animator() - .animateTo(GeoPoint( 39.799624915997725, 116.51407667184905 )) + .animateTo(GeoPoint( 40.10113947189571, 116.25585158012574)) } // R.id.personal_center_menu_task_list -> { // findNavController().navigate(R.id.TaskManagerFragment) diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt index 2a82c060..841b1467 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt @@ -203,7 +203,11 @@ class TaskListAdapter( binding.taskDeleteLayout.setOnClickListener { //重置状态 leftDeleteView?.resetDeleteStatus() - itemListener?.invoke(position, ItemClickStatus.DELETE_LAYOUT_CLICK, taskBean) + if(taskBean.syncStatus != FileUploadStatus.DONE){ + Toast.makeText(binding.taskUploadBtn.context, "数据未上传,不允许关闭!", Toast.LENGTH_SHORT).show() + }else{ + itemListener?.invoke(position, ItemClickStatus.DELETE_LAYOUT_CLICK, taskBean) + } } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt index 58ad3124..c8e69749 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt @@ -55,10 +55,10 @@ class TaskListFragment : BaseFragment() { if(status==TaskListAdapter.Companion.ItemClickStatus.ITEM_LAYOUT_CLICK){ viewModel.setSelectTaskBean(taskBean as TaskBean) }else if(status==TaskListAdapter.Companion.ItemClickStatus.DELETE_LAYOUT_CLICK){ + showLoadingDialog("正在关闭") context?.let { viewModel.removeTask(it, taskBean as TaskBean) } }else if(status==TaskListAdapter.Companion.ItemClickStatus.UPLOAD_LAYOUT_CLICK){ showLoadingDialog("正在校验") - Toast.makeText(context, "正在校验", Toast.LENGTH_SHORT).show() viewModel.checkUploadTask(binding.root.context,taskBean) } else { @@ -88,6 +88,14 @@ class TaskListFragment : BaseFragment() { adapter.refreshData(it) } + //监听关闭任务状态 + viewModel.liveDataCloseTask.observe(viewLifecycleOwner){ + if(it){ + Toast.makeText(binding.root.context,"成功关闭!",Toast.LENGTH_LONG).show() + } + hideLoadingDialog() + } + //监听并调用上传 viewModel.liveDataTaskUpload.observe(viewLifecycleOwner){ for ((key, value) in it) { diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt index 74ddacf6..6eb9da55 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt @@ -46,6 +46,11 @@ class TaskViewModel @Inject constructor( */ val liveDataTaskUpload = MutableLiveData>() + /** + * 用来确定是否关闭 + */ + val liveDataCloseTask = MutableLiveData() + private val colors = arrayOf(Color.RED, Color.YELLOW, Color.BLUE, Color.MAGENTA, Color.GREEN, Color.CYAN) @@ -297,10 +302,16 @@ class TaskViewModel @Inject constructor( FileManager.checkOMDBFileInfo(item) } liveDataTaskList.postValue(taskList) + liveDataCloseTask.postValue(true) } } }) - mDialog.setNegativeButton("取消", null) + mDialog.setNegativeButton("取消", object : FirstDialog.OnClickListener { + override fun onClick(dialog: Dialog?, which: Int) { + liveDataCloseTask.postValue(false) + mDialog.dismiss() + } + }) mDialog.show() } } diff --git a/collect-library/src/main/assets/editormarker.xml b/collect-library/src/main/assets/editormarker.xml index 37f21eea..c093cfa5 100644 --- a/collect-library/src/main/assets/editormarker.xml +++ b/collect-library/src/main/assets/editormarker.xml @@ -1560,7 +1560,7 @@ - + @@ -1698,8 +1698,13 @@ - - + + + + + 0 From 07d316581321a32f47b4b37d488eed53d967e73c Mon Sep 17 00:00:00 2001 From: squallzhjch Date: Fri, 7 Jul 2023 13:54:08 +0800 Subject: [PATCH 03/40] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BE=BF=E7=AD=BE?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 4 + .../omqs/ui/activity/map/MainActivity.kt | 62 +- .../omqs/ui/activity/map/MainViewModel.kt | 29 +- .../omqs/ui/fragment/empty/EmptyFragment.kt | 19 +- .../EvaluationResultFragment.kt | 41 +- .../EvaluationResultViewModel.kt | 53 +- .../omqs/ui/fragment/note/CanvasFragment.kt | 154 ++ .../omqs/ui/fragment/note/CanvasView.kt | 1801 +++++++++++++++++ .../omqs/ui/fragment/note/CanvasViewHelper.kt | 424 ++++ .../omqs/ui/fragment/note/NoteFragment.kt | 135 ++ .../omqs/ui/fragment/note/NoteViewModel.kt | 171 ++ .../res/drawable-xxhdpi/home_map_center.png | Bin 0 -> 2150 bytes .../main/res/drawable-xxhdpi/sketch_back.png | Bin 0 -> 1577 bytes .../res/drawable-xxhdpi/sketch_eraser.png | Bin 0 -> 1599 bytes .../res/drawable-xxhdpi/sketch_forward.png | Bin 0 -> 1548 bytes .../drawable/selector_sketch_eraser_bg.xml | 16 + .../drawable/shape_vertical_dashed_line.xml | 2 +- app/src/main/res/layout/activity_main.xml | 46 +- app/src/main/res/layout/fragment_canvas.xml | 9 + app/src/main/res/layout/fragment_note.xml | 235 +++ .../main/res/layout/fragment_phenomenon.xml | 44 +- .../main/res/layout/fragment_problem_link.xml | 10 +- .../navigation/middle_fragment_nav_graph.xml | 6 + .../navigation/right_fragment_nav_graph.xml | 7 + app/src/main/res/values/styleable.xml | 7 + app/src/main/res/values/styles.xml | 15 + collect-library/build.gradle | 2 +- .../collect/library/data/entity/NoteBean.kt | 13 + .../data/entity/SketchAttachContent.kt | 40 + .../library/map/handler/BaseHandler.kt | 2 + .../library/map/handler/LineHandler.kt | 7 +- .../library/map/handler/MarkHandler.kt | 181 +- .../library/map/handler/ViewportHandler.kt | 57 +- .../library/map/layers/NoteLineLayer.kt | 98 + .../main/res/drawable/icon_note_marker.xml | 12 + settings.gradle | 13 +- 36 files changed, 3588 insertions(+), 127 deletions(-) create mode 100644 app/src/main/java/com/navinfo/omqs/ui/fragment/note/CanvasFragment.kt create mode 100644 app/src/main/java/com/navinfo/omqs/ui/fragment/note/CanvasView.kt create mode 100644 app/src/main/java/com/navinfo/omqs/ui/fragment/note/CanvasViewHelper.kt create mode 100644 app/src/main/java/com/navinfo/omqs/ui/fragment/note/NoteFragment.kt create mode 100644 app/src/main/java/com/navinfo/omqs/ui/fragment/note/NoteViewModel.kt create mode 100644 app/src/main/res/drawable-xxhdpi/home_map_center.png create mode 100644 app/src/main/res/drawable-xxhdpi/sketch_back.png create mode 100644 app/src/main/res/drawable-xxhdpi/sketch_eraser.png create mode 100644 app/src/main/res/drawable-xxhdpi/sketch_forward.png create mode 100644 app/src/main/res/drawable/selector_sketch_eraser_bg.xml create mode 100644 app/src/main/res/layout/fragment_canvas.xml create mode 100644 app/src/main/res/layout/fragment_note.xml create mode 100644 app/src/main/res/values/styleable.xml create mode 100644 collect-library/src/main/java/com/navinfo/collect/library/data/entity/NoteBean.kt create mode 100644 collect-library/src/main/java/com/navinfo/collect/library/data/entity/SketchAttachContent.kt create mode 100644 collect-library/src/main/java/com/navinfo/collect/library/map/layers/NoteLineLayer.kt create mode 100644 collect-library/src/main/res/drawable/icon_note_marker.xml diff --git a/app/build.gradle b/app/build.gradle index ab7fa750..03268d5c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -127,6 +127,10 @@ dependencies { implementation "androidx.camera:camera-view:1.0.0-alpha24" implementation 'com.google.mlkit:barcode-scanning:16.1.1' + + //图片加载 + implementation 'com.github.bumptech.glide:glide:4.15.1' + annotationProcessor 'com.github.bumptech.glide:compiler:4.15.1' } //允许引用生成的代码 kapt { 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 e9d14e89..2234802e 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 @@ -184,8 +184,39 @@ class MainActivity : BaseActivity() { } //捕捉列表变化回调 viewModel.liveDataQsRecordIdList.observe(this) { - //处理页面跳转 - viewModel.navigationRightFragment(this, it) + //跳转到质检数据页面 + //获取右侧fragment容器 + val naviController = findNavController(R.id.main_activity_right_fragment) + + naviController.currentDestination?.let { navDestination -> + when (navDestination.id) { + R.id.RightEmptyFragment -> { + if (it.size == 1) { + val bundle = Bundle() + bundle.putString("QsId", it[0]) + naviController.navigate(R.id.EvaluationResultFragment, bundle) + } + } + } + } + } + //捕捉列表变化回调 + viewModel.liveDataNoteIdList.observe(this) { + //跳转到质检数据页面 + //获取右侧fragment容器 + val naviController = findNavController(R.id.main_activity_right_fragment) + + naviController.currentDestination?.let { navDestination -> + when (navDestination.id) { + R.id.RightEmptyFragment -> { + if (it.size == 1) { + val bundle = Bundle() + bundle.putString("NoteId", it[0]) + naviController.navigate(R.id.NoteFragment, bundle) + } + } + } + } } //右上角菜单是否被点击 viewModel.liveDataMenuState.observe(this) { @@ -253,7 +284,7 @@ class MainActivity : BaseActivity() { } } - viewModel.liveDataSignMoreInfo.observe(this){ + viewModel.liveDataSignMoreInfo.observe(this) { val fragment = supportFragmentManager.findFragmentById(R.id.main_activity_sign_more_info_fragment) if (fragment == null) { @@ -432,10 +463,17 @@ class MainActivity : BaseActivity() { /** * 隐藏或显示右侧展开按钮 */ - fun setRightSwitchButton(visibility: Int) { + fun setRightSwitchButtonVisibility(visibility: Int) { binding.mainActivityFragmentSwitch.visibility = visibility } + /** + * 顶部菜单按钮 + */ + fun setTopMenuButtonVisibility(visibility: Int) { + binding.mainActivityMenu.visibility = visibility + } + /** * 点击录音按钮 */ @@ -557,4 +595,20 @@ class MainActivity : BaseActivity() { viewModel.showSignMoreInfo(viewModel.liveDataRoadName.value!!) } } + + /** + * 新增便签,打开便签fragment + */ + fun onClickNewNote() { + rightController.navigate(R.id.NoteFragment) + binding.mainActivityMenu.isSelected = false + binding.mainActivityMenuGroup.visibility = View.INVISIBLE + } + + /** + * 右侧按钮+经纬度按钮 + */ + fun setRightButtonsVisible(visible: Int) { + binding.mainActivityRightVisibilityButtonsGroup2.visibility = visible + } } \ No newline at end of file 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 b456f1b1..33720482 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 @@ -71,6 +71,9 @@ class MainViewModel @Inject constructor( //地图点击捕捉到的质检数据ID列表 val liveDataQsRecordIdList = MutableLiveData>() + //地图点击捕捉到的标签ID列表 + val liveDataNoteIdList = MutableLiveData>() + //左侧看板数据 val liveDataSignList = MutableLiveData>() @@ -128,6 +131,10 @@ class MainViewModel @Inject constructor( override fun onQsRecordList(list: MutableList) { liveDataQsRecordIdList.value = list } + + override fun onNoteList(list: MutableList) { + liveDataNoteIdList.value = list + } }) initLocation() //处理地图点击操作 @@ -295,7 +302,8 @@ class MainViewModel @Inject constructor( } } - liveDataTopSignList.postValue(topSignList.distinctBy { it.name }.sortedBy { it.index }) + liveDataTopSignList.postValue(topSignList.distinctBy { it.name } + .sortedBy { it.index }) liveDataSignList.postValue(signList.sortedBy { it.distance }) val speechText = SignUtil.getRoadSpeechText(topSignList) @@ -470,25 +478,6 @@ class MainViewModel @Inject constructor( } } - /** - * 处理页面调转 - */ - fun navigationRightFragment(activity: MainActivity, list: List) { - //获取右侧fragment容器 - val naviController = activity.findNavController(R.id.main_activity_right_fragment) - - naviController.currentDestination?.let { navDestination -> - when (navDestination.id) { - R.id.RightEmptyFragment -> { - if (list.size == 1) { - val bundle = Bundle() - bundle.putString("QsId", list[0]) - naviController.navigate(R.id.EvaluationResultFragment, bundle) - } - } - } - } - } /** * 开启线选择 diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/empty/EmptyFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/empty/EmptyFragment.kt index f449b3fc..0792fa32 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/empty/EmptyFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/empty/EmptyFragment.kt @@ -32,18 +32,27 @@ class EmptyFragment : Fragment() { override fun onStart() { super.onStart() val currentDestination = findNavController().currentDestination - //有右侧面板的时候 - if (currentDestination?.label == "右侧空页面") { - currentDestinationLabel = "右侧空页面" - (activity as MainActivity).setRightSwitchButton(View.GONE) + currentDestination?.let { + //有右侧面板的时候 + currentDestinationLabel = it.label.toString() + if (it.label == "右侧空页面") { + (activity as MainActivity).setRightSwitchButtonVisibility(View.GONE) + (activity as MainActivity).setTopMenuButtonVisibility(View.VISIBLE) + } else if (it.label == "中间空页面") { + (activity as MainActivity).setRightButtonsVisible(View.VISIBLE) + } } + } override fun onStop() { super.onStop() //没有有右侧面板的时候 if (currentDestinationLabel == "右侧空页面") { - (activity as MainActivity).setRightSwitchButton(View.VISIBLE) + (activity as MainActivity).setRightSwitchButtonVisibility(View.VISIBLE) + (activity as MainActivity).setTopMenuButtonVisibility(View.GONE) + } else if (currentDestinationLabel == "中间空页面") { + (activity as MainActivity).setRightButtonsVisible(View.GONE) } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultFragment.kt index 6dd0d883..270654cd 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultFragment.kt @@ -2,11 +2,14 @@ package com.navinfo.omqs.ui.fragment.evaluationresult import android.app.Activity import android.content.Intent +import android.graphics.Bitmap import android.os.Build import android.os.Bundle import android.provider.MediaStore import android.util.Log import android.view.* +import androidx.activity.result.ActivityResult +import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts import androidx.databinding.DataBindingUtil import androidx.navigation.NavOptions @@ -27,6 +30,7 @@ import dagger.hilt.android.AndroidEntryPoint @AndroidEntryPoint class EvaluationResultFragment : BaseFragment(), View.OnClickListener { private lateinit var binding: FragmentEvaluationResultBinding + private var mCameraLauncher: ActivityResultLauncher? = null /** * 和[PhenomenonFragment],[ProblemLinkFragment],[EvaluationResultFragment]共用同一个viewModel @@ -37,6 +41,23 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener { PictureAdapter() } + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + mCameraLauncher = registerForActivityResult( + ActivityResultContracts.StartActivityForResult() + ) { result: ActivityResult -> + if (result.resultCode == Activity.RESULT_OK) { + // 处理相机返回的结果 + val extras = result.data!!.extras + val imageBitmap: Bitmap? = extras!!["data"] as Bitmap? + // 在这里处理图片数据 + if (imageBitmap != null) + viewModel.savePhoto(imageBitmap) + } + } + } + // private val args:EmptyFragmentArgs by navArgs() override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? @@ -62,7 +83,7 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener { adapter.refreshData(it) } - binding.evaluationPictureViewpager + return binding.root } @@ -122,7 +143,7 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener { val recyclerView = viewPager.getChildAt(0) as RecyclerView - recyclerView.setPadding(0, 0, width / 2, 0) + recyclerView.setPadding(0, 0, width / 2 - 30, 0) recyclerView.clipToPadding = false } }) @@ -373,18 +394,10 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener { private fun takePhoto() { try { - val intent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) - - val someActivityResultLauncher = - registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> - if (result.resultCode == Activity.RESULT_OK) { - val data: Intent? = result.data - // 处理返回的结果 - } - } - - someActivityResultLauncher.launch(intent) - + val takePictureIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE) + if (takePictureIntent.resolveActivity(requireActivity().packageManager) != null) { + mCameraLauncher!!.launch(takePictureIntent) + } } catch (e: Exception) { Log.d("TTTT", e.toString()) } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt index aa679ccb..a8b6ca0a 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt @@ -3,6 +3,7 @@ package com.navinfo.omqs.ui.fragment.evaluationresult import android.app.Activity import android.app.Dialog import android.content.Context +import android.graphics.Bitmap import android.graphics.drawable.AnimationDrawable import android.graphics.drawable.BitmapDrawable import android.os.Build @@ -35,17 +36,13 @@ import com.navinfo.omqs.util.DateTimeUtil import com.navinfo.omqs.util.SoundMeter import com.navinfo.omqs.util.SpeakMode import dagger.hilt.android.lifecycle.HiltViewModel -import io.realm.OrderedCollectionChangeSet import io.realm.Realm import io.realm.RealmList -import io.realm.RealmModel -import io.realm.RealmResults -import io.realm.kotlin.addChangeListener -import io.realm.kotlin.where import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import org.oscim.core.GeoPoint import java.io.File +import java.io.FileOutputStream import java.util.* import javax.inject.Inject @@ -78,9 +75,20 @@ class EvaluationResultViewModel @Inject constructor( */ val liveDataRightTypeList = MutableLiveData>() - var liveDataQsRecordBean = MutableLiveData() + /** + * + */ + val liveDataQsRecordBean = MutableLiveData() - var listDataChatMsgEntityList = MutableLiveData>() + /** + * 语音列表 + */ + val listDataChatMsgEntityList = MutableLiveData>() + + /** + * 照片列表 + */ + val liveDataPictureList = MutableLiveData>() var oldBean: QsRecordBean? = null @@ -520,9 +528,38 @@ class EvaluationResultViewModel @Inject constructor( mSoundMeter!!.stop() } pop?.let { - if(it.isShowing){ + if (it.isShowing) { it.dismiss() } } } + + + fun savePhoto(bitmap: Bitmap) { + viewModelScope.launch(Dispatchers.IO) { + // 创建一个名为 "MyApp" 的文件夹 + val myAppDir = File(Constant.USER_DATA_ATTACHEMNT_PATH) + if (!myAppDir.exists()) + myAppDir.mkdirs() // 确保文件夹已创建 + + // 创建一个名为 fileName 的文件 + val file = File(myAppDir, "${UUID.randomUUID()}.png") + file.createNewFile() // 创建文件 + + // 将 Bitmap 压缩为 JPEG 格式,并将其写入文件中 + val out = FileOutputStream(file) + bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out) + out.flush() + out.close() + var picList = mutableListOf() + if (liveDataPictureList.value == null) { + picList.add(file.absolutePath) + } else { + picList.addAll(liveDataPictureList.value!!) + picList.add(file.absolutePath) + } + liveDataPictureList.postValue(picList) + } + + } } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/note/CanvasFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/note/CanvasFragment.kt new file mode 100644 index 00000000..09ca56e9 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/note/CanvasFragment.kt @@ -0,0 +1,154 @@ +package com.navinfo.omqs.ui.fragment.note + +import android.os.Build +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.databinding.DataBindingUtil +import com.navinfo.omqs.R +import com.navinfo.omqs.databinding.FragmentCanvasBinding +import com.navinfo.omqs.databinding.FragmentNoteBinding +import com.navinfo.omqs.databinding.FragmentProblemLinkBinding +import com.navinfo.omqs.ui.fragment.BaseFragment +import com.navinfo.omqs.ui.fragment.note.CanvasView.CanvasStyle +import com.navinfo.omqs.ui.fragment.note.CanvasView.OnCanvasChangeListener +import com.navinfo.omqs.ui.other.shareViewModels + +/** + * @author zhjch + * @version V1.0 + * @ClassName: CanvasFragment + * @Date 2016/5/10 + * @Description: ${TODO}(绘制画布) + */ +class CanvasFragment : BaseFragment() { + /** + * 获取画布 + * + * @return + */ + /** + * 画布 + */ + private val canvasView by lazy { binding.canvasView } + + /** + * 画笔线型 + */ + private var mStyle = CanvasStyle.FREE_LINE + + /** + * 画笔颜色 + */ + private var mColor = -1 + + /** + * 画笔粗细 + */ + private var width = 5 + + + /** + * 画布回调接口 + */ + private var listener: OnCanvasChangeListener? = null + + + private var _binding: FragmentCanvasBinding? = null + private val binding get() = _binding!! + + private val viewModel by shareViewModels("note") + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View { + _binding = FragmentCanvasBinding.inflate(inflater, container, false) + viewModel.initCanvasView(canvasView) + return binding.root + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + canvasView.setStyle(mStyle) + if (mColor == -1) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + mColor = resources.getColor(R.color.black, null) + } + } + canvasView.setPaintColor(mColor) + canvasView.setPaintWidth(width) + if (listener != null) { + canvasView.setOnCanvasChangeListener(listener) + } + +// * 开关橡皮擦 +// */ +// viewModel.liveEraserData.observe(viewLifecycleOwner) { +// canvasView.setEraser(it) +// } +// /** +// * 清除 +// */ +// viewModel.liveClearData.observe(viewLifecycleOwner) { +// canvasView.removeAllPaint() +// } +// /** +// * 回退上一笔 +// */ +// viewModel.liveBackData.observe(viewLifecycleOwner) { +// canvasView.back() +// } +// /** +// * 撤销回退 +// */ +// viewModel.liveForward.observe(viewLifecycleOwner) { +// canvasView.forward() +// } +// + + } + + + /** + * 将数据转化并绘制在画板上 + * + * @param value + */ + fun setDrawPathList(value: MutableList) { + if (value != null && value.isNotEmpty()) { + canvasView.setDrawPathList(value) + } + } + + + /** + * 设置草图画笔线型 + */ + fun setStyle(style: CanvasStyle) { + mStyle = style + canvasView.setStyle(style) + } + + /** + * 设置画笔颜色 + */ + fun setPaintColor(color: Int) { + mColor = color + canvasView.setPaintColor(mColor) + } + + /** + * 设置画笔粗细 + */ + fun setPaintWidth(width: Int) { + this.width = width + canvasView.setPaintWidth(width) + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/note/CanvasView.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/note/CanvasView.kt new file mode 100644 index 00000000..c8797d46 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/note/CanvasView.kt @@ -0,0 +1,1801 @@ +package com.navinfo.omqs.ui.fragment.note + +import android.content.Context +import android.graphics.* +import android.media.ThumbnailUtils +import android.util.AttributeSet +import android.util.Log +import android.view.MotionEvent +import android.view.View +import com.navinfo.collect.library.utils.GeometryTools +import com.navinfo.omqs.R +import com.navinfo.omqs.ui.other.BaseToast +import kotlin.math.abs +import kotlin.math.cos +import kotlin.math.sin + +/** + * @author zhjch + * @version V1.0 + * @ClassName: CanvasView + * @Date 2016/5/10 + * @Description: ${TODO}(画板) + */ +class CanvasView @JvmOverloads constructor( + private val mContext: Context, + attrs: AttributeSet? = null, + defStyle: Int = 0 +) : View( + mContext, attrs, defStyle +) { + /** + * 画笔类型 + */ + enum class CanvasStyle { + FREE_LINE, //自由线 + STRAIGHT_LINE, //直线 + RECT_LINE, //框 + RAILWAY_LINE, // 铁路线 + GREENLAND_LINE, //绿地线 + WATER_LINE, //水系线 + BUILDING_LINE, //建筑物 + POLY_LINE, //折线 + CIRCULAR_POINT, //圆点 + ELLIPSE_LINE, //椭圆 + PARKING_LINE + //停车场 + } + + /** + * 画布 + */ + private var mCanvas: Canvas? = null + + /** + * 控制线型 + */ + private var mPath: Path? = null + + /** + * 画布背景 + */ + private var mBitmapPaint: Paint? = null + + /** + * 画布前景 + */ + private var mBitmap: Bitmap? = null + + /** + * 普通画笔 + */ + private val mPaint: Paint? + + /** + * 圆形画笔 + */ + private val mPaintCircular: Paint + + /** + * 铁路画笔1 底色 + */ + private val mPaintRailway1: Paint + + /** + * 铁路画笔2 前景色 + */ + private val mPaintRailway2: Paint + + /** + * 水系画笔1 边框 + */ + private val mPaintWater: Paint + + /** + * 水系画笔2 填充 + */ + private val mPaintWater1: Paint + + /** + * 绿地画笔1 边框 + */ + private val mPaintGreenland: Paint + + /** + * 绿地画笔2 填充 + */ + private val mPaintGreenland1: Paint + + /** + * 停车场1 边框 + */ + private val mPaintParking: Paint + + /** + * 停车场 填充 + */ + private val mPaintParking1: Paint + + /** + * 准星图片 + */ + private val mStarBitmap: Bitmap + + /** + * 铁路栅格线样式 + */ + private val pathEffect1 = DashPathEffect(floatArrayOf(16f, 16f), 4f) + // private DashPathEffect pathEffect2 = new DashPathEffect(new float[] { 12,12 }, 12); + /** + * 需不需要记录画笔轨迹点 + */ + private var isSavePoint: Boolean + + /** + * 是否在move 中 + */ + private var isMove = false + + /** + * 是否打开橡皮擦 + */ + private var isEraser = false + + /** + * 绘制轨迹路径 + */ + private var mDrawPath: DrawPath? = null + + /** + * 画笔宽度 + */ + private var mPaintWidth = 5 + + /** + * 画笔颜色 + */ + private var mPaintColor = 0xFF5052 + + /** + * 圆形图案半径 + */ + private val mCircularP = 150 + /** + * 获取当前画笔样式 + * + * @return + */ + /** + * 线型 + */ + var canvasStyle = CanvasStyle.FREE_LINE + private set + + /** + * 当前画布上的每一笔 + */ + private var mCurrentPaths: MutableList = mutableListOf() + + /** + * 被撤销的每一笔 + */ + private val mDeletePaths: MutableList? + + /** + * 画布 宽度 + */ + private var viewWidth = 10 + + /** + * 画布 高度 + */ + private var viewHeight = 10 + + /** + * 画笔第一笔点下去的位置 + */ + private var mDownX = 0f + private var mDownY = 0f + + /** + * 画笔移动的位置 + */ + private var mMoveX = 0f + private var mMoveY = 0f + + /** + * 圆点图案移动矩阵 + */ + private val mMatrixCircular = Matrix() + private var mListener: OnCanvasChangeListener? = null + + /** + * 用来回馈上层页面 + */ + interface OnCanvasChangeListener { + /** + * 画布上有绘制操作 + */ + fun onDraw() + } + + fun setOnCanvasChangeListener(listener: OnCanvasChangeListener?) { + mListener = listener + } + + //路径对象 + class DrawPath( + startPoint: Point?, + var path: Path, + var width: Int, + var color: Int, + var style: CanvasStyle + ) { + var pointList: MutableList? + var isOver = true + + /** + * 外截矩形 + */ + var rect: Rect? = null + + /** + * @param startPoint 起点 + * @param path 路径 + * @param width 宽度 + * @param color 颜色 + * @param style 线型 + */ + init { + pointList = ArrayList() + if (startPoint != null) { + rect = Rect(startPoint.x, startPoint.y, startPoint.x + 1, startPoint.y + 1) + } + } + + /** + * 获取画笔 + * + * @param paint + * @return + */ + fun getPaint(paint: Paint?): Paint? { + paint!!.strokeWidth = width.toFloat() + paint.color = color + return paint + } + } + + /** + * 初始化画布 + */ + private fun initCanvas() { + //画布大小 + if (mBitmap != null) { + mBitmap!!.recycle() + } + mBitmap = Bitmap.createBitmap(viewWidth, viewHeight, Bitmap.Config.ARGB_8888) + mCanvas = Canvas(mBitmap!!) //所有mCanvas画的东西都被保存在了mBitmap中 + mPath = Path() + mBitmapPaint = Paint(Paint.DITHER_FLAG) + } + + /** + * 结束折线类型的操作 + */ + private fun setPolyLineOver() { + if (mCurrentPaths.size > 0) { + val path = mCurrentPaths[mCurrentPaths.size - 1] + if (path.style == CanvasStyle.RAILWAY_LINE + || path.style == CanvasStyle.POLY_LINE + ) { + //切换类型时,线少于2个点的不要 + if (path.pointList == null || path.pointList!!.size == 1) { + back() //只有一个点时会遗留一个起始圆点,先移除掉。然后清除 + mDeletePaths!!.clear() + if (path === mDrawPath) { + mDrawPath = null + // mDrawPath.pointList.clear(); +// mPath.reset(); + } + return + } + } else if (path.style == CanvasStyle.GREENLAND_LINE || path.style == CanvasStyle.WATER_LINE || path.style == CanvasStyle.PARKING_LINE) { + //切换类型时,面少于3个点的不要 + if (path.pointList == null || path.pointList!!.size < 4) { + mCurrentPaths.removeAt(mCurrentPaths.size - 1) + initCanvas() + } + invalidate() + return + } + path.isOver = true + } + } + + /** + * 切换线型 + * + * @param style + */ + fun setStyle(style: CanvasStyle) { + canvasStyle = style + setPolyLineOver() + } + + init { + mCurrentPaths = ArrayList() + mDeletePaths = ArrayList() + mPaint = Paint() + mPaint.isAntiAlias = true + mPaint.isDither = true + mPaint.color = mPaintColor + mPaint.style = Paint.Style.STROKE + mPaint.strokeJoin = Paint.Join.ROUND + mPaint.strokeCap = Paint.Cap.ROUND + mPaint.strokeWidth = mPaintWidth.toFloat() + mPaintRailway1 = Paint() + mPaintRailway1.isAntiAlias = true + mPaintRailway1.isDither = true + mPaintRailway1.color = -0xff8f40 + mPaintRailway1.style = Paint.Style.STROKE + mPaintRailway1.strokeWidth = 8f + mPaintRailway2 = Paint() + mPaintRailway2.isAntiAlias = true + mPaintRailway2.isDither = true + mPaintRailway2.color = Color.WHITE + mPaintRailway2.style = Paint.Style.STROKE + mPaintRailway2.strokeWidth = 4f + mPaintRailway2.pathEffect = pathEffect1 + mPaintWater = Paint() + mPaintWater.isAntiAlias = true + mPaintWater.isDither = true + mPaintWater.color = -0x543501 + mPaintWater.style = Paint.Style.FILL + mPaintWater.strokeWidth = 4f + mPaintWater1 = Paint() + mPaintWater1.isAntiAlias = true + mPaintWater1.isDither = true + mPaintWater1.color = -0xff4fb0 + mPaintWater1.style = Paint.Style.STROKE + mPaintWater1.strokeWidth = 4f + mPaintGreenland = Paint() + mPaintGreenland.isAntiAlias = true + mPaintGreenland.isDither = true + mPaintGreenland.color = -0x321c54 + mPaintGreenland.style = Paint.Style.FILL + mPaintGreenland.strokeWidth = 4f + mPaintGreenland1 = Paint() + mPaintGreenland1.isAntiAlias = true + mPaintGreenland1.isDither = true + mPaintGreenland1.color = -0xff4fb0 + mPaintGreenland1.style = Paint.Style.STROKE + mPaintGreenland1.strokeWidth = 4f + mPaintParking = Paint() + mPaintParking.isAntiAlias = true + mPaintParking.isDither = true + mPaintParking.color = -0x168 + mPaintParking.style = Paint.Style.FILL + mPaintParking.strokeWidth = 4f + mPaintParking1 = Paint() + mPaintParking1.isAntiAlias = true + mPaintParking1.isDither = true + mPaintParking1.color = -0x59595a + mPaintParking1.style = Paint.Style.STROKE + mPaintParking1.strokeWidth = 4f + mPaintCircular = Paint() + mPaintCircular.style = Paint.Style.FILL + mPaintCircular.color = mPaintColor + mStarBitmap = BitmapFactory.decodeResource(resources, R.drawable.home_map_center) + val a = mContext.obtainStyledAttributes(attrs, R.styleable.CanvasView) + isSavePoint = a.getBoolean(R.styleable.CanvasView_isSavePoint, true) + a.recycle() + } + + /** + * 手指移动的处理 + * + * @param x 坐标 + * @param y 坐标 + */ + private fun touch_move_line(x: Float, y: Float) { + if (x == mDownX && y == mDownY) return + val dx = abs(x - mDownX) + val dy = abs(y - mDownY) + if (dx >= TOUCH_TOLERANCE || dy >= TOUCH_TOLERANCE) { + //增加非空判断 + if (mPath != null) mPath!!.quadTo( + mDownX, + mDownY, + (x + mDownX) / 2, + (y + mDownY) / 2 + ) //源代码是这样写的,可是我没有弄明白,为什么要这样? + mDownX = x + mDownY = y + } + setBuilder(x.toInt(), y.toInt()) + } + + /** + * 多边形起点点下时的处理 + * + * @param x 坐标 + * @param y 坐标 + */ + private fun touch_start_poly(x: Int, y: Int) { + if (canvasStyle == CanvasStyle.GREENLAND_LINE || canvasStyle == CanvasStyle.WATER_LINE || canvasStyle == CanvasStyle.PARKING_LINE) { + if (mCurrentPaths.size > 0 && mCurrentPaths[0].isOver) { + BaseToast.makeText(mContext, "不允许存在多个!", BaseToast.LENGTH_SHORT).show() + return + } + if (mCurrentPaths.size > 0) { + val drawPath = mCurrentPaths[mCurrentPaths!!.size - 1] + if (drawPath.pointList!!.size > 3) { + if (!GeometryTools.isSimplePolygon(drawPath.pointList, Point(x, y))) { + BaseToast.makeText(mContext, "面不允许自相交图形!", BaseToast.LENGTH_SHORT).show() + return + } + } + } + } + if (mDeletePaths != null && mDeletePaths.size > 0) { + mDeletePaths.clear() + } + if (mCurrentPaths.size > 0) { + val drawPath = mCurrentPaths[mCurrentPaths.size - 1] + if (!drawPath.isOver) { + mDrawPath = drawPath + if (drawPath.style == CanvasStyle.GREENLAND_LINE || drawPath.style == CanvasStyle.WATER_LINE || drawPath.style == CanvasStyle.PARKING_LINE) { + if (drawPath.pointList!!.size > 1) { + drawPath.pointList!!.removeAt(drawPath.pointList!!.size - 1) + } + setBuilder(x, y) + if (drawPath.pointList!!.size < 3) { + drawPath.path.lineTo(x.toFloat(), y.toFloat()) + } else { + initCanvas() + drawPath.path.reset() + for (i in drawPath.pointList!!.indices) { + if (i == 0) { + drawPath.path.moveTo( + drawPath.pointList!![0].x.toFloat(), + drawPath.pointList!![0].y.toFloat() + ) + } else { + drawPath.path.lineTo( + drawPath.pointList!![i].x.toFloat(), + drawPath.pointList!![i].y.toFloat() + ) + } + } + drawPath.path.lineTo( + drawPath.pointList!![0].x.toFloat(), + drawPath.pointList!![0].y.toFloat() + ) + } + drawPath.pointList!!.add(drawPath.pointList!![0]) + } else { + drawPath.path.lineTo(x.toFloat(), y.toFloat()) + setBuilder(x, y) + } + if (drawPath.style == CanvasStyle.POLY_LINE) { + mCanvas!!.drawPath(drawPath.path, drawPath.getPaint(mPaint)!!) + } else if (drawPath.style == CanvasStyle.RAILWAY_LINE) { + mCanvas!!.drawPath(drawPath.path, mPaintRailway1) + mCanvas!!.drawPath(drawPath.path, mPaintRailway2) + } else if (drawPath.style == CanvasStyle.GREENLAND_LINE) { + mCanvas!!.drawPath(drawPath.path, mPaintGreenland) + mCanvas!!.drawPath(drawPath.path, mPaintGreenland1) + } else if (drawPath.style == CanvasStyle.WATER_LINE) { + mCanvas!!.drawPath(drawPath.path, mPaintWater) + mCanvas!!.drawPath(drawPath.path, mPaintWater1) + } else if (drawPath.style == CanvasStyle.PARKING_LINE) { + mCanvas!!.drawPath(drawPath.path, mPaintParking) + mCanvas!!.drawPath(drawPath.path, mPaintParking1) + } + invalidate() + return + } + } + mPath = Path() + mDrawPath = DrawPath(Point(x, y), mPath!!, mPaintWidth, mPaintColor, canvasStyle) + mDrawPath!!.isOver = false + mPaintCircular.color = mPaintColor + mCanvas!!.drawCircle(x.toFloat(), y.toFloat(), 2f, mPaintCircular) + mPath!!.moveTo(x.toFloat(), y.toFloat()) + setBuilder(x, y) + if (canvasStyle == CanvasStyle.WATER_LINE || canvasStyle == CanvasStyle.GREENLAND_LINE || canvasStyle == CanvasStyle.PARKING_LINE) { + setBuilder(x, y) + } + mCurrentPaths.add(mDrawPath!!) + if (mListener != null) { + mListener!!.onDraw() + } + invalidate() + return + } + + /** + * 手指按下的第一个点处理 + * + * @param x 坐标 + * @param y 坐标 + */ + private fun touch_start(x: Float, y: Float) { + mPath!!.reset() //清空path + mPath!!.moveTo(x, y) + mDownX = x + mDownY = y + if (canvasStyle != CanvasStyle.ELLIPSE_LINE) setBuilder(x.toInt(), y.toInt()) + if (mDeletePaths != null && mDeletePaths.size > 0) { + mDeletePaths.clear() + } + } + + /** + * 手指离开屏幕时的处理 + * + * @param x 坐标 + * @param y 坐标 + */ + private fun touch_up(x: Float, y: Float) { + try { + if (canvasStyle == CanvasStyle.POLY_LINE) { + val Y = y - mCircularP + mStarBitmap.height / 2 + mDrawPath!!.width = mPaintWidth + mDrawPath!!.color = mPaintColor + if (mDrawPath!!.pointList!!.size > 0) { + mDrawPath = mCurrentPaths[mCurrentPaths.size - 1] + mPath = mDrawPath!!.path + mPath!!.lineTo(x, Y) + mCanvas!!.drawPath(mPath!!, mPaint!!) + } else { + mCurrentPaths.add(mDrawPath!!) + if (mListener != null) { + mListener!!.onDraw() + } + mPath!!.moveTo(x, Y) + mPaintCircular.color = mPaintColor + mPaintCircular.strokeWidth = 4f + mCanvas!!.drawCircle(x, Y, 4f, mPaintCircular) + } + setBuilder(x.toInt(), Y.toInt()) + return + } else if (canvasStyle == CanvasStyle.STRAIGHT_LINE) { + val Y = y - mCircularP + mStarBitmap.height / 2 + setBuilder(x.toInt(), Y.toInt()) + mDrawPath!!.width = mPaintWidth + mDrawPath!!.color = mPaintColor + if (mDrawPath!!.pointList!!.size > 1) { + mDrawPath!!.isOver = true + mCurrentPaths.add(mDrawPath!!) + if (mListener != null) { + mListener!!.onDraw() + } + mPath!!.lineTo(x, Y) + mCanvas!!.drawPath(mPath!!, mPaint!!) + mPath = null + } else { + mPath!!.moveTo(x, Y) + mPaintCircular.color = mPaintColor + mPaintCircular.strokeWidth = 4f + mCanvas!!.drawCircle(x, Y, 4f, mPaintCircular) + } + return + } else if (canvasStyle == CanvasStyle.CIRCULAR_POINT) { + mPaintCircular.color = mPaintColor + val Y = y - mCircularP + mStarBitmap.height / 2 + mCanvas!!.drawCircle(x, Y, (mPaintWidth + 5).toFloat(), mPaintCircular) + mDrawPath!!.pointList!!.add(Point(x.toInt(), Y.toInt())) + mDrawPath!!.rect = Rect( + (x - mPaintWidth - 20).toInt(), + (Y - mPaintWidth - 20).toInt(), + (x + mPaintWidth + 20).toInt(), + (Y + mPaintWidth + 20).toInt() + ) + mCurrentPaths.add(mDrawPath!!) + if (mListener != null) { + mListener!!.onDraw() + } + } else if (canvasStyle == CanvasStyle.RECT_LINE) { + if (mDownX == x || mDownY == y) return + mPath!!.lineTo(x, mDownY) + setBuilder(x.toInt(), mDownY.toInt()) + mPath!!.lineTo(x, y) + setBuilder(x.toInt(), y.toInt()) + mPath!!.lineTo(mDownX, y) + setBuilder(mDownX.toInt(), y.toInt()) + mPath!!.lineTo(mDownX, mDownY) + setBuilder(mDownX.toInt(), mDownY.toInt()) + } else if (canvasStyle == CanvasStyle.ELLIPSE_LINE) { + if (mDownX == x || mDownY == y) { + return + } + val minX = if (x < mDownX) x else mDownX + val maxX = if (x > mDownX) x else mDownX + val minY = if (y < mDownY) y else mDownY + val maxY = if (y > mDownY) y else mDownY + mPath!!.moveTo(minX, minY) + mPath!!.addOval(RectF(minX, minY, maxX, maxY), Path.Direction.CW) + var a = 0.0 + val xR = ((maxX - minX) / 2).toDouble() + val yR = ((maxY - minY) / 2).toDouble() + var tempX = (xR * cos(a) + xR + minX).toInt() + val tempY = (yR * sin(a) + yR + minY).toInt() + val firstX = tempX + setBuilder(tempX, tempY) + var bLeft = false + var bRight = false + while (!bLeft || !bRight) { + a += 0.1 + val x1 = (xR * Math.cos(a) + xR + minX).toInt() + val y1 = (yR * Math.sin(a) + yR + minY).toInt() + if (!bLeft && x1 > tempX) { + bLeft = true + } + if (!bRight && bLeft && x1 <= tempX) { + bRight = true + setBuilder(firstX, tempY) + } else { + tempX = x1 + setBuilder(x1, y1) + } + } + } else { + if (!contains( + mDownX.toInt(), + mDownY.toInt(), + x.toInt(), + y.toInt(), + ChouXiBanJing + ) + ) { + mPath!!.lineTo(x, y) + setBuilder(x.toInt(), y.toInt()) + } + if (canvasStyle == CanvasStyle.GREENLAND_LINE || canvasStyle == CanvasStyle.WATER_LINE || canvasStyle == CanvasStyle.PARKING_LINE) { + val point = mDrawPath!!.pointList!![0] + mPath!!.lineTo(point.x.toFloat(), point.y.toFloat()) + setBuilder(point.x, point.y) + } + } + if (mDrawPath!!.pointList!!.size > 1) { + if (canvasStyle == CanvasStyle.RAILWAY_LINE) { + mCanvas!!.drawPath(mPath!!, mPaintRailway1) + mCanvas!!.drawPath(mPath!!, mPaintRailway2) + } else if (canvasStyle == CanvasStyle.GREENLAND_LINE) { + mCanvas!!.drawPath(mPath!!, mPaintGreenland) + mCanvas!!.drawPath(mPath!!, mPaintGreenland1) + } else if (canvasStyle == CanvasStyle.WATER_LINE) { + mCanvas!!.drawPath(mPath!!, mPaintWater) + mCanvas!!.drawPath(mPath!!, mPaintWater1) + } else if (canvasStyle == CanvasStyle.PARKING_LINE) { + mCanvas!!.drawPath(mPath!!, mPaintParking) + mCanvas!!.drawPath(mPath!!, mPaintParking1) + } else { + mCanvas!!.drawPath(mPath!!, mPaint!!) + } + mCurrentPaths.add(mDrawPath!!) + if (mListener != null) { + mListener!!.onDraw() + } + } + mPath = null + } catch (e: Exception) { + } + } + + /** + * 记录每一个点,并计算外截矩形 + * + * @param x + * @param y + */ + private fun setBuilder(x: Int, y: Int) { + if (!isSavePoint || mDrawPath == null) return + if (mDrawPath!!.pointList == null) mDrawPath!!.pointList = ArrayList() + if (mDrawPath!!.rect == null) { + mDrawPath!!.rect = Rect(x, y, x + 1, y + 1) + } + if (x < mDrawPath!!.rect!!.left) { + mDrawPath!!.rect!!.left = x + } else if (x > mDrawPath!!.rect!!.right) { + mDrawPath!!.rect!!.right = x + } + if (y < mDrawPath!!.rect!!.top) { + mDrawPath!!.rect!!.top = y + } else if (y > mDrawPath!!.rect!!.bottom) { + mDrawPath!!.rect!!.bottom = y + } + mDrawPath!!.pointList!!.add(Point(x, y)) + } + + /** + * 记录手指滑动中的坐标 + * + * @param x + * @param y + */ + private fun touch_move(x: Float, y: Float) { + mMoveX = x + mMoveY = y + } + + override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { + super.onSizeChanged(w, h, oldw, oldh) + viewWidth = w + viewHeight = h + initCanvas() + if (mCurrentPaths.isNotEmpty()) { + for (dp in mCurrentPaths) { + if (dp.style == CanvasStyle.RAILWAY_LINE) { + mCanvas!!.drawPath(dp.path, mPaintRailway1) + mCanvas!!.drawPath(dp.path, mPaintRailway2) + } else if (dp.style == CanvasStyle.GREENLAND_LINE) { + mCanvas!!.drawPath(dp.path, mPaintGreenland) + mCanvas!!.drawPath(dp.path, mPaintGreenland1) + } else if (dp.style == CanvasStyle.WATER_LINE) { + mCanvas!!.drawPath(dp.path, mPaintWater) + mCanvas!!.drawPath(mPath!!, mPaintWater1) + } else if (dp.style == CanvasStyle.PARKING_LINE) { + mCanvas!!.drawPath(dp.path, mPaintParking) + mCanvas!!.drawPath(mPath!!, mPaintParking1) + } else { + mCanvas!!.drawPath(dp.path, dp.getPaint(mPaint)!!) + } + } + } + } + + /** + * 撤销上一步 + */ + fun back(): Boolean { + if (mCurrentPaths.size > 0) { + //调用初始化画布函数以清空画布 + initCanvas() + //将路径保存列表中的最后一个元素删除 ,并将其保存在路径删除列表中 + val drawPath = mCurrentPaths[mCurrentPaths.size - 1] + //如果是正在绘制的折线 + if ((drawPath.style == CanvasStyle.POLY_LINE + || drawPath.style == CanvasStyle.RAILWAY_LINE) + && !drawPath.isOver + ) { + val drawPathCopy: DrawPath? + if (mDeletePaths!!.size == 0 || mDeletePaths[mDeletePaths.size - 1]!!.style != drawPath.style || mDeletePaths[mDeletePaths.size - 1]!!.isOver) { + drawPathCopy = DrawPath( + null, + drawPath.path, + drawPath.width, + drawPath.color, + drawPath.style + ) + drawPathCopy.rect = drawPath.rect + drawPathCopy.isOver = false + mDeletePaths.add(drawPathCopy) + } else { + drawPathCopy = mDeletePaths[mDeletePaths.size - 1] + } + val point = drawPath.pointList!![drawPath.pointList!!.size - 1] + drawPathCopy!!.pointList!!.add(point) + if (drawPath.pointList!!.size == 1) { + mCurrentPaths.removeAt(mCurrentPaths.size - 1) + } else { + drawPath.pointList!!.remove(point) + } + } else if ((drawPath.style == CanvasStyle.WATER_LINE || drawPath.style == CanvasStyle.GREENLAND_LINE || drawPath.style == CanvasStyle.PARKING_LINE) + && !drawPath.isOver + ) { + val drawPathCopy: DrawPath? + if (mDeletePaths!!.size == 0 || mDeletePaths[mDeletePaths.size - 1]!!.style != drawPath.style || mDeletePaths[mDeletePaths.size - 1]!!.isOver) { + drawPathCopy = DrawPath( + null, + drawPath.path, + drawPath.width, + drawPath.color, + drawPath.style + ) + drawPathCopy.rect = drawPath.rect + drawPathCopy.isOver = false + mDeletePaths.add(drawPathCopy) + } else { + drawPathCopy = mDeletePaths[mDeletePaths.size - 1] + } + val point = drawPath.pointList!![drawPath.pointList!!.size - 2] + drawPathCopy!!.pointList!!.add(point) + if (drawPath.pointList!!.size < 3) { + mCurrentPaths.removeAt(mCurrentPaths.size - 1) + } else { + drawPath.pointList!!.removeAt(drawPath.pointList!!.size - 1) + drawPath.pointList!!.remove(point) + drawPath.pointList!!.add(drawPath.pointList!![0]) + } + } else { + mDeletePaths!!.add(drawPath) + mCurrentPaths.removeAt(mCurrentPaths.size - 1) + } + if (mCurrentPaths.isNotEmpty()) { + //将路径保存列表中的路径重绘在画布上 + for (dp in mCurrentPaths) { + if (dp.style == CanvasStyle.POLY_LINE) { + dp.path.reset() + for (i in dp.pointList!!.indices) { + val point = dp.pointList!![i] + mPaintCircular.color = dp.color + if (i == 0) { + mCanvas!!.drawCircle( + point.x.toFloat(), + point.y.toFloat(), + 2f, + mPaintCircular + ) + dp.path.moveTo(point.x.toFloat(), point.y.toFloat()) + } else { + dp.path.lineTo(point.x.toFloat(), point.y.toFloat()) + } + } + mCanvas!!.drawPath(dp.path, dp.getPaint(mPaint)!!) + } else if (dp.style == CanvasStyle.RAILWAY_LINE) { + dp.path.reset() + for (i in dp.pointList!!.indices) { + val point = dp.pointList!![i] + if (i == 0) { + mCanvas!!.drawCircle( + point.x.toFloat(), + point.y.toFloat(), + 2f, + mPaintCircular + ) + dp.path.moveTo(point.x.toFloat(), point.y.toFloat()) + } else { + dp.path.lineTo(point.x.toFloat(), point.y.toFloat()) + } + } + mCanvas!!.drawPath(dp.path, mPaintRailway1) + mCanvas!!.drawPath(dp.path, mPaintRailway2) + } else if (dp.style == CanvasStyle.GREENLAND_LINE) { + dp.path.reset() + for (i in dp.pointList!!.indices) { + val point = dp.pointList!![i] + if (i == 0) { + mCanvas!!.drawCircle( + point.x.toFloat(), + point.y.toFloat(), + 2f, + mPaintCircular + ) + dp.path.moveTo(point.x.toFloat(), point.y.toFloat()) + } else { + dp.path.lineTo(point.x.toFloat(), point.y.toFloat()) + } + } + mCanvas!!.drawPath(dp.path, mPaintGreenland) + mCanvas!!.drawPath(dp.path, mPaintGreenland1) + } else if (dp.style == CanvasStyle.WATER_LINE) { + dp.path.reset() + for (i in dp.pointList!!.indices) { + val point = dp.pointList!![i] + if (i == 0) { + mCanvas!!.drawCircle( + point.x.toFloat(), + point.y.toFloat(), + 2f, + mPaintCircular + ) + dp.path.moveTo(point.x.toFloat(), point.y.toFloat()) + } else { + dp.path.lineTo(point.x.toFloat(), point.y.toFloat()) + } + } + mCanvas!!.drawPath(dp.path, mPaintWater) + mCanvas!!.drawPath(dp.path, mPaintWater1) + } else if (dp.style == CanvasStyle.PARKING_LINE) { + dp.path.reset() + for (i in dp.pointList!!.indices) { + val point = dp.pointList!![i] + if (i == 0) { + mCanvas!!.drawCircle( + point.x.toFloat(), + point.y.toFloat(), + 2f, + mPaintCircular + ) + dp.path.moveTo(point.x.toFloat(), point.y.toFloat()) + } else { + dp.path.lineTo(point.x.toFloat(), point.y.toFloat()) + } + } + mCanvas!!.drawPath(dp.path, mPaintParking) + mCanvas!!.drawPath(dp.path, mPaintParking1) + } else if (dp.style == CanvasStyle.CIRCULAR_POINT) { + mPaintCircular.color = dp.color + mCanvas!!.drawCircle( + dp.pointList!![0].x.toFloat(), + dp.pointList!![0].y.toFloat(), + dp.width.toFloat(), + mPaintCircular + ) + } else { + mCanvas!!.drawPath(dp.path, dp.getPaint(mPaint)!!) + } + } + } + invalidate() // 刷新 + } + if (mCurrentPaths.size == 0) { + mDrawPath = null + } + return mCurrentPaths.size != 0 + } + + /** + * 恢复撤销的上一步 + */ + fun forward() { + if (mDeletePaths!!.size > 0) { + //将删除的路径列表中的最后一个,也就是最顶端路径取出(栈),并加入路径保存列表中 + val dp = mDeletePaths[mDeletePaths.size - 1] + if ((dp!!.style == CanvasStyle.POLY_LINE + || dp.style == CanvasStyle.RAILWAY_LINE) + && !dp.isOver + ) { + val dp2: DrawPath? + if (mCurrentPaths.size > 0 && mCurrentPaths[mCurrentPaths.size - 1].style == dp.style && !mCurrentPaths[mCurrentPaths.size - 1].isOver) { + dp2 = mCurrentPaths[mCurrentPaths.size - 1] + } else { + dp2 = DrawPath(null, dp.path, dp.width, dp.color, dp.style) + dp2.isOver = false + dp2.rect = dp.rect + mCurrentPaths.add(dp2) + if (mListener != null) { + mListener!!.onDraw() + } + } + val point = dp.pointList!![dp.pointList!!.size - 1] + dp2.pointList!!.add(point) + dp.pointList!!.remove(point) + } else if ((dp.style == CanvasStyle.WATER_LINE || dp.style == CanvasStyle.GREENLAND_LINE || dp.style == CanvasStyle.PARKING_LINE) + && !dp.isOver + ) { + val dp2: DrawPath? + if (mCurrentPaths.size > 0 && mCurrentPaths[mCurrentPaths.size - 1].style == dp.style && !mCurrentPaths[mCurrentPaths.size - 1].isOver) { + dp2 = mCurrentPaths[mCurrentPaths.size - 1] + } else { + dp2 = DrawPath(null, dp.path, dp.width, dp.color, dp.style) + dp2.isOver = false + dp2.rect = dp.rect + mCurrentPaths.add(dp2) + if (mListener != null) { + mListener!!.onDraw() + } + } + val point = dp.pointList!![dp.pointList!!.size - 1] + if (dp2.pointList!!.size > 1) { + dp2.pointList!!.removeAt(dp2.pointList!!.size - 1) + } + dp2.pointList!!.add(point) + dp2.pointList!!.add(dp2.pointList!![0]) + dp.pointList!!.remove(point) + } else { + mCurrentPaths.add(dp) + if (mListener != null) { + mListener!!.onDraw() + } + } + //将取出的路径重绘在画布上 + if (dp.style == CanvasStyle.POLY_LINE) { + val dp2 = mCurrentPaths[mCurrentPaths.size - 1] + dp2.path.reset() + if (dp2.pointList != null && dp2.pointList!!.size > 0) { + for (i in dp2.pointList!!.indices) { + val point = dp2.pointList!![i] + mPaintCircular.color = dp2.color + if (i == 0) { + mCanvas!!.drawCircle( + point.x.toFloat(), + point.y.toFloat(), + 2f, + mPaintCircular + ) + dp2.path.moveTo(point.x.toFloat(), point.y.toFloat()) + } else { + dp2.path.lineTo(point.x.toFloat(), point.y.toFloat()) + } + } + } + mCanvas!!.drawPath(dp2.path, dp2.getPaint(mPaint)!!) + } else if (dp.style == CanvasStyle.RAILWAY_LINE) { + val dp2 = mCurrentPaths[mCurrentPaths.size - 1] + dp2.path.reset() + if (dp2.pointList != null && dp2.pointList!!.size > 0) { + for (i in dp2.pointList!!.indices) { + val point = dp2.pointList!![i] + if (i == 0) { + dp2.path.moveTo(point.x.toFloat(), point.y.toFloat()) + } else { + dp2.path.lineTo(point.x.toFloat(), point.y.toFloat()) + } + } + } + mCanvas!!.drawPath(dp2.path, mPaintRailway1) + mCanvas!!.drawPath(dp2.path, mPaintRailway2) + } else if (dp.style == CanvasStyle.GREENLAND_LINE) { + val dp2 = mCurrentPaths[mCurrentPaths.size - 1] + initCanvas() + dp2.path.reset() + if (dp2.pointList != null && dp2.pointList!!.size > 0) { + for (i in dp2.pointList!!.indices) { + val point = dp2.pointList!![i] + if (i == 0) { + mCanvas!!.drawCircle( + point.x.toFloat(), + point.y.toFloat(), + 2f, + mPaintCircular + ) + dp2.path.moveTo(point.x.toFloat(), point.y.toFloat()) + } else { + dp2.path.lineTo(point.x.toFloat(), point.y.toFloat()) + } + } + } + mCanvas!!.drawPath(dp2.path, mPaintGreenland) + mCanvas!!.drawPath(dp2.path, mPaintGreenland1) + } else if (dp.style == CanvasStyle.WATER_LINE) { + val dp2 = mCurrentPaths[mCurrentPaths.size - 1] + initCanvas() + dp2.path.reset() + if (dp2.pointList != null && dp2.pointList!!.size > 0) { + for (i in dp2.pointList!!.indices) { + val point = dp2.pointList!![i] + if (i == 0) { + mCanvas!!.drawCircle( + point.x.toFloat(), + point.y.toFloat(), + 2f, + mPaintCircular + ) + dp2.path.moveTo(point.x.toFloat(), point.y.toFloat()) + } else { + dp2.path.lineTo(point.x.toFloat(), point.y.toFloat()) + } + } + } + mCanvas!!.drawPath(dp2.path, mPaintWater) + mCanvas!!.drawPath(dp2.path, mPaintWater1) + } else if (dp.style == CanvasStyle.PARKING_LINE) { + val dp2 = mCurrentPaths[mCurrentPaths.size - 1] + initCanvas() + dp2!!.path.reset() + if (dp2.pointList != null && dp2.pointList!!.size > 0) { + for (i in dp2.pointList!!.indices) { + val point = dp2.pointList!![i] + if (i == 0) { + mCanvas!!.drawCircle( + point.x.toFloat(), + point.y.toFloat(), + 2f, + mPaintCircular + ) + dp2.path.moveTo(point.x.toFloat(), point.y.toFloat()) + } else { + dp2.path.lineTo(point.x.toFloat(), point.y.toFloat()) + } + } + } + mCanvas!!.drawPath(dp2.path, mPaintParking) + mCanvas!!.drawPath(dp2.path, mPaintParking1) + } else if (dp.style == CanvasStyle.CIRCULAR_POINT) { + mPaintCircular.color = dp.color + mCanvas!!.drawCircle( + dp.pointList!![0].x.toFloat(), + dp.pointList!![0].y.toFloat(), + dp.width.toFloat(), + mPaintCircular + ) + } else { + mCanvas!!.drawPath(dp.path, dp.getPaint(mPaint)!!) + } + //将该路径从删除的路径列表中去除 + if ((dp.style == CanvasStyle.POLY_LINE + || dp.style == CanvasStyle.RAILWAY_LINE) + && !dp.isOver + ) { + if (dp.pointList!!.size == 0) { + mDeletePaths.remove(dp) + } + } else if ((dp.style == CanvasStyle.WATER_LINE || dp.style == CanvasStyle.GREENLAND_LINE || dp.style == CanvasStyle.PARKING_LINE) + && !dp.isOver + ) { + if (dp.pointList!!.size == 0) { + mDeletePaths.remove(dp) + } + } else { + mDeletePaths.removeAt(mDeletePaths.size - 1) + } + invalidate() + } + } + + /* + * 清空的主要思想就是初始化画布 + * 将保存路径的两个List清空 + * */ + fun removeAllPaint() { + //调用初始化画布函数以清空画布 + initCanvas() + invalidate() //刷新 + mPath = null + mDrawPath = null + mCurrentPaths.clear() + mDeletePaths!!.clear() + } + + /** + * 设置画笔粗细 + * + * @param paintWidth + */ + fun setPaintWidth(paintWidth: Int) { + mPaintWidth = paintWidth + if (mPaint != null) { + mPaint.strokeWidth = mPaintWidth.toFloat() + } + } + + /** + * 设置画笔颜色 + * + * @param color + */ + fun setPaintColor(color: Int) { + mPaintColor = color + if (mPaint != null) { + mPaint.color = mPaintColor + } + } + + /** + * 将图形数据绘制在画布上 + * + * @param value + */ + fun setDrawPathList(value: MutableList) { + mPath = null + mCurrentPaths = value + if (mListener != null) { + mListener!!.onDraw() + } + mDeletePaths!!.clear() + if (mCanvas != null) { + if (mCurrentPaths.size > 0) { + for (dp in mCurrentPaths) { + if (dp.style == CanvasStyle.RAILWAY_LINE) { + dp.path.reset() + for (i in dp.pointList!!.indices) { + if (i == 0) { + dp.path.moveTo( + dp.pointList!![i].x.toFloat(), + dp.pointList!![i].y.toFloat() + ) + } else { + dp.path.lineTo( + dp.pointList!![i].x.toFloat(), + dp.pointList!![i].y.toFloat() + ) + } + } + mCanvas!!.drawPath(dp.path, mPaintRailway1) + mCanvas!!.drawPath(dp.path, mPaintRailway2) + } else if (dp.style == CanvasStyle.GREENLAND_LINE) { + mCanvas!!.drawPath(dp.path, mPaintGreenland) + mCanvas!!.drawPath(dp.path, mPaintGreenland1) + } else if (dp.style == CanvasStyle.WATER_LINE) { + mCanvas!!.drawPath(dp.path, mPaintWater) + mCanvas!!.drawPath(dp.path, mPaintWater1) + } else if (dp.style == CanvasStyle.PARKING_LINE) { + mCanvas!!.drawPath(dp.path, mPaintParking) + mCanvas!!.drawPath(dp.path, mPaintParking1) + } else if (dp.style == CanvasStyle.CIRCULAR_POINT) { + mPaintCircular.color = dp.color + mCanvas!!.drawCircle( + dp.pointList!![0].x.toFloat(), + dp.pointList!![0].y.toFloat(), + dp.width.toFloat(), + mPaintCircular + ) + } else if (dp.style == CanvasStyle.POLY_LINE) { + mPaintCircular.color = dp.color + dp.path.reset() + for (i in dp.pointList!!.indices) { + if (i == 0) { + mCanvas!!.drawCircle( + dp.pointList!![i].x.toFloat(), + dp.pointList!![i].y.toFloat(), + 2f, + mPaintCircular + ) + dp.path.moveTo( + dp.pointList!![i].x.toFloat(), + dp.pointList!![i].y.toFloat() + ) + } else { + dp.path.lineTo( + dp.pointList!![i].x.toFloat(), + dp.pointList!![i].y.toFloat() + ) + } + } + mCanvas!!.drawPath(dp.path, dp.getPaint(mPaint)!!) + } else { + mCanvas!!.drawPath(dp.path, dp.getPaint(mPaint)!!) + } + canvasStyle = dp.style + } + } + mPaint!!.color = mPaintColor + } + invalidate() // 刷新 + } + + override fun onDraw(canvas: Canvas) { + super.onDraw(canvas) + canvas.drawBitmap(mBitmap!!, 0f, 0f, mBitmapPaint) //显示旧的画布 + if (mPath != null) { + // 实时的显示 + if (isMove) { + if (canvasStyle == CanvasStyle.CIRCULAR_POINT) { + mMatrixCircular.reset() + mMatrixCircular.postTranslate( + mMoveX - mStarBitmap.width / 2, + mMoveY - mCircularP + ) + canvas.drawBitmap(mStarBitmap, mMatrixCircular, null) + } else if (canvasStyle == CanvasStyle.STRAIGHT_LINE) { + if (mDrawPath != null && mDrawPath!!.pointList!!.size > 0) { + val x = mDrawPath!!.pointList!![0].x + val y = mDrawPath!!.pointList!![0].y + val Y2 = mMoveY - mCircularP + mStarBitmap.height / 2 + canvas.drawLine(x.toFloat(), y.toFloat(), mMoveX, Y2, mPaint!!) + } + mMatrixCircular.reset() + mMatrixCircular.postTranslate( + mMoveX - mStarBitmap.width / 2, + mMoveY - mCircularP + ) + canvas.drawBitmap(mStarBitmap, mMatrixCircular, null) + } else if (canvasStyle == CanvasStyle.POLY_LINE) { + if (mDrawPath != null && mDrawPath!!.pointList!!.size > 0) { + val x = mDrawPath!!.pointList!![mDrawPath!!.pointList!!.size - 1].x + val y = mDrawPath!!.pointList!![mDrawPath!!.pointList!!.size - 1].y + val Y2 = mMoveY - mCircularP + mStarBitmap.height / 2 + canvas.drawLine(x.toFloat(), y.toFloat(), mMoveX, Y2, mPaint!!) + } + mMatrixCircular.reset() + mMatrixCircular.postTranslate( + mMoveX - mStarBitmap.width / 2, + mMoveY - mCircularP + ) + canvas.drawBitmap(mStarBitmap, mMatrixCircular, null) + } else if (canvasStyle == CanvasStyle.RECT_LINE) { + if (mDownX > mMoveX && mDownY > mMoveY) { + canvas.drawRect(mMoveX, mMoveY, mDownX, mDownY, mPaint!!) + } else if (mDownX < mMoveX && mDownY > mMoveY) { + canvas.drawRect(mDownX, mMoveY, mMoveX, mDownY, mPaint!!) + } else if (mDownX > mMoveX && mDownY < mMoveY) { + canvas.drawRect(mMoveX, mDownY, mDownX, mMoveY, mPaint!!) + } else { + canvas.drawRect(mDownX, mDownY, mMoveX, mMoveY, mPaint!!) + } + } else if (canvasStyle == CanvasStyle.ELLIPSE_LINE) { + if (mDownX > mMoveX && mDownY > mMoveY) { + canvas.drawOval(RectF(mMoveX, mMoveY, mDownX, mDownY), mPaint!!) + } else if (mDownX < mMoveX && mDownY > mMoveY) { + canvas.drawOval(RectF(mDownX, mMoveY, mMoveX, mDownY), mPaint!!) + } else if (mDownX > mMoveX && mDownY < mMoveY) { + canvas.drawOval(RectF(mMoveX, mDownY, mDownX, mMoveY), mPaint!!) + } else { + canvas.drawOval(RectF(mDownX, mDownY, mMoveX, mMoveY), mPaint!!) + } + } else { + if (canvasStyle == CanvasStyle.RAILWAY_LINE) { + canvas.drawPath(mPath!!, mPaintRailway1) + canvas.drawPath(mPath!!, mPaintRailway2) + } else if (canvasStyle == CanvasStyle.GREENLAND_LINE) { + canvas.drawPath(mPath!!, mPaintGreenland1) + } else if (canvasStyle == CanvasStyle.WATER_LINE) { + canvas.drawPath(mPath!!, mPaintWater1) + } else if (canvasStyle == CanvasStyle.PARKING_LINE) { + canvas.drawPath(mPath!!, mPaintParking1) + } else { + canvas.drawPath(mPath!!, mPaint!!) + } + } + } else { + + +// if (mStyle == CanvasStyle.RAILWAY_LINE) { +// canvas.drawPath(mPath, mPaintRailway1); +// canvas.drawPath(mPath, mPaintRailway2); +// } else { +// canvas.drawPath(mPath, mPaint); +// } + } + } + } + + override fun onTouchEvent(event: MotionEvent): Boolean { + val x = event.x + val y = event.y + when (event.action) { + MotionEvent.ACTION_DOWN -> if (isEraser) { + clearLine(x.toInt(), y.toInt()) + } else { +// if (mCurrentPaths != null && mCurrentPaths.size() > 0) { +// for (DrawPath dp : mCurrentPaths) { +// if (dp.style == CanvasStyle.GREENLAND_LINE || dp.style == CanvasStyle.WATER_LINE) { +// return true; +// } +// } +// } + isMove = false + if (canvasStyle == CanvasStyle.RAILWAY_LINE || canvasStyle == CanvasStyle.GREENLAND_LINE || canvasStyle == CanvasStyle.WATER_LINE || canvasStyle == CanvasStyle.PARKING_LINE) { + touch_start_poly(x.toInt(), y.toInt()) + return true + } else if (canvasStyle == CanvasStyle.CIRCULAR_POINT) { + mPath = Path() + mDrawPath = DrawPath(null, mPath!!, mPaintWidth + 5, mPaintColor, canvasStyle) + return true + } else if (canvasStyle == CanvasStyle.POLY_LINE) { + if (mDeletePaths != null && mDeletePaths.size > 0) { + mDeletePaths.clear() + } + if (mDrawPath != null && mDrawPath!!.style == CanvasStyle.POLY_LINE && !mDrawPath!!.isOver) { + return true + } + mPath = Path() + mDrawPath = DrawPath( + Point(x.toInt(), y.toInt()), + mPath!!, + mPaintWidth, + mPaintColor, + canvasStyle + ) + mDrawPath!!.isOver = false + return true + } else if (canvasStyle == CanvasStyle.STRAIGHT_LINE) { + if (mDeletePaths != null && mDeletePaths.size > 0) { + mDeletePaths.clear() + } + if (mDrawPath != null && mDrawPath!!.style == CanvasStyle.STRAIGHT_LINE && !mDrawPath!!.isOver) { + return true + } + mPath = Path() + mDrawPath = DrawPath( + Point(x.toInt(), y.toInt()), + mPath!!, + mPaintWidth, + mPaintColor, + canvasStyle + ) + mDrawPath!!.isOver = false + return true + } + mPath = Path() + mDrawPath = DrawPath( + Point(x.toInt(), y.toInt()), + mPath!!, + mPaintWidth, + mPaintColor, + canvasStyle + ) + touch_start(x, y) + } + MotionEvent.ACTION_MOVE -> { + if (isEraser) { + return true + } + if (canvasStyle == CanvasStyle.RAILWAY_LINE || canvasStyle == CanvasStyle.GREENLAND_LINE || canvasStyle == CanvasStyle.WATER_LINE || canvasStyle == CanvasStyle.PARKING_LINE) return true + +// if (mCurrentPaths != null && mCurrentPaths.size() > 0) { +// for (DrawPath dp : mCurrentPaths) { +// if (dp.style == CanvasStyle.GREENLAND_LINE || dp.style == CanvasStyle.WATER_LINE) { +// return true; +// } +// } +// } + isMove = true + if (x == mDownX && y == mDownY) return false + if (canvasStyle == CanvasStyle.POLY_LINE || canvasStyle == CanvasStyle.STRAIGHT_LINE || canvasStyle == CanvasStyle.RECT_LINE || canvasStyle == CanvasStyle.ELLIPSE_LINE || canvasStyle == CanvasStyle.CIRCULAR_POINT) { + touch_move(x, y) + } else { + if (contains( + mDownX.toInt(), + mDownY.toInt(), + x.toInt(), + y.toInt(), + ChouXiBanJing + ) + ) { + return true + } + touch_move_line(x, y) + } + invalidate() + } + MotionEvent.ACTION_UP -> { + if (isEraser) { + return true + } + if (canvasStyle == CanvasStyle.RAILWAY_LINE || canvasStyle == CanvasStyle.GREENLAND_LINE || canvasStyle == CanvasStyle.WATER_LINE || canvasStyle == CanvasStyle.PARKING_LINE) return true + // if (mCurrentPaths != null && mCurrentPaths.size() > 0) { +// for (DrawPath dp : mCurrentPaths) { +// if (dp.style == CanvasStyle.GREENLAND_LINE || dp.style == CanvasStyle.WATER_LINE) { +// return true; +// } +// } +// } + touch_up(x, y) + invalidate() + isMove = false + } + } + return true + } + + /** + * 橡皮擦捕捉清除 + * + * @param x + * @param y + */ + private fun clearLine(x: Int, y: Int) { + if (mCurrentPaths.size == 0) return + val rect = Rect(x - EraserWight, y - EraserWight, x + EraserWight, y + EraserWight) + for (i in mCurrentPaths.size - 1 downTo -1 + 1) { + val path = mCurrentPaths[i] + if (path.rect != null && path.rect!!.intersects( + rect.left, + rect.top, + rect.right, + rect.bottom + ) + ) { + if (LineIntersectRect(path.pointList, rect)) { + initCanvas() + mDeletePaths!!.add(path) + mCurrentPaths.remove(path) + for (dp in mCurrentPaths) { + if (dp.style == CanvasStyle.RAILWAY_LINE) { + dp.path.reset() + if (dp.pointList != null && dp.pointList!!.size > 0) { + for (k in dp.pointList!!.indices) { + if (k == 0) { + dp.path.moveTo( + dp.pointList!![k].x.toFloat(), + dp.pointList!![k].y.toFloat() + ) + } else { + dp.path.lineTo( + dp.pointList!![k].x.toFloat(), + dp.pointList!![k].y.toFloat() + ) + } + } + } + mCanvas!!.drawPath(dp.path, mPaintRailway1) + mCanvas!!.drawPath(dp.path, mPaintRailway2) + } else if (dp.style == CanvasStyle.GREENLAND_LINE) { + mCanvas!!.drawPath(dp.path, mPaintGreenland) + mCanvas!!.drawPath(dp.path, mPaintGreenland1) + } else if (dp.style == CanvasStyle.WATER_LINE) { + mCanvas!!.drawPath(dp.path, mPaintWater) + mCanvas!!.drawPath(dp.path, mPaintWater1) + } else if (dp.style == CanvasStyle.PARKING_LINE) { + mCanvas!!.drawPath(dp.path, mPaintParking) + mCanvas!!.drawPath(dp.path, mPaintParking1) + } else if (dp.style == CanvasStyle.CIRCULAR_POINT) { + mPaintCircular.color = dp.color + mCanvas!!.drawCircle( + dp.pointList!![0].x.toFloat(), + dp.pointList!![0].y.toFloat(), + dp.width.toFloat(), + mPaintCircular + ) + } else if (dp.style == CanvasStyle.POLY_LINE) { + mPaintCircular.color = dp.color + dp.path.reset() + if (dp.pointList != null && dp.pointList!!.size > 0) { + for (k in dp.pointList!!.indices) { + if (k == 0) { + mCanvas!!.drawCircle( + dp.pointList!![k].x.toFloat(), + dp.pointList!![k].y.toFloat(), + 2f, + mPaintCircular + ) + dp.path.moveTo( + dp.pointList!![k].x.toFloat(), + dp.pointList!![k].y.toFloat() + ) + } else { + dp.path.lineTo( + dp.pointList!![k].x.toFloat(), + dp.pointList!![k].y.toFloat() + ) + } + } + } + mCanvas!!.drawPath(dp.path, dp.getPaint(mPaint)!!) + } else { + mCanvas!!.drawPath(dp.path, dp.getPaint(mPaint)!!) + } + } + invalidate() // 刷新 + return + } + } + } + invalidate() + } + + /** + * 整条线段是否穿过矩形 + * + * @param pointList + * @param rect + * @return + */ + private fun LineIntersectRect(pointList: List?, rect: Rect?): Boolean { + if (pointList != null && pointList.size > 1 && rect != null && !rect.isEmpty) { + for (i in 0 until pointList.size - 1) { + if (CheckRectLine(pointList[i], pointList[i + 1], rect)) return true + } + } else if (pointList != null && pointList.size == 1) { + val point = pointList[0] + if (point.x >= rect!!.left && point.x <= rect.right && point.y >= rect.top && point.y <= rect.bottom) { + return true + } + } + return false + } + + /** + * 获取画布上的图形数据 + * + * @return + */ + val paths: List? + get() { + setPolyLineOver() + if (mCurrentPaths.size > 0) { + var i = 0 + while (i < mCurrentPaths.size) { + val drawPath = mCurrentPaths[i] + if (drawPath.style == CanvasStyle.POLY_LINE + || drawPath.style == CanvasStyle.RAILWAY_LINE + ) { + if (drawPath.pointList!!.size < 2) { + mCurrentPaths.remove(drawPath) + i-- + } + } else if (drawPath.style == CanvasStyle.WATER_LINE || drawPath.style == CanvasStyle.GREENLAND_LINE || drawPath.style == CanvasStyle.PARKING_LINE) { + if (drawPath.pointList!!.size < 4) { + mCurrentPaths.remove(drawPath) + i-- + } + } + i++ + } + } + return mCurrentPaths + } + + /** + * 得到缩略图 + * + * @return + */ + val thumbnail: Bitmap? + get() { + if (mCurrentPaths == null || mCurrentPaths!!.size == 0) { + return null + } + val whiteBgBitmap = Bitmap.createBitmap( + mBitmap!!.width, + mBitmap!!.height, + Bitmap.Config.ARGB_8888 + ) + val canvas = Canvas(whiteBgBitmap) + canvas.drawColor(Color.WHITE) + canvas.drawBitmap(mBitmap!!, 0f, 0f, null) + return ThumbnailUtils.extractThumbnail(whiteBgBitmap, 100, 100) + } + + /** + * 设置是否保存中间点信息 + * + * @param b + */ + fun setIsSavePoint(b: Boolean) { + isSavePoint = b + } + + /** + * 设置橡皮擦按钮是否开启或关闭 + * + * @param b + */ + fun setEraser(b: Boolean) { + isEraser = b + if (b) { + setPolyLineOver() + } + } + + /** + * 判断线与垂直线相交 + * + * @param startX + * @param startY + * @param endX + * @param endY + * @param x0 + * @param y1 + * @param y2 + * @return + */ + private fun CheckRectLineV( + startX: Float, + startY: Float, + endX: Float, + endY: Float, + x0: Float, + y1: Float, + y2: Float + ): Boolean { + if (x0 < startX && x0 < endX) return false + if (x0 > startX && x0 > endX) return false + if (startX == endX) { + return if (x0 == startX) { + if (startY < y1 && endY < y1) return false + !(startY > y2 && endY > y2) + } else { + false + } + } + val y = (endY - startY) * (x0 - startX) / (endX - startX) + startY + return y in y1..y2 + } + + /** + * 判断线与水平线相交 + * + * @param startX + * @param startY + * @param endX + * @param endY + * @param y0 + * @param x1 + * @param x2 + * @return + */ + private fun CheckRectLineH( + startX: Float, + startY: Float, + endX: Float, + endY: Float, + y0: Float, + x1: Float, + x2: Float + ): Boolean { + //直线在点的上方 + if (y0 < startY && y0 < endY) return false + //直线在点的下方 + if (y0 > startY && y0 > endY) return false + //水平直线 + if (startY == endY) { + //水平直线与点处于同一水平。 + return if (y0 == startY) { + //直线在点的左边 + if (startX < x1 && endX < x1) return false + //直线在x2垂直线右边 + !(startX > x2 && endX > x2) + //直线的部分或者全部处于点与x2垂直线之间 + } else //水平直线与点不处于同一水平。 + { + false + } + } + //斜线 + val x = (endX - startX) * (y0 - startY) / (endY - startY) + startX + return x in x1..x2 + } + + /** + * 直线是否穿过矩形 + * + * @param start + * @param end + * @param rect + * @return + */ + private fun CheckRectLine(start: Point, end: Point, rect: Rect): Boolean { + var result = false + if (rect.contains(start.x, start.y) || rect.contains(end.x, end.y)) result = true else { + if (CheckRectLineH( + start.x.toFloat(), + start.y.toFloat(), + end.x.toFloat(), + end.y.toFloat(), + rect.top.toFloat(), + rect.left.toFloat(), + rect.right.toFloat() + ) + ) return true + if (CheckRectLineH( + start.x.toFloat(), + start.y.toFloat(), + end.x.toFloat(), + end.y.toFloat(), + rect.bottom.toFloat(), + rect.left.toFloat(), + rect.right.toFloat() + ) + ) return true + if (CheckRectLineV( + start.x.toFloat(), + start.y.toFloat(), + end.x.toFloat(), + end.y.toFloat(), + rect.left.toFloat(), + rect.top.toFloat(), + rect.bottom.toFloat() + ) + ) return true + if (CheckRectLineV( + start.x.toFloat(), + start.y.toFloat(), + end.x.toFloat(), + end.y.toFloat(), + rect.right.toFloat(), + rect.top.toFloat(), + rect.bottom.toFloat() + ) + ) return true + } + return result + } + + /** + * 两个矩形是否包含 + * + * @param x1 + * @param y1 + * @param x2 + * @param y2 + * @param dis + * @return + */ + private fun contains(x1: Int, y1: Int, x2: Int, y2: Int, dis: Int): Boolean { + val rect = Rect(x1 - dis, y1 - dis, x1 + dis, y1 + dis) + return rect.contains(x2, y2) + } + + companion object { + /* + 橡皮擦捕捉半径 + */ + private const val EraserWight = 12 + + /** + * 线点 抽稀半径 + */ + private const val ChouXiBanJing = 12 //抽稀半径 + + /** + * 手指滑动的距离,两点之间像素值少于4 的点不要 + */ + private const val TOUCH_TOLERANCE = 4f + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/note/CanvasViewHelper.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/note/CanvasViewHelper.kt new file mode 100644 index 00000000..fc0e1805 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/note/CanvasViewHelper.kt @@ -0,0 +1,424 @@ +package com.navinfo.omqs.ui.fragment.note + +import android.graphics.Path +import android.graphics.Point +import android.graphics.Rect +import android.graphics.RectF +import android.text.TextUtils +import com.navinfo.collect.library.data.entity.NoteBean +import com.navinfo.collect.library.data.entity.SketchAttachContent +import com.navinfo.collect.library.map.NIMapController +import com.navinfo.collect.library.utils.GeometryTools +import com.navinfo.omqs.ui.fragment.note.CanvasView.CanvasStyle +import io.realm.RealmList +import org.locationtech.jts.geom.Coordinate +import org.oscim.backend.canvas.Color +import org.oscim.core.GeoPoint +import java.util.UUID +import kotlin.math.abs +import kotlin.math.cos +import kotlin.math.sin + +/** + * @author zhjch + * @version V1.0 + * @ClassName: CanvasViewHelper + * @Date 2016/5/16 + * @Description: ${TODO}(用一句话描述该文件做什么) + */ +object CanvasViewHelper { + private const val mD2I = 3600000 + fun createNoteBean( + controller: NIMapController, + mCurrentPaths: List, + ): NoteBean { + val noteBean = NoteBean(UUID.randomUUID().toString()) + if (mCurrentPaths.isNotEmpty()) { + val list: RealmList = RealmList() + noteBean.list = list + for (index in mCurrentPaths.indices) { + val dp: CanvasView.DrawPath = mCurrentPaths[index] + val geo = SketchAttachContent(UUID.randomUUID().toString()) + val pointList = dp.pointList ?: continue + if (dp.style === CanvasStyle.GREENLAND_LINE || dp.style === CanvasStyle.WATER_LINE || dp.style === CanvasStyle.PARKING_LINE) { + val geoPointList = mutableListOf() + for (i in pointList.indices) { + val point = pointList[i] + val geoPoint: GeoPoint = controller.viewportHandler.fromScreenPoint( + point + ) + geoPointList.add(geoPoint) + if (index == 0 && i == 0) { + noteBean.guideGeometry = + GeometryTools.createGeometry(geoPoint).toText() + } + } + geo.style = createLineStyle(dp.style, dp.width, dp.color) + geo.geometry = GeometryTools.createPolygon(geoPointList).toText() + } else if (dp.style === CanvasStyle.CIRCULAR_POINT) { + val point = pointList[0] + val geoPoint: GeoPoint = controller.viewportHandler.fromScreenPoint(point) + geo.style = createLineStyle(dp.style, dp.width, dp.color) + geo.geometry = GeometryTools.createGeometry(geoPoint).toText() + noteBean.guideGeometry = geo.geometry + } else if (dp.style === CanvasStyle.ELLIPSE_LINE) { + dp.rect?.let { + val pointLT = Point(it.left, it.top) + val pointRB = Point(it.right, it.bottom) + val geoPointLT: GeoPoint = + controller.viewportHandler.fromScreenPoint(pointLT) + val geoPointRB: GeoPoint = + controller.viewportHandler.fromScreenPoint(pointRB) + val minX: Double + val maxX: Double + val minY: Double + val maxY: Double + if (geoPointLT.longitude < geoPointRB.longitude) { + minX = (geoPointLT.longitude * mD2I) + maxX = (geoPointRB.longitude * mD2I) + } else { + minX = (geoPointRB.longitude * mD2I) + maxX = (geoPointLT.longitude * mD2I) + } + if (geoPointLT.latitude < geoPointRB.latitude) { + minY = (geoPointLT.latitude * mD2I) + maxY = (geoPointRB.latitude * mD2I) + } else { + minY = (geoPointRB.latitude * mD2I) + maxY = (geoPointLT.latitude * mD2I) + } + val xR = (maxX - minX) / 2 + val yR = (maxY - minY) / 2 + var a = 0.0 + var tempX = xR * cos(a) + xR + minX + val tempY = yR * sin(a) + yR + minY + val firstX = tempX + val geoPointList = mutableListOf() + geoPointList.add(GeoPoint(tempX / mD2I, tempY / mD2I)) + var bLeft = false + var bRight = false + var zeng = 0.1 + if (controller.mMapView.mapLevel >= 20) { + zeng = 0.2 + } + while (!bLeft || !bRight) { + a += zeng + val x1 = (xR * cos(a) + xR + minX).toInt().toDouble() + val y1 = (yR * sin(a) + yR + minY).toInt().toDouble() + if (!bLeft && x1 > tempX) { + bLeft = true + } + if (!bRight && bLeft && x1 <= tempX) { + bRight = true + geoPointList.add( + GeoPoint( + firstX / mD2I, + tempY / mD2I + ) + ) + } else { + tempX = x1 + geoPointList.add(GeoPoint(x1 / mD2I, y1 / mD2I)) + } + } + if (index == 0) { + noteBean.guideGeometry = + GeometryTools.createGeometry(geoPointList[0]).toText() + } + geo.style = createLineStyle(dp.style, dp.width, dp.color) + geo.geometry = GeometryTools.createLineString(geoPointList).toText() + } + } else { + val geoPointList = mutableListOf() + for (i in pointList.indices) { + val point = pointList[i] + val geoPoint: GeoPoint = + controller.viewportHandler.fromScreenPoint(point) + geoPointList.add(geoPoint) + if (index == 0 && i == 0) { + noteBean.guideGeometry = + GeometryTools.createGeometry(geoPoint).toText() + } + } + geo.style = createLineStyle(dp.style, dp.width, dp.color) + geo.geometry = GeometryTools.createLineString(geoPointList).toText() + } + list.add(geo) + } + } + return noteBean + } + + fun createDrawPaths( + controller: NIMapController, + att: NoteBean + ): MutableList { + val contents: List = att.list + val drawPaths: MutableList = mutableListOf() + var width = 5 + var canvasStyle = CanvasStyle.FREE_LINE + var color = Color.BLACK + for (geo in contents) { + var max_x = 0 + var max_y = 0 + var min_x = 0 + var min_y = 0 + val style = geo.style + if (!TextUtils.isEmpty(style) && style.length > 3) { + try { + if (style.startsWith("4")) { + canvasStyle = CanvasStyle.RAILWAY_LINE + } else if (style.startsWith("5")) { + if (style.contains("cde3ac")) { + canvasStyle = CanvasStyle.GREENLAND_LINE + } else if (style.contains("abcaff")) { + canvasStyle = CanvasStyle.WATER_LINE + } else if (style.contains("fffe98")) { + canvasStyle = CanvasStyle.PARKING_LINE + } + } else { + val s = style.substring(0, 1) + if (TextUtils.equals(s, "2")) { + canvasStyle = CanvasStyle.STRAIGHT_LINE + } else if (TextUtils.equals(s, "3")) { + canvasStyle = CanvasStyle.RECT_LINE + } else if (TextUtils.equals(s, "6")) { + canvasStyle = CanvasStyle.POLY_LINE + } else if (TextUtils.equals(s, "7")) { + canvasStyle = CanvasStyle.ELLIPSE_LINE + } else if (TextUtils.equals(s, "9")) { + canvasStyle = CanvasStyle.CIRCULAR_POINT + } else if (TextUtils.equals(s, "1")) { + canvasStyle = CanvasStyle.FREE_LINE + } + width = style.substring(1, 3).toInt() + var colorStr = style.substring(3, style.length) + if (colorStr.length == 6) { + colorStr = "ff$colorStr" + } else if (colorStr.length == 8) { + } else { + colorStr = "ff000000" + } + color = colorStr.toLong(16).toInt() + } + } catch (e: Exception) { + e.printStackTrace() + } + val path = Path() + val pointList: MutableList = ArrayList() + if (canvasStyle === CanvasStyle.GREENLAND_LINE || canvasStyle === CanvasStyle.WATER_LINE || canvasStyle === CanvasStyle.PARKING_LINE) { +// val polygonGeometry: PolygonGeometry = geo.geo as PolygonGeometry +// if (polygonGeometry != null) { +// val xyz: Array> = polygonGeometry.getCoordinates() +// if (xyz != null && xyz.isNotEmpty() && xyz[0].size > 1) { +// var geoPoint: GeoPoint? = GeoPoint(xyz[0][0][0], xyz[0][0][1]) +// val movePoint: Point = .geoToScreen(geoPoint) +// max_x = movePoint.x +// max_y = movePoint.y +// min_x = movePoint.x +// min_y = movePoint.y +// path.reset() +// path.moveTo(movePoint.x.toFloat(), movePoint.y.toFloat()) +// pointList.add(Point(movePoint.x, movePoint.y)) +// for (i in 1 until xyz[0].size) { +// val x_y = xyz[0][i] +// if (x_y != null) { +// geoPoint = GeoPoint(x_y[0], x_y[1]) +// val point: Point = projection.geoToScreen(geoPoint) +// if (point.x > max_x) { +// max_x = point.x +// } +// if (point.x < min_x) { +// min_x = point.x +// } +// if (point.y > max_y) { +// max_y = point.y +// } +// if (point.y < min_y) { +// min_y = point.y +// } +// path.lineTo(point.x.toFloat(), point.y.toFloat()) +// pointList.add(point) +// } +// } +// path.close() +// } +// } +// val drawPath = +// CanvasView.DrawPath(pointList[0], path, width, color, canvasStyle) +// val rect = Rect(min_x, min_y, max_x, max_y) +// drawPath.rect = rect +// drawPath.pointList = pointList +// drawPaths.add(drawPath) + } else if (canvasStyle === CanvasStyle.CIRCULAR_POINT) { +// val pointGeometry: PointGeometry = geo.geo as PointGeometry +// if (pointGeometry != null && pointGeometry.getCoordinates() != null) { +// val geoPoint: GeoPoint = GeoPoint( +// pointGeometry.getCoordinates().get(0), +// pointGeometry.getCoordinates().get(1) +// ) +// val movePoint: Point = projection.geoToScreen(geoPoint) +// pointList.add(movePoint) +// val drawPath = DrawPath(movePoint, path, width, color, canvasStyle) +// val rect = Rect( +// movePoint.x - width - 20, +// movePoint.y - width - 20, +// movePoint.x + width + 20, +// movePoint.y + width + 20 +// ) +// drawPath.rect = rect +// drawPath.pointList = pointList +// drawPaths.add(drawPath) +// } + } else if (canvasStyle === CanvasStyle.ELLIPSE_LINE) { +// val lineGeometry = GeometryTools.createGeometry(geo.geometry) +// if (lineGeometry != null) { +// val xys: Array = lineGeometry.coordinates +// if (xys != null && xys.size > 1) { +// var geoPoint: GeoPoint? = GeoPoint(xys[0].y, xys[0].x) +// val movePoint: Point = projection.geoToScreen(geoPoint) +// max_x = movePoint.x +// max_y = movePoint.y +// min_x = movePoint.x +// min_y = movePoint.y +// path.reset() +// path.moveTo(movePoint.x.toFloat(), movePoint.y.toFloat()) +// pointList.add(Point(movePoint.x, movePoint.y)) +// for (i in 1 until xys.size) { +// val x_y = xys[i] +// geoPoint = GeoPoint(x_y[0], x_y[1]) +// val point: Point = projection.geoToScreen(geoPoint) +// if (point.x > max_x) { +// max_x = point.x +// } +// if (point.x < min_x) { +// min_x = point.x +// } +// if (point.y > max_y) { +// max_y = point.y +// } +// if (point.y < min_y) { +// min_y = point.y +// } +// pointList.add(point) +// } +// path.addOval( +// RectF( +// min_x.toFloat(), +// min_y.toFloat(), +// max_x.toFloat(), +// max_y.toFloat() +// ), Path.Direction.CW +// ) +// } +// } +// val drawPath = +// CanvasView.DrawPath(pointList[0], path, width, color, canvasStyle) +// val rect = Rect(min_x, min_y, max_x, max_y) +// drawPath.rect = rect +// drawPath.pointList = pointList +// drawPaths.add(drawPath) + } else { + val lineGeometry = GeometryTools.createGeometry(geo.geometry) + if (lineGeometry != null) { + val xys: Array = lineGeometry.coordinates + if (xys.size > 1) { + var geoPoint = GeoPoint(xys[0].y, xys[0].x) + val movePoint: Point = + controller.viewportHandler.toScreenPoint(geoPoint) + max_x = movePoint.x + max_y = movePoint.y + min_x = movePoint.x + min_y = movePoint.y + path.reset() + path.moveTo(movePoint.x.toFloat(), movePoint.y.toFloat()) + pointList.add(Point(movePoint.x, movePoint.y)) + for (i in 1 until xys.size) { + val x_y = xys[i] + geoPoint = GeoPoint(x_y.y, x_y.x) + val point: Point = + controller.viewportHandler.toScreenPoint(geoPoint) + if (point.x > max_x) { + max_x = point.x + } + if (point.x < min_x) { + min_x = point.x + } + if (point.y > max_y) { + max_y = point.y + } + if (point.y < min_y) { + min_y = point.y + } + if (canvasStyle === CanvasStyle.FREE_LINE) { + val dx = abs(point.x - movePoint.x).toFloat() + val dy = abs(point.y - movePoint.y).toFloat() + if (dx >= 4 || dy >= 4) { + path.quadTo( + movePoint.x.toFloat(), + movePoint.y.toFloat(), + ((point.x + movePoint.x) / 2).toFloat(), + ((point.y + movePoint.y) / 2).toFloat() + ) //源代码是这样写的,可是我没有弄明白,为什么要这样? + movePoint.x = point.x + movePoint.y = point.y + } + } else { + path.lineTo(point.x.toFloat(), point.y.toFloat()) + } + pointList.add(point) + } + } + } + val drawPath = + CanvasView.DrawPath(pointList[0], path, width, color, canvasStyle) + val rect = Rect(min_x, min_y, max_x, max_y) + drawPath.rect = rect + drawPath.pointList = pointList + drawPaths.add(drawPath) + } + } + } + return drawPaths + } + + private fun createLineStyle(canvasStyle: CanvasStyle, width: Int, color: Int): String { + val style = StringBuilder() + if (canvasStyle === CanvasStyle.RAILWAY_LINE) { + return "4060070c004ffffff16" + } else if (canvasStyle === CanvasStyle.GREENLAND_LINE) { + return "50200b050cde3ac" + } else if (canvasStyle === CanvasStyle.WATER_LINE) { + return "50200b050abcaff" + } else if (canvasStyle === CanvasStyle.PARKING_LINE) { + return "502a6a6a6fffe98" + } + if (canvasStyle === CanvasStyle.STRAIGHT_LINE) { + style.append("2") + } else if (canvasStyle === CanvasStyle.RECT_LINE) { + style.append("3") + } else if (canvasStyle === CanvasStyle.POLY_LINE) { + style.append("6") + } else if (canvasStyle === CanvasStyle.ELLIPSE_LINE) { + style.append("7") + } else if (canvasStyle === CanvasStyle.CIRCULAR_POINT) { + style.append("9") + } else { + style.append("1") + } + if (width < 10) { + style.append("0") + } + style.append(width.toString()) + try { + var colorString = Integer.toHexString(color).toString() + if (colorString.length == 8) { + colorString = TextUtils.substring(colorString, 2, 8) + } + style.append(colorString) + } catch (e: Exception) { + e.printStackTrace() + } + return style.toString() + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/note/NoteFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/note/NoteFragment.kt new file mode 100644 index 00000000..9d4cd8c2 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/note/NoteFragment.kt @@ -0,0 +1,135 @@ +package com.navinfo.omqs.ui.fragment.note + +import android.os.Bundle +import android.text.Editable +import android.text.TextWatcher +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.navigation.findNavController +import androidx.navigation.fragment.findNavController +import com.navinfo.omqs.R +import com.navinfo.omqs.databinding.FragmentNoteBinding +import com.navinfo.omqs.ui.dialog.FirstDialog +import com.navinfo.omqs.ui.fragment.BaseFragment +import com.navinfo.omqs.ui.other.shareViewModels +import dagger.hilt.android.AndroidEntryPoint + +@AndroidEntryPoint +class NoteFragment : BaseFragment(), View.OnClickListener { + private var _binding: FragmentNoteBinding? = null + private val binding get() = _binding!! + + private val viewModel by shareViewModels("note") + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View { + _binding = FragmentNoteBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + binding.sketchEraser.setOnClickListener(this) + binding.sketchClear.setOnClickListener(this) + binding.sketchForward.setOnClickListener(this) + binding.sketchBack.setOnClickListener(this) + binding.noteBarSave.setOnClickListener(this) + binding.noteBarCancel.setOnClickListener(this) + binding.noteBarDelete.setOnClickListener(this) + binding.noteDescription.addTextChangedListener(object : TextWatcher { + override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) { + } + + override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) { + } + + override fun afterTextChanged(s: Editable?) { + viewModel.noteBeanDescription = s.toString() + } + }) + /** + * 数据操作结束 + */ + viewModel.liveDataFinish.observe(viewLifecycleOwner) { + if (it) + onBackPressed() + } + + /** + * 画布初始化完成 + */ + + viewModel.liveDataCanvasViewInitFinished.observe(viewLifecycleOwner) { + if (it) + arguments?.let { b -> + val id = b.getString("NoteId", "") + if (id.isNotEmpty()) { + viewModel.initData(id) + } + } + } + } + + + override fun onStart() { + super.onStart() + activity?.run { + findNavController( + R.id.main_activity_middle_fragment + ).navigate(R.id.CanvasFragment) + } + } + + override fun onStop() { + super.onStop() + activity?.run { + findNavController( + R.id.main_activity_middle_fragment + ).navigateUp() + } + } + + override fun onClick(v: View) { + when (v) { + binding.sketchEraser -> { + viewModel.onEraser() + binding.sketchEraser.isSelected = viewModel.isEraser + } + binding.sketchBack -> { + viewModel.onBack() + } + binding.sketchForward -> { + viewModel.onForward() + } + binding.sketchClear -> { + viewModel.onClear() + } + binding.noteBarSave -> { + viewModel.onSaveData() + } + binding.noteBarDelete -> { + viewModel.deleteData(requireContext()) + } + binding.noteBarCancel -> { + //返回按钮点击 + val mDialog = FirstDialog(context) + mDialog.setTitle("提示?") + mDialog.setMessage("是否退出,请确认!") + mDialog.setPositiveButton( + "确定" + ) { _, _ -> + mDialog.dismiss() + onBackPressed() + } + mDialog.setNegativeButton("取消", null) + mDialog.show() + } + } + } + + override fun onBackPressed(): Boolean { + findNavController().navigateUp() + return true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/note/NoteViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/note/NoteViewModel.kt new file mode 100644 index 00000000..d5fd927c --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/note/NoteViewModel.kt @@ -0,0 +1,171 @@ +package com.navinfo.omqs.ui.fragment.note + +import android.content.Context +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.navinfo.collect.library.data.entity.NoteBean +import com.navinfo.collect.library.map.NIMapController +import com.navinfo.omqs.ui.dialog.FirstDialog +import dagger.hilt.android.lifecycle.HiltViewModel +import io.realm.Realm +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import javax.inject.Inject + +@HiltViewModel +class NoteViewModel @Inject constructor( + val mapController: NIMapController +) : ViewModel() { + + lateinit var canvasView: CanvasView + + + var mNoteBean: NoteBean? = null + + + var isEraser = false + + var noteBeanDescription = "" +// /** +// * 橡皮擦开关 +// */ +// val liveEraserData = MutableLiveData(false) +// +// /** +// * 清除按钮 +// */ +// val liveClearData = MutableLiveData(false) +// +// /** +// * 回退按钮 +// */ +// val liveBackData = MutableLiveData(false) +// +// /** +// * 撤销按钮 +// */ +// val liveForward = MutableLiveData(false) + + /** + * 处理结束关闭fragment + */ + val liveDataFinish = MutableLiveData(false) + + /** + * 通知页面画布初始化完成 + */ + val liveDataCanvasViewInitFinished = MutableLiveData(false) + + fun initCanvasView(canvasView: CanvasView) { + this.canvasView = canvasView + liveDataCanvasViewInitFinished.value = true + } + + + /** + * 通知橡皮擦开关 + */ + fun onEraser() { + isEraser = !isEraser + canvasView.setEraser(isEraser) +// liveEraserData.value = !liveEraserData.value!! + } + + /** + * 通知清除 + */ + fun onClear() { + canvasView.removeAllPaint() +// liveClearData.value = true + } + + /** + * 通知回退 + */ + fun onBack() { + canvasView.back() +// liveBackData.value = true + } + + /** + * 通知撤销回退 + */ + fun onForward() { + canvasView.forward() +// liveForward.value = true + } + + /** + * 保存数据 + */ + fun onSaveData() { + viewModelScope.launch(Dispatchers.IO) { + if (canvasView.paths != null && canvasView.paths!!.isNotEmpty()) { + var noteBean = + CanvasViewHelper.createNoteBean(mapController, canvasView.paths!!) + if (mNoteBean != null) { + noteBean.id = mNoteBean!!.id + noteBean.description = noteBeanDescription + } + mNoteBean = noteBean + val realm = Realm.getDefaultInstance() + realm.executeTransaction { + it.copyToRealmOrUpdate(noteBean) + } + mapController.markerHandle.addOrUpdateNoteMark(mNoteBean!!) + liveDataFinish.postValue(true) + } + } + } + + /** + * 删除数据 + */ + fun deleteData(context: Context) { + if (mNoteBean == null) { + liveDataFinish.postValue(true) + return + } else { + val mDialog = FirstDialog(context) + mDialog.setTitle("提示?") + mDialog.setMessage("是否删除标签,请确认!") + mDialog.setPositiveButton( + "确定" + ) { dialog, _ -> + dialog.dismiss() + viewModelScope.launch(Dispatchers.IO) { + val realm = Realm.getDefaultInstance() + realm.executeTransaction { + val objects = it.where(NoteBean::class.java) + .equalTo("id", mNoteBean!!.id).findFirst() + objects?.deleteFromRealm() + } + mapController.markerHandle.removeNoteMark(mNoteBean!!) + liveDataFinish.postValue(true) + } + } + mDialog.setNegativeButton("取消", null) + mDialog.show() + } + } + + /** + * 初始化数据 + */ + fun initData(id: String) { + viewModelScope.launch(Dispatchers.IO) { + val realm = Realm.getDefaultInstance() + realm.executeTransaction { it -> + val objects = it.where(NoteBean::class.java) + .equalTo("id", id).findFirst() + mNoteBean = realm.copyFromRealm(objects) + mNoteBean?.let { bean -> + noteBeanDescription = bean.description + val list = CanvasViewHelper.createDrawPaths(mapController, bean) + canvasView.setDrawPathList(list) + } + } + } + } +} \ No newline at end of file diff --git a/app/src/main/res/drawable-xxhdpi/home_map_center.png b/app/src/main/res/drawable-xxhdpi/home_map_center.png new file mode 100644 index 0000000000000000000000000000000000000000..f255a8a3a8b0d577da06a5c9ef313b5049ae0e60 GIT binary patch literal 2150 zcmaJ?eK?f)8XiPZR)t!Trcoj0M{#11e6BOvwC9iGyw~-9n5nKqz}YMU z!UyY#@#K@iQ1?|H@DFU z_y-6SMnL>w%Gc8yPUZJ{wGj1w)G&d^CWR?p6h>|^VXKKc{Zn?x>mXP)b}7)+3W&kR}ThHo5El_`rRoc zn)ui0>pr10lHLy?y1OaBq1~Yr?YJMcuc${iR1wXB_I_zeS8JR@bQkQBn(D_;lWPA# z3Z!Mp1H7kw-`$M&`txgy+{%pYA?Ed(}xt2E< zONMpDV{S0>r%rzA#$~jP>*68g-Xn=R@|`1Uic8{|JBVWW)E8^H(C*_$8-7xaiX#>r z4%K=ijTqX^*YVeI89uh;AJ8aL%Y2L}Dz7@h=Bf0;+OiHR2#=}KuU1u1RQX~45ldAy z*}lP{9X4t&Np9XU#d;_Gs6A-)irWxo~!Vdh~{D#p?Tw*1`Gc8{f7|x-H%X-g2^#e|ajQfVlKH zc2M8QZlS?ABqr1M!in{<6=dv*-ul~bG(vT3RXf#Mc-{SZ$iR%)kfr0XHml-9Fn8#v2Owr^Pm3f9m<~G*Rcj0 z)xuR30t#~@fBA#BKxxuOW2N4x2Vfphl!31qWWH{C#+B|5@yi@pEj!;Vm%9p^y8EG4 zi_R&w&NR)V##L^|l(Y&IqM#8hf|xm`OC}XX#6D`VdhT7D_HB2v$aKQj=>3Zz+(D1E zR>HbXT-G%In#qN9y~xz2_i5`UZNDle_bXzsxetIY=RP3cFD$mMRP&sm^QnFAbJf4e zi29OSZ@U-cRZ`n`V(T^@<`~Am8n)OHGKa!_76V1(U^KyYdflIVPpPCp7C<*>`7uzMuId)uhi(~nwh?2{=3XV099yh_&RY&;}MX2E&S?I zOUjhts0}J$Fn?k`%D9-3H2a25EVTo?Mn@W1rPFG{i7{znpiF%1=fyzHzPY)8-z|H_TFRsgKKZ{lRHaq>DSk{_q0go| z5cYegKB*T@nr6oCH0>SpPxjgK&x7L6N-ovXE0}JLSucWWqhC+p*7G8(Kj(+d<#{Z& z=*(B#Sx&|wgDdYi#J|(42q-sM5H-lZX#T!-+{A1(nwKMP?wY5$czGvasUs(AE;!g7 zpYt6u>^@TD)HB|Qb8K1rt+IC^$8y%8vOeK*4gK?`16lE(sShNE%3fTZw=Y@vcjSQd zB-Wrf+Z6NDSHog`+?A^(xEpz|q+PLv7k+CLDavCW8v1?RHfT%D(9Jdo_rzr^pLS^* z4EXyjwKQI9d8rh1sND1NwtsH%J;q~;>;qeu$kM5rhtf$Iley@2Q3V#-q}6S(Y}vc{ O=XZDUqWtVkkNXcrmz(AQ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/sketch_back.png b/app/src/main/res/drawable-xxhdpi/sketch_back.png new file mode 100644 index 0000000000000000000000000000000000000000..b42d27ec013b304ba3cd620cd4a606bb6d9a39e5 GIT binary patch literal 1577 zcmaJ>dr;GM9FKHZ5Il5Qy3!;jffnZD5IN>K zJ)cvw=c>%}>9ar;N#mdx7AIIlXc8!q!l)QcN=D;E6>a15gv)_}js_dkUh zV=09r2Am;_X$v>Fe4#%SB~#J3i6vW#pnWa!-T2+!lED>X>SrV0Uh^r$dwi4W`rAY@kP_fK5axRh)^#-}tk#k8Nk&AH2ApW`jYtBPg zoO%4)Vb^kpVc+8fXLg!%^+o)_EC2}Dqf;x4E^m9aKEs$jp{@5|H9kYwv|K6d-1*ZC zMXU10cX8qD{<^En_wO!o2!l3*S=qp*|tSx?BRz~;;YPh~y1h4ZL=@V)+qplRg`O0IO?9zXY)=sebfi7s~)TwEN}bMnRd z2|ZD5=H0i(s(puAW*;q?*cMkbvCB$?wgmJW9H!m$abuE$#{3P8S zM)yZIfA%wQ&(kTauzLdHHST)r#uI$Od-D1X?2XD+Jd6KQcYn^qoDZf(wcAJc#xzDL zypoc+N00X$saqs4j9L<;mG8Xs>4hZ?Tbs7u`Bl(kEP6C$=eDI)?wtN@i=)?g&#wJ4 zBl@nP^?juoyh#Kw=MYF6VOQ~i`5HH))!;WcNVi)Y!@%2 zsXAni{Y4YuOMISeaym9t);>=@SkoA?qW`NJ>H7{}YuMB)*H;UWu)dOD!Q>i#>YvAI uy*-MJUGD<(8$a*(Au8h8*T1iO6%Y#K1FoBpkSh28ymgvP^%3Q=HU9wFy-?}^ literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/sketch_eraser.png b/app/src/main/res/drawable-xxhdpi/sketch_eraser.png new file mode 100644 index 0000000000000000000000000000000000000000..cb57b212d69fbf5c16dcfbc2dadef5c862bca201 GIT binary patch literal 1599 zcmeAS@N?(olHy`uVBq!ia0vp^zCf(c!3HFknYup&Qj#UE5hcO-X(i=}MX3yqDfvmM z3ZA)%>8U}fi7AzZCsS=07?>3^Ln2Bde0{8v^KDjP)EVYz|dIVz*yhVSl7_V%D~df&{P2mlz_GsrKDK}xwt{?0`hE?GD=Dctn~HE z%ggo3jrH=2()A53EiLs8jP#9+bb%^#i!1X=5-W7`ij`p|xTF>*7iAWdWaj57fJ{tG z$}cUkRRX#c;)UD-UthSvdBxCx0tT6WMPh-zp`L+$ZZ61QVAaJXL8%C5U{zflQdy9y zACy|0Us{w5jE^*Bm}X$u;kO8+5a=2!m;B_?+|;}hPZwJypom^dW{Q=Yi>sxZk*m3( zg_E11p{tpbrHP@dsj;cCk+FfRv9TpguV-FyNn&1dDok%CLa!NKy;jaesfi`|MIrh5 zIk4CZ$jC3rFV4s>P;hou&0-Y)b z6AT18^;iNM7hdxInii50$DygE!n8YhAIqg+I~A>83sxvBap8}eA->DT!|kcFxyqD) zS^tj4HSra@^}RbMb3V?##$b-+=4T%^U%#2X)>yd9Mak=lpY{j-hB}=BS&$X@KiffQDJR8}nVE!tC zPdc3a($OtHqnPuKMK-D*tPWre>&}dtn(&zExk_V}!HLtUOw~JgpGnHm{6^yH zOw&2@@}{!?I;cD$YjS3_!$G0fXN5j6=4?M`va9WPTh_)vgQVunoCVNAn)+IouYG$MP8dpY(8l6Niv7-W^cCw@vn_!kEol-R&P$K7>X|a-O1+&D&U>_q=~qt1jrGkb%!O)G z@xnrBpWi3XmfRJJmd!dPud*xho0Gf6+`7igUiKE1`%Xld6#o`3 zxg6GLJtruC%Dip+!m9Yf-fWumoWE~|4n?mQA%_t5u1)aA7DgY91YirKO}3(r1YbcsKvX1NQW;{HbC zJ)d?Z@3Bwau#>+hbMvC=7&{BLd*=+lv|Q?cQnP$R|GK4|Cfc@ki|k6HeugOilt1{% o#~+kjIx~}I&Dgf*i+=+ngK$9Afi!EW|DYn>)78&qol`;+01+@!IsgCw literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/sketch_forward.png b/app/src/main/res/drawable-xxhdpi/sketch_forward.png new file mode 100644 index 0000000000000000000000000000000000000000..c48f4029d5e91694904a127f6d9f39a98577a510 GIT binary patch literal 1548 zcmaJ>drT8|9KV5}f;d({(P21?B8YA8N=vzu%K97y%cImt#30x9fKJ*wd&gQBZWQ7i zx{-|-U{kO|5X?mE$b?BY@BxD80#5h97mSG}M&|${3fXo=!2L0H$=&af&*$@feR8GA ziEsOOt@Z){z(*A)*Dz}+^KM$=$$Xa{zudztt7t_Uol0cUR?LC}5(A;bL6r&1#x*!* z$lue8#{hu)TBA0NPE&71^@NFwxiDOtiDcLS5EE-7G5v0w26cG0(JW^F(cZxZjRrA$ zyHE|ONg1AFj4QCm&uX=Dt&v>9lFfq=1mQt^9-q%)5F9GsOk*~VnF^UxkmHoz zVkBuJVFq1_n2yM!#cU?imnE3Ud08_x+a{)AJR3&xU@qh;X%47X|3B1ZnnzQ#27i_B ze+pCDd=lqraEi#Y=$XM~g}6eIsLX<6G-1&aMDAP{lXD1~pmGQjl*z!b?MAbKuu|bO zaJ3p$nJF4G>v5G_%w`0*Mxz0hi6BG>BO*9js(@idloXOEBnUqeik1kGD4BGQD<|}M zCfrQVaSgAy(F<~2PB4*7WI1jzzKa`_7QzJ1RE!!I&PBMO-YnO!a4t~`a(PTLJl9SH#11OVLZD!D{!8@y7L5T{KEywp5WHCUo?!&!Zh zw;Wzi*LwuSanl!_ZS-Z04Lpz*7I}-5U|oOcxttVE!CPQy@o(``-?d(_=$j|@0o}&b z-ig15t;75us;8=`@9qY_f8}9KWCudkh{6Sb?HUK~cd{l&&J-7os=4-X-||ppxO=d~ zDS+dbx84dc>JIr0xwnO@KQ8ymu(w~k7}lG)L=f+HY@J=w&sA?t3V!g3RgyehxyG|W zvLdW?&t6fq+hAu|ypv4^Xp327w_*)OE)gjDkbpjqr;Zgzwq3vW?6szY93|4O^KdM_ zHP*N*%DFSGvW1m!KXI_OEw=l>9UT_ols@r165BcOqUhd^s}~znJ3KG#t%`5#`l&cn z6B4syx+f^G>~YV^w)*MvFMw^CU11e&8Iu#wQZkC)@hyEkeRZf-F|2@mM$f(ec=O&=62R(mQG&K)- z#&$OiS+2jAy5~iD?U!dGPS(**{)LAhIP5F6H}XACjo;1rs(0L{`RKUT!54VYW5CU? z)5ChQWA`4SBPtG@?oV&1~dHxT+Sf zt`&YwU}oF43ALX;YpO5gex<+}aQej3grc9%3xbpG9oOxee6BL;s1Glk40EokdFowP z`q}lm(XosZmAV%a$IjYcHhy`P-5>@^;=@w#aW4qfjK=g>* TlGKI;x&F^8MWXzaG_&|0h*n9T literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/selector_sketch_eraser_bg.xml b/app/src/main/res/drawable/selector_sketch_eraser_bg.xml new file mode 100644 index 00000000..d891b1c8 --- /dev/null +++ b/app/src/main/res/drawable/selector_sketch_eraser_bg.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_vertical_dashed_line.xml b/app/src/main/res/drawable/shape_vertical_dashed_line.xml index 5aa1a4bd..b9ca9aa6 100644 --- a/app/src/main/res/drawable/shape_vertical_dashed_line.xml +++ b/app/src/main/res/drawable/shape_vertical_dashed_line.xml @@ -4,7 +4,7 @@ android:left="-300dp" android:right="-300dp"> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index eb4204c8..6a3dcc15 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -79,7 +79,7 @@ android:layout_width="0dp" android:layout_height="wrap_content" android:layout_marginRight="@dimen/top_right_drawer_btns_mr" - app:constraint_referenced_ids="main_activity_serach,main_activity_2d_3d,main_activity_camera,main_activity_trace,main_activity_calc_disance,main_activity_menu" + app:constraint_referenced_ids="main_activity_serach,main_activity_2d_3d,main_activity_camera,main_activity_trace,main_activity_calc_disance,main_activity_note,main_activity_menu" app:flow_horizontalGap="6dp" app:flow_wrapMode="aligned" app:layout_constraintRight_toLeftOf="@id/main_activity_right_fragment" @@ -90,7 +90,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:visibility="invisible" - app:constraint_referenced_ids="main_activity_serach,main_activity_2d_3d,main_activity_camera,main_activity_trace,main_activity_calc_disance" /> + app:constraint_referenced_ids="main_activity_serach,main_activity_2d_3d,main_activity_camera,main_activity_trace,main_activity_note,main_activity_calc_disance" /> + + - + app:layout_constraintRight_toLeftOf="@id/main_activity_right_fragment" /> + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_note.xml b/app/src/main/res/layout/fragment_note.xml new file mode 100644 index 00000000..6ee54057 --- /dev/null +++ b/app/src/main/res/layout/fragment_note.xml @@ -0,0 +1,235 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_phenomenon.xml b/app/src/main/res/layout/fragment_phenomenon.xml index 47d18747..73c73788 100644 --- a/app/src/main/res/layout/fragment_phenomenon.xml +++ b/app/src/main/res/layout/fragment_phenomenon.xml @@ -1,26 +1,32 @@ - - + - - \ No newline at end of file + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_problem_link.xml b/app/src/main/res/layout/fragment_problem_link.xml index d31f06f3..508cfe3e 100644 --- a/app/src/main/res/layout/fragment_problem_link.xml +++ b/app/src/main/res/layout/fragment_problem_link.xml @@ -2,13 +2,15 @@ + android:layout_width="@dimen/fragment_problem_link_width" + android:layout_height="match_parent" + android:background="@drawable/shape_middle_fragment_bg" + app:layout_constraintRight_toRightOf="parent" /> \ No newline at end of file diff --git a/app/src/main/res/navigation/middle_fragment_nav_graph.xml b/app/src/main/res/navigation/middle_fragment_nav_graph.xml index ef0d0a1d..b1897830 100644 --- a/app/src/main/res/navigation/middle_fragment_nav_graph.xml +++ b/app/src/main/res/navigation/middle_fragment_nav_graph.xml @@ -20,4 +20,10 @@ android:name="com.navinfo.omqs.ui.fragment.evaluationresult.ProblemLinkFragment" android:label="评测页面" tools:layout="@layout/fragment_problem_link"> + + \ No newline at end of file diff --git a/app/src/main/res/navigation/right_fragment_nav_graph.xml b/app/src/main/res/navigation/right_fragment_nav_graph.xml index 7aa23dc4..b47ba040 100644 --- a/app/src/main/res/navigation/right_fragment_nav_graph.xml +++ b/app/src/main/res/navigation/right_fragment_nav_graph.xml @@ -30,4 +30,11 @@ tools:layout="@layout/fragment_evaluation_result"> + + + \ No newline at end of file diff --git a/app/src/main/res/values/styleable.xml b/app/src/main/res/values/styleable.xml new file mode 100644 index 00000000..45612391 --- /dev/null +++ b/app/src/main/res/values/styleable.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 5193314e..7775f0a2 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,5 +1,20 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/icon_2083_7.svg b/collect-library/src/main/assets/omdb/icon_2083_7.svg new file mode 100644 index 00000000..934314e6 --- /dev/null +++ b/collect-library/src/main/assets/omdb/icon_2083_7.svg @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/icon_2083_9.svg b/collect-library/src/main/assets/omdb/icon_2083_9.svg new file mode 100644 index 00000000..06325cf4 --- /dev/null +++ b/collect-library/src/main/assets/omdb/icon_2083_9.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/icon_2202_0.svg b/collect-library/src/main/assets/omdb/icon_2202_0.svg index b2479462..51a69b01 100644 --- a/collect-library/src/main/assets/omdb/icon_2202_0.svg +++ b/collect-library/src/main/assets/omdb/icon_2202_0.svg @@ -1 +1,13 @@ - \ No newline at end of file + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapView.java b/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapView.java index f599fcb7..e10dd9a2 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapView.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapView.java @@ -36,6 +36,7 @@ import org.oscim.layers.tile.vector.labeling.LabelLayer; import org.oscim.layers.tile.vector.labeling.LabelTileLoaderHook; import org.oscim.map.Map; import org.oscim.renderer.GLViewport; +import org.oscim.scalebar.MapScaleBarLayer; import org.oscim.theme.IRenderTheme; import org.oscim.theme.ThemeLoader; import org.oscim.theme.VtmThemes; @@ -198,6 +199,11 @@ public final class NIMapView extends RelativeLayout { */ private OnMapTouchListener touchListener; + /** + * 比例尺控件 + */ + private MapScaleBarLayer mapScaleBarLayer; + public NIMapView(Context context, AttributeSet attrs) { this(context, attrs, 0); } @@ -252,7 +258,7 @@ public final class NIMapView extends RelativeLayout { // 增加比例尺图层 NaviMapScaleBar naviMapScaleBar = new NaviMapScaleBar(getVtmMap()); - naviMapScaleBar.initScaleBarLayer(GLViewport.Position.BOTTOM_CENTER, 128, 5); + mapScaleBarLayer = naviMapScaleBar.initScaleBarLayer(GLViewport.Position.BOTTOM_CENTER, 128, 5); // if (gridLayer == null) { // gridLayer = new TileGridLayer(getVtmMap()); @@ -878,6 +884,21 @@ public final class NIMapView extends RelativeLayout { } } + /** + * 设置比例尺位置 + * @param position + * @param xOffset + * @param yOffset + */ + public void setScaleBarLayer(GLViewport.Position position, int xOffset, int yOffset){ + if(mapScaleBarLayer!=null&&mapView.map().layers().contains(mapScaleBarLayer)){ + mapView.map().layers().remove(mapScaleBarLayer); + mapScaleBarLayer = null; + } + NaviMapScaleBar naviMapScaleBar = new NaviMapScaleBar(getVtmMap()); + mapScaleBarLayer = naviMapScaleBar.initScaleBarLayer(GLViewport.Position.BOTTOM_CENTER, xOffset, yOffset); + } + /** * 设置是否显示缩放控件 * From 29a90b5555e2062023c51ea0c1ce4ab0014ccbbc Mon Sep 17 00:00:00 2001 From: qiji4215 Date: Wed, 12 Jul 2023 13:55:05 +0800 Subject: [PATCH 06/40] =?UTF-8?q?=E6=9B=B4=E6=8D=A2=E9=9A=A7=E9=81=93?= =?UTF-8?q?=E8=B5=B7=E7=BB=88=E7=82=B9=E5=9D=90=E6=A0=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../omqs/ui/activity/map/MainActivity.kt | 2 +- .../src/main/assets/editormarker.xml | 4 +-- .../src/main/assets/omdb/icon_2083_7.svg | 12 ++++---- .../src/main/assets/omdb/icon_2083_7_1.svg | 8 +++++ .../src/main/assets/omdb/icon_2202_0.svg | 29 +++++++++++-------- .../src/main/assets/omdb/icon_2202_1.svg | 2 +- 6 files changed, 36 insertions(+), 21 deletions(-) create mode 100644 collect-library/src/main/assets/omdb/icon_2083_7_1.svg 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 d6f34263..acf33336 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 @@ -512,7 +512,7 @@ class MainActivity : BaseActivity() { mapController.mMapView.setScaleBarLayer(GLViewport.Position.BOTTOM_CENTER, 128, 65) } mapController.mMapView.vtmMap.animator() - .animateTo(GeoPoint( mapController.mMapView.vtmMap.mapPosition.latitude,mapController.mMapView.vtmMap.mapPosition.latitude)) + .animateTo(GeoPoint( mapController.mMapView.vtmMap.mapPosition.geoPoint.latitude,mapController.mMapView.vtmMap.mapPosition.geoPoint.longitude)) } private fun voiceOnTouchStart() { diff --git a/collect-library/src/main/assets/editormarker.xml b/collect-library/src/main/assets/editormarker.xml index 00864bf8..06448ea1 100644 --- a/collect-library/src/main/assets/editormarker.xml +++ b/collect-library/src/main/assets/editormarker.xml @@ -1742,7 +1742,7 @@ - + @@ -1820,7 +1820,7 @@ - + + + - + - + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/icon_2083_7_1.svg b/collect-library/src/main/assets/omdb/icon_2083_7_1.svg new file mode 100644 index 00000000..6a3b8956 --- /dev/null +++ b/collect-library/src/main/assets/omdb/icon_2083_7_1.svg @@ -0,0 +1,8 @@ + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/icon_2202_0.svg b/collect-library/src/main/assets/omdb/icon_2202_0.svg index 51a69b01..2fb600b5 100644 --- a/collect-library/src/main/assets/omdb/icon_2202_0.svg +++ b/collect-library/src/main/assets/omdb/icon_2202_0.svg @@ -1,13 +1,18 @@ - - - - - + + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/icon_2202_1.svg b/collect-library/src/main/assets/omdb/icon_2202_1.svg index ed7be254..db0fef8a 100644 --- a/collect-library/src/main/assets/omdb/icon_2202_1.svg +++ b/collect-library/src/main/assets/omdb/icon_2202_1.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file From 23a3490c20885c9c7cf6fda3e76ab12d0f70d961 Mon Sep 17 00:00:00 2001 From: squallzhjch Date: Thu, 13 Jul 2023 14:09:58 +0800 Subject: [PATCH 07/40] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=AF=84=E6=B5=8Blink?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/navinfo/omqs/Constant.kt | 2 + .../com/navinfo/omqs/hilt/GlobalModule.kt | 10 +- .../omqs/ui/activity/map/MainActivity.kt | 32 +- .../ui/fragment/tasklink/TaskLinkFragment.kt | 169 +++++ .../tasklink/TaskLinkMiddleAdapter.kt | 49 ++ .../tasklink/TaskLinkMiddleFragment.kt | 77 +++ .../ui/fragment/tasklink/TaskLinkViewModel.kt | 202 ++++++ .../omqs/ui/fragment/tasklist/TaskFragment.kt | 11 +- .../ui/fragment/tasklist/TaskListAdapter.kt | 25 +- .../ui/fragment/tasklist/TaskListFragment.kt | 48 +- .../ui/fragment/tasklist/TaskViewModel.kt | 20 +- .../res/drawable-xxhdpi/icon_menu_note.png | Bin 0 -> 1704 bytes .../main/res/drawable-xxhdpi/icon_note.png | Bin 0 -> 1382 bytes ...xml => ripple_fragment_save_button_bg.xml} | 0 app/src/main/res/layout/activity_main.xml | 33 +- .../res/layout/adapter_task_link_info.xml | 17 + .../res/layout/fragment_evaluation_result.xml | 2 +- app/src/main/res/layout/fragment_note.xml | 21 +- .../main/res/layout/fragment_task_link.xml | 294 +++++++++ .../res/layout/fragment_task_link_middle.xml | 14 + .../navigation/middle_fragment_nav_graph.xml | 5 + .../navigation/right_fragment_nav_graph.xml | 8 +- .../src/main/assets/omdb/icon_4004_0.svg | 46 +- .../src/main/assets/omdb/icon_4010.svg | 25 +- .../library/data/entity/HadLinkDvoBean.kt | 11 +- .../collect/library/map/NIMapController.kt | 7 - .../map/handler/MeasureLayerHandler.kt | 577 +++++++++--------- .../collect/library/utils/StringUtil.kt | 1 - vtm | 2 +- 29 files changed, 1346 insertions(+), 362 deletions(-) create mode 100644 app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkFragment.kt create mode 100644 app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkMiddleAdapter.kt create mode 100644 app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkMiddleFragment.kt create mode 100644 app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt create mode 100644 app/src/main/res/drawable-xxhdpi/icon_menu_note.png create mode 100644 app/src/main/res/drawable-xxhdpi/icon_note.png rename app/src/main/res/drawable/{ripple_fragment_save_botton_bg.xml => ripple_fragment_save_button_bg.xml} (100%) create mode 100644 app/src/main/res/layout/adapter_task_link_info.xml create mode 100644 app/src/main/res/layout/fragment_task_link.xml create mode 100644 app/src/main/res/layout/fragment_task_link_middle.xml diff --git a/app/src/main/java/com/navinfo/omqs/Constant.kt b/app/src/main/java/com/navinfo/omqs/Constant.kt index a885a6ea..3e194ff9 100644 --- a/app/src/main/java/com/navinfo/omqs/Constant.kt +++ b/app/src/main/java/com/navinfo/omqs/Constant.kt @@ -92,6 +92,8 @@ class Constant { val OMDB_LAYER_VISIBLE_LIST: MutableList = mutableListOf() // 记录OMDB数据显示的图层名称列表 const val EVENT_LAYER_MANAGER_CHANGE = "EVENT_LAYER_MANAGER_CHANGE" // 图层管理中的配置修改 + + const val SELECT_TASK_ID = "select_task_id" //选中的任务ID } diff --git a/app/src/main/java/com/navinfo/omqs/hilt/GlobalModule.kt b/app/src/main/java/com/navinfo/omqs/hilt/GlobalModule.kt index c72b6022..f1c356d5 100644 --- a/app/src/main/java/com/navinfo/omqs/hilt/GlobalModule.kt +++ b/app/src/main/java/com/navinfo/omqs/hilt/GlobalModule.kt @@ -1,6 +1,8 @@ package com.navinfo.omqs.hilt import android.app.Application +import android.content.Context +import android.content.SharedPreferences import android.util.Log import androidx.room.Room import com.google.gson.Gson @@ -25,7 +27,6 @@ import io.realm.Realm import kotlinx.coroutines.* import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor -import retrofit2.Call import retrofit2.Retrofit import retrofit2.converter.gson.GsonConverterFactory import java.util.concurrent.TimeUnit @@ -38,6 +39,7 @@ import javax.inject.Singleton @InstallIn(SingletonComponent::class) class GlobalModule { + @Singleton @Provides fun provideApplication(@ApplicationContext application: Application): OMQSApplication { @@ -166,4 +168,10 @@ class GlobalModule { fun provideRealmDefaultInstance(): Realm { return Realm.getDefaultInstance() } + + @Singleton + @Provides + fun provideSharedPreferences(context: Application): SharedPreferences { + return context.getSharedPreferences("Shared" + Constant.USER_ID, Context.MODE_PRIVATE) + } } \ No newline at end of file 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 2234802e..962fdc13 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 @@ -460,6 +460,24 @@ class MainActivity : BaseActivity() { } } + /** + * 准星的显隐控制 + */ + fun setHomeCenterVisibility(visible: Int) { + binding.mainActivityHomeCenter.visibility = visible + binding.mainActivityHomeCenterText.visibility = visible + if (visible != View.VISIBLE) { + binding.mainActivityHomeCenterText.text = "" + } + } + + /** + * 设置屏幕中心文字内容 + */ + fun setHomeCenterText(str: String) { + binding.mainActivityHomeCenterText.text = str + } + /** * 隐藏或显示右侧展开按钮 */ @@ -472,6 +490,10 @@ class MainActivity : BaseActivity() { */ fun setTopMenuButtonVisibility(visibility: Int) { binding.mainActivityMenu.visibility = visibility + if (visibility != View.VISIBLE) { + binding.mainActivityMenuGroup.visibility = View.INVISIBLE + binding.mainActivityMenu.isSelected = false + } } /** @@ -601,8 +623,14 @@ class MainActivity : BaseActivity() { */ fun onClickNewNote() { rightController.navigate(R.id.NoteFragment) - binding.mainActivityMenu.isSelected = false - binding.mainActivityMenuGroup.visibility = View.INVISIBLE + } + + /** + * 新增评测link + */ + fun onClickTaskLink() { + rightController.navigate(R.id.TaskLinkFragment) + } /** diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkFragment.kt new file mode 100644 index 00000000..703e0d85 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkFragment.kt @@ -0,0 +1,169 @@ +package com.navinfo.omqs.ui.fragment.tasklink + +import android.os.Build +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.Toast +import androidx.fragment.app.viewModels +import androidx.navigation.findNavController +import androidx.navigation.fragment.findNavController +import com.navinfo.collect.library.map.NIMapController +import com.navinfo.omqs.R +import com.navinfo.omqs.databinding.FragmentTaskLinkBinding +import com.navinfo.omqs.ui.activity.map.MainActivity +import com.navinfo.omqs.ui.fragment.BaseFragment +import com.navinfo.omqs.ui.other.BaseToast +import com.navinfo.omqs.ui.other.shareViewModels +import dagger.hilt.android.AndroidEntryPoint +import javax.inject.Inject + +@AndroidEntryPoint +class TaskLinkFragment : BaseFragment(), View.OnClickListener { + private var _binding: FragmentTaskLinkBinding? = null + private val binding get() = _binding!! + + @Inject + lateinit var mapController: NIMapController + + private val viewModel by shareViewModels("taskLink") + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View { + _binding = FragmentTaskLinkBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + + binding.taskLinkAddPoint.setOnClickListener(this) + binding.taskLinkKind.setOnClickListener(this) + binding.taskLinkFunctionalLevel.setOnClickListener(this) + binding.taskLinkDataLevel.setOnClickListener(this) + binding.taskLinkBarCancel.setOnClickListener(this) + binding.taskLinkBarSave.setOnClickListener(this) + /** + * 数据操作结束 + */ + viewModel.liveDataFinish.observe(viewLifecycleOwner) { + if (it) + onBackPressed() + } + /** + * 种别 + */ + viewModel.liveDataSelectKind.observe(viewLifecycleOwner) { + binding.taskLinkKind.text = it?.title + } + + /** + * 功能等级 + */ + viewModel.liveDataSelectFunctionLevel.observe(viewLifecycleOwner) { + binding.taskLinkFunctionalLevel.text = it?.title + } + + /** + * 数据等级 + */ + viewModel.liveDataSelectDataLevel.observe(viewLifecycleOwner) { + binding.taskLinkDataLevel.text = it?.title + } + + /** + * 当前选中任务 + */ + viewModel.liveDataTaskBean.observe(viewLifecycleOwner) { + binding.taskLinkTaskName.text = it?.evaluationTaskName + } + + /** + * viewModel 返回的文字信息 + */ + viewModel.liveDataToastMessage.observe(viewLifecycleOwner) { + Toast.makeText(requireContext(), it, Toast.LENGTH_SHORT).show() + } + /** + * 线长度 + */ + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + mapController.measureLayerHandler.lineLenghtLiveData.observe(viewLifecycleOwner) { + binding.taskLinkLength.text = "${it}米" + } + mapController.measureLayerHandler.tempLineDistanceLiveData.observe(viewLifecycleOwner) { + (activity as MainActivity).setHomeCenterText(it) + } + } + } + + override fun onStart() { + super.onStart() + /** + * 显示地图准星 + */ + activity?.let { + (activity as MainActivity).setHomeCenterVisibility(View.VISIBLE) + } + } + + override fun onDestroy() { + super.onDestroy() + } + + override fun onStop() { + super.onStop() + /** + * 隐藏地图准星 + */ + requireActivity().findNavController(R.id.main_activity_middle_fragment).navigateUp() + activity?.let { + (activity as MainActivity).setHomeCenterVisibility(View.GONE) + } + } + + override fun onClick(v: View) { + when (v) { + binding.taskLinkAddPoint -> { + viewModel.addPoint() + } + binding.taskLinkKind -> { + showMiddleFragment() + viewModel.setAdapterList(1) + } + binding.taskLinkFunctionalLevel -> { + showMiddleFragment() + viewModel.setAdapterList(2) + } + binding.taskLinkDataLevel -> { + showMiddleFragment() + viewModel.setAdapterList(3) + } + binding.taskLinkBarCancel -> { + onBackPressed() + } + binding.taskLinkBarSave -> { + viewModel.saveData() + } + } + } + + /** + * 显示中间面板 + */ + private fun showMiddleFragment() { + activity?.run { + val controller = findNavController( + R.id.main_activity_middle_fragment + ) + if (controller.currentDestination?.id == R.id.MiddleEmptyFragment) + controller.navigate(R.id.TaskLinkMiddleFragment) + } + } + + override fun onBackPressed(): Boolean { + findNavController().navigateUp() + return true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkMiddleAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkMiddleAdapter.kt new file mode 100644 index 00000000..3ce977fa --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkMiddleAdapter.kt @@ -0,0 +1,49 @@ +package com.navinfo.omqs.ui.fragment.tasklink + +import android.os.Build +import android.view.LayoutInflater +import android.view.ViewGroup +import androidx.annotation.RequiresApi +import com.navinfo.omqs.R +import com.navinfo.omqs.databinding.AdapterElectronicEyeBinding +import com.navinfo.omqs.databinding.AdapterTaskLinkInfoBinding +import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter +import com.navinfo.omqs.ui.other.BaseViewHolder + +data class TaskLinkInfoAdapterItem( + val title: String, + val type: String +) + +class TaskLinkMiddleAdapter(private var itemListener: ((Int, TaskLinkInfoAdapterItem) -> Unit?)? = null) : + BaseRecyclerViewAdapter() { + + private var selectTitle = "" + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { + val viewBinding = + AdapterTaskLinkInfoBinding.inflate(LayoutInflater.from(parent.context), parent, false) + return BaseViewHolder(viewBinding) + } + + @RequiresApi(Build.VERSION_CODES.M) + override fun onBindViewHolder(holder: BaseViewHolder, position: Int) { + val binding = holder.viewBinding as AdapterTaskLinkInfoBinding + binding.title.text = data[position].title + + if (selectTitle == binding.title.text) { + binding.title.setBackgroundResource(R.drawable.shape_bg_blue_bg_4_radius) + binding.title.setTextColor(holder.viewBinding.root.context.getColor(R.color.white)) + } else { + binding.title.setBackgroundResource(R.drawable.shape_rect_white_2dp_bg) + binding.title.setTextColor(holder.viewBinding.root.context.getColor(R.color.black)) + } + binding.root.setOnClickListener { + if (selectTitle != data[position].title) { + selectTitle = data[position].title + notifyDataSetChanged() + } + itemListener?.invoke(position, data[position]) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkMiddleFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkMiddleFragment.kt new file mode 100644 index 00000000..3b8a23dc --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkMiddleFragment.kt @@ -0,0 +1,77 @@ +package com.navinfo.omqs.ui.fragment.tasklink + +import android.os.Build +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.fragment.app.viewModels +import androidx.navigation.findNavController +import androidx.navigation.fragment.findNavController +import androidx.recyclerview.widget.LinearLayoutManager +import com.navinfo.collect.library.map.NIMapController +import com.navinfo.omqs.R +import com.navinfo.omqs.databinding.FragmentTaskLinkBinding +import com.navinfo.omqs.databinding.FragmentTaskLinkMiddleBinding +import com.navinfo.omqs.ui.activity.map.MainActivity +import com.navinfo.omqs.ui.fragment.BaseFragment +import com.navinfo.omqs.ui.fragment.evaluationresult.LeftAdapter +import com.navinfo.omqs.ui.other.shareViewModels +import dagger.hilt.android.AndroidEntryPoint +import javax.inject.Inject + +@AndroidEntryPoint +class TaskLinkMiddleFragment : BaseFragment(), View.OnClickListener { + private var _binding: FragmentTaskLinkMiddleBinding? = null + private val binding get() = _binding!! + + @Inject + lateinit var mapController: NIMapController + + private val viewModel by shareViewModels("taskLink") + + /** + * 监听左侧栏的点击事件 + */ + val adapter = TaskLinkMiddleAdapter { _, item -> + viewModel.setAdapterSelectValve(item) + if (activity != null) { + requireActivity().findNavController(R.id.main_activity_middle_fragment).navigateUp() + } + } + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? + ): View { + _binding = FragmentTaskLinkMiddleBinding.inflate(inflater, container, false) + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + + binding.taskLinkMiddleRecyclerview.layoutManager = LinearLayoutManager(requireContext()) + binding.taskLinkMiddleRecyclerview.adapter = adapter + viewModel.liveDataLeftAdapterList.observe(viewLifecycleOwner) { + adapter.refreshData(it) + } + } + + + override fun onStart() { + super.onStart() + } + + override fun onStop() { + super.onStop() + } + + override fun onClick(v: View) { + when (v) { + } + } + + override fun onBackPressed(): Boolean { + findNavController().navigateUp() + return true + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt new file mode 100644 index 00000000..88778e8e --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt @@ -0,0 +1,202 @@ +package com.navinfo.omqs.ui.fragment.tasklink + +import android.content.SharedPreferences +import android.os.Build +import androidx.lifecycle.MutableLiveData +import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope +import com.navinfo.collect.library.data.entity.HadLinkDvoBean +import com.navinfo.collect.library.data.entity.TaskBean +import com.navinfo.collect.library.map.NIMapController +import com.navinfo.omqs.Constant +import dagger.hilt.android.lifecycle.HiltViewModel +import io.realm.Realm +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.collectLatest +import kotlinx.coroutines.launch +import org.bson.codecs.UuidCodec +import org.bson.internal.UuidHelper +import org.oscim.core.GeoPoint +import java.util.UUID +import javax.inject.Inject + +@HiltViewModel +class TaskLinkViewModel @Inject constructor( + val mapController: NIMapController, + val sharedPreferences: SharedPreferences +) : ViewModel(), SharedPreferences.OnSharedPreferenceChangeListener { + + /** + * 种别 + */ + private val kindList = listOf( + TaskLinkInfoAdapterItem("高速道路", "1"), + TaskLinkInfoAdapterItem("城市高速", "2"), + TaskLinkInfoAdapterItem("国道", "3"), + TaskLinkInfoAdapterItem("省道", "4"), + TaskLinkInfoAdapterItem("县道", "6"), + TaskLinkInfoAdapterItem("乡镇村道路", "7"), + TaskLinkInfoAdapterItem("其他道路", "8"), + TaskLinkInfoAdapterItem("非引导道路", "9"), + TaskLinkInfoAdapterItem("步行道路", "10"), + TaskLinkInfoAdapterItem("人渡", "11"), + TaskLinkInfoAdapterItem("轮渡", "13"), + TaskLinkInfoAdapterItem("自行车道路", "15"), + ) + + /** + * FunctionGrade 功能等级 + */ + private val functionLevelList = listOf( + TaskLinkInfoAdapterItem("等级1", "1"), + TaskLinkInfoAdapterItem("等级2", "2"), + TaskLinkInfoAdapterItem("等级3", "3"), + TaskLinkInfoAdapterItem("等级4", "4"), + TaskLinkInfoAdapterItem("等级5", "5"), + ) + + /** + * 数据级别 + */ + private val dataLevelList = listOf( + TaskLinkInfoAdapterItem("Pro lane model(有高精车道模型覆盖的高速和城高link)", "1"), + TaskLinkInfoAdapterItem("Lite lane model(有高精车道模型覆盖的普通路link)", "2"), + TaskLinkInfoAdapterItem("Standard road model(其他link)", "3"), + ) + + /** + * 处理结束关闭fragment` + */ + val liveDataFinish = MutableLiveData(false) + + /** + * 左侧面板展示内容 + */ + val liveDataLeftAdapterList = MutableLiveData>() + + /** + * 选择的种别 + */ + val liveDataSelectKind = MutableLiveData() + + /** + * 选择的功能等级 + */ + val liveDataSelectFunctionLevel = MutableLiveData() + + /** + * 选择的数据等级 + */ + val liveDataSelectDataLevel = MutableLiveData() + + /** + * 要提示的错误信息 + */ + val liveDataToastMessage = MutableLiveData() + + /** + * 当前选中的任务 + */ + val liveDataTaskBean = MutableLiveData() + + /** + * 当前正在选择哪个数据 1:种别 2:功能等级 3:数据等级 + */ + private var selectType = 0 + + init { + getTaskBean() + sharedPreferences.registerOnSharedPreferenceChangeListener(this) + } + + + private fun getTaskBean() { + viewModelScope.launch(Dispatchers.IO) { + val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) + val realm = Realm.getDefaultInstance() + val res = realm.where(TaskBean::class.java).equalTo("id", id).findFirst() + liveDataTaskBean.postValue(realm.copyFromRealm(res)) + } + } + + /** + * 编辑点 + */ + fun addPoint() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + mapController.measureLayerHandler.drawLineOrPolygon(false) + } + } + + /** + * 设置左侧面板要显示的内容 + */ + fun setAdapterList(type: Int) { + selectType = type + when (type) { + 1 -> liveDataLeftAdapterList.value = kindList + 2 -> liveDataLeftAdapterList.value = functionLevelList + 3 -> liveDataLeftAdapterList.value = dataLevelList + } + } + + /** + * 返回左侧面板选择的内容 + */ + fun setAdapterSelectValve(item: TaskLinkInfoAdapterItem) { + when (selectType) { + 1 -> liveDataSelectKind.value = item + 2 -> liveDataSelectFunctionLevel.value = item + 3 -> liveDataSelectDataLevel.value = item + } + } + + override fun onCleared() { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + mapController.measureLayerHandler.clear() + } + sharedPreferences.unregisterOnSharedPreferenceChangeListener(this) + super.onCleared() + } + + /** + * 保存数据 + */ + fun saveData() { + viewModelScope.launch(Dispatchers.Default) { + if (liveDataTaskBean.value == null) { + liveDataToastMessage.postValue("还没有选择任何一条任务!") + return@launch + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + + if (mapController.measureLayerHandler.mPathLayer.points.size < 2) { + liveDataToastMessage.postValue("道路点少于2个!") + return@launch + } + } + if (liveDataSelectKind.value == null) { + liveDataToastMessage.postValue("请选择种别!") + return@launch + } + if (liveDataSelectFunctionLevel.value == null) { + liveDataToastMessage.postValue("请选择功能等级!") + return@launch + } + if (liveDataSelectDataLevel.value == null) { + liveDataToastMessage.postValue("请选择数据等级!") + return@launch + } + val linkBean = HadLinkDvoBean(linkPid = UUID.randomUUID().toString()) + } + } + + /** + * 监听shared变化 + */ + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { + if (key == Constant.SELECT_TASK_ID) { + getTaskBean() + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskFragment.kt index 502b8ae3..afe01176 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskFragment.kt @@ -1,7 +1,6 @@ package com.navinfo.omqs.ui.fragment.tasklist -import android.app.AlertDialog -import android.content.DialogInterface +import android.os.Build import android.os.Bundle import android.text.Editable import android.text.TextWatcher @@ -16,14 +15,10 @@ import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.navinfo.collect.library.data.entity.HadLinkDvoBean import com.navinfo.omqs.R import com.navinfo.omqs.databinding.FragmentTaskBinding -import com.navinfo.omqs.databinding.FragmentTaskListBinding -import com.navinfo.omqs.http.taskdownload.TaskDownloadManager -import com.navinfo.omqs.http.taskupload.TaskUploadManager import com.navinfo.omqs.ui.fragment.BaseFragment import com.navinfo.omqs.ui.other.shareViewModels import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch -import javax.inject.Inject /** * 当前任务的道路列表 @@ -42,7 +37,9 @@ class TaskFragment : BaseFragment() { TaskAdapter(object : TaskAdapterCallback { override fun itemOnClick(bean: HadLinkDvoBean) { if(bean!=null){ - viewModel.showCurrentLink(bean) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + viewModel.showCurrentLink(bean) + } }else{ Toast.makeText(context, "数据错误,无法显示!", Toast.LENGTH_SHORT).show() } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt index 2a82c060..054665a0 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt @@ -1,7 +1,6 @@ package com.navinfo.omqs.ui.fragment.tasklist import android.annotation.SuppressLint -import android.app.Dialog import android.graphics.Color import android.util.Log import android.view.LayoutInflater @@ -10,7 +9,6 @@ import android.view.ViewGroup import android.widget.Toast import androidx.lifecycle.Observer import androidx.recyclerview.widget.RecyclerView -import com.navinfo.collect.library.data.entity.QsRecordBean import com.navinfo.collect.library.data.entity.TaskBean import com.navinfo.omqs.R import com.navinfo.omqs.databinding.AdapterTaskListBinding @@ -19,15 +17,9 @@ import com.navinfo.omqs.http.taskupload.TaskUploadManager import com.navinfo.omqs.tools.FileManager import com.navinfo.omqs.tools.FileManager.Companion.FileDownloadStatus import com.navinfo.omqs.tools.FileManager.Companion.FileUploadStatus -import com.navinfo.omqs.ui.dialog.FirstDialog import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter import com.navinfo.omqs.ui.other.BaseViewHolder import com.navinfo.omqs.ui.widget.LeftDeleteView -import io.realm.Realm -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext /** * 离线地图城市列表 RecyclerView 适配器 @@ -51,8 +43,7 @@ class TaskListAdapter( private var isShowDeleteView = false - private - val downloadBtnClick = View.OnClickListener() { + private val downloadBtnClick = View.OnClickListener() { if (it.tag != null) { val taskBean = data[it.tag as Int] if (taskBean.hadLinkDvoList.isNotEmpty()) { @@ -131,6 +122,7 @@ class TaskListAdapter( holder: BaseViewHolder, @SuppressLint("RecyclerView") position: Int ) { + Log.e("jingo", "TaskListAdapter onBindViewHolder $position ") val binding: AdapterTaskListBinding = holder.viewBinding as AdapterTaskListBinding val taskBean = data[position] @@ -212,7 +204,7 @@ class TaskListAdapter( * 重置item状态 * @param point */ - fun restoreItemView() { + private fun restoreItemView() { leftDeleteView?.let { if (isShowDeleteView) it.resetDeleteStatus() @@ -366,6 +358,17 @@ class TaskListAdapter( } } + fun initSelectTask(list: List, id: Int?) { + + for (i in list.indices) { + if (list[i].id == id) { + selectPosition = i + break + } + } + refreshData(list) + } + companion object { object ItemClickStatus { const val ITEM_LAYOUT_CLICK = 0 //条目点击 diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt index 58ad3124..20a57e5a 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt @@ -1,6 +1,5 @@ package com.navinfo.omqs.ui.fragment.tasklist -import android.app.Dialog import android.os.Build import android.os.Bundle import android.text.Editable @@ -9,26 +8,15 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Toast -import androidx.annotation.RequiresApi import androidx.recyclerview.widget.LinearLayoutManager -import com.navinfo.collect.library.data.entity.QsRecordBean -import com.navinfo.collect.library.data.entity.TaskBean import com.navinfo.omqs.databinding.FragmentTaskListBinding import com.navinfo.omqs.http.taskdownload.TaskDownloadManager import com.navinfo.omqs.http.taskupload.TaskUploadManager -import com.navinfo.omqs.tools.FileManager -import com.navinfo.omqs.ui.dialog.FirstDialog import com.navinfo.omqs.ui.fragment.BaseFragment import com.navinfo.omqs.ui.other.shareViewModels import dagger.hilt.android.AndroidEntryPoint -import io.realm.Realm -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.GlobalScope -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext import javax.inject.Inject -@RequiresApi(Build.VERSION_CODES.M) @AndroidEntryPoint class TaskListFragment : BaseFragment() { @@ -47,21 +35,29 @@ class TaskListFragment : BaseFragment() { private val adapter: TaskListAdapter by lazy { TaskListAdapter( - downloadManager, uploadManager,binding.taskListRecyclerview + downloadManager, uploadManager, binding.taskListRecyclerview ) { _, status, taskBean -> - if(taskBean.hadLinkDvoList.isEmpty()){ + if (taskBean.hadLinkDvoList.isEmpty()) { Toast.makeText(context, "数据错误,无Link数据!", Toast.LENGTH_SHORT).show() } - if(status==TaskListAdapter.Companion.ItemClickStatus.ITEM_LAYOUT_CLICK){ - viewModel.setSelectTaskBean(taskBean as TaskBean) - }else if(status==TaskListAdapter.Companion.ItemClickStatus.DELETE_LAYOUT_CLICK){ - context?.let { viewModel.removeTask(it, taskBean as TaskBean) } - }else if(status==TaskListAdapter.Companion.ItemClickStatus.UPLOAD_LAYOUT_CLICK){ - showLoadingDialog("正在校验") - Toast.makeText(context, "正在校验", Toast.LENGTH_SHORT).show() - viewModel.checkUploadTask(binding.root.context,taskBean) - } else { + when (status) { + TaskListAdapter.Companion.ItemClickStatus.ITEM_LAYOUT_CLICK -> { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + viewModel.setSelectTaskBean(taskBean) + } else { + } + } + TaskListAdapter.Companion.ItemClickStatus.DELETE_LAYOUT_CLICK -> { + context?.let { viewModel.removeTask(it, taskBean) } + } + TaskListAdapter.Companion.ItemClickStatus.UPLOAD_LAYOUT_CLICK -> { + showLoadingDialog("正在校验") + Toast.makeText(context, "正在校验", Toast.LENGTH_SHORT).show() + viewModel.checkUploadTask(binding.root.context, taskBean) + } + else -> { + } } } } @@ -85,13 +81,13 @@ class TaskListFragment : BaseFragment() { binding.taskListRecyclerview.layoutManager = layoutManager binding.taskListRecyclerview.adapter = adapter viewModel.liveDataTaskList.observe(viewLifecycleOwner) { - adapter.refreshData(it) + adapter.initSelectTask(it,viewModel.currentSelectTaskBean?.id) } //监听并调用上传 - viewModel.liveDataTaskUpload.observe(viewLifecycleOwner){ + viewModel.liveDataTaskUpload.observe(viewLifecycleOwner) { for ((key, value) in it) { - if(value){ + if (value) { adapter.uploadTask(key) } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt index 74ddacf6..7ffa46e3 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt @@ -2,6 +2,7 @@ package com.navinfo.omqs.ui.fragment.tasklist import android.app.Dialog import android.content.Context +import android.content.SharedPreferences import android.graphics.Color import android.os.Build import android.widget.Toast @@ -28,7 +29,9 @@ import javax.inject.Inject @HiltViewModel class TaskViewModel @Inject constructor( - private val networkService: NetworkService, private val mapController: NIMapController + private val networkService: NetworkService, + private val mapController: NIMapController, + private val sharedPreferences: SharedPreferences ) : ViewModel() { /** @@ -52,7 +55,7 @@ class TaskViewModel @Inject constructor( /** * 当前选中的任务 */ - private var currentSelectTaskBean: TaskBean? = null + var currentSelectTaskBean: TaskBean? = null /** * 任务列表查询协程 @@ -61,6 +64,7 @@ class TaskViewModel @Inject constructor( private var filterTaskJob: Job? = null + /** * 下载任务列表 */ @@ -130,6 +134,15 @@ class TaskViewModel @Inject constructor( FileManager.checkOMDBFileInfo(item) } liveDataTaskList.postValue(taskList) + val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) + if (id > -1) { + for(item in taskList){ + if(item.id == id){ + currentSelectTaskBean = item + liveDataTaskLinks.postValue(currentSelectTaskBean!!.hadLinkDvoList) + } + } + } } } @@ -138,6 +151,9 @@ class TaskViewModel @Inject constructor( */ @RequiresApi(Build.VERSION_CODES.M) fun setSelectTaskBean(taskBean: TaskBean) { + + sharedPreferences.edit().putInt(Constant.SELECT_TASK_ID, taskBean.id).commit() + currentSelectTaskBean = taskBean liveDataTaskLinks.value = taskBean.hadLinkDvoList diff --git a/app/src/main/res/drawable-xxhdpi/icon_menu_note.png b/app/src/main/res/drawable-xxhdpi/icon_menu_note.png new file mode 100644 index 0000000000000000000000000000000000000000..9ba0d812eda4d92a2cef56c8f6ba8c7f571710f4 GIT binary patch literal 1704 zcmV;Z23PrsP)Px*Vo5|nRCr$PTW^RIWf=cGv#Y6HpG-42aOYgXvJaN-TptQfP*74jyPGXRsX)O% z(4dIugMBCpBs3%{5(+Yiojp8D(9pvRgzk3N@Pn1$>5O`idKU;CR_D(9#Jks?vvWK9 zcV_Q4Z@%5mGw<{Ke(y8yJpYbxpI>yJ;)ML-Gg z7BhbY!2{#ABHztGFJ+D$4j~jJ&~pT_tKb!69=E;H7aKb@ACS^oobrX>L)X{=d1U&6rOuD^u=W}wH{{cWzL3B8ii1akl zBc9TSqH`#8$)VF4OsHyI1pEi;1Q9(`3cS3hb({N0!Miy*=ImXF$9^`VLyaO~Ri_zw zU@lDG2&e|URN5Z5P650wZ-6bZHIr1oZAt<>!2<(hd}n>J1Fu~-Wn9pa2P_z`rVaJ0 z<|ClvOjujA^o-l>!MG@ZwP{1WQ4G}ohJaYNwO>*AjRKHmz~|0@xcQUwpkyI7r;^K# zH_>MpZAtnk@_K!ovR+EC9o6#<%Vy+g$B6`c6s3&i9Z+A?7t zF|ToDgPxzDpa}8hE1>D-2_kH$*GOB~TQkXM!@dC0US9}k*UjJR&F}Xy}q{cyYuoB{16r#0^yY@b}$bK z(2lgB{^-6J2mwOyn;`G^Um8IIw^@PZ$AOnCvJjsl&=a1Uz?@~GO{s+XgHt9D0{$6? zdcIe+YV?Sz9;>Fv!r;;Iaa!(7znhwXQbiVkj)1WO#NCCA((b`T?@I^gmY~C_L}cf* z5Fp+EkwrWLqL#b?Sr*TpGnSoo8dR^_yTQeDbCm+@0dV6_+yyOleetM^m@1 zKI$xI`3=6Nr3z?_!Ry>z<_Q@dV_R%b^+bCs0Z^|@paf`Lm)B58Nmp(pk7b!Ry3dEo zpRZmrSOVgv%-bj0bw3-1>sRJDkdyWn+U*L)d-ewsJD4N^`qzewphhOr*@+UZZk>dced;&4ULB zh%or9&7$wz$h85lj!qSuTT-_n5p_1Ax*c^L_9h9DHt2mhI-O3BZFMW zmmw*4`07`mFG%3|wcW2?O=EJgt}EM=5PdyqFmqOLXhS-=w675$YSp3XmYf#tEtpTR zd3(C2?MSgTJCaB0oz&v+Pt*cFuZ0P|P;Vy8i-cW|MuptNLaD0000Px)AW1|)RA@u(npvz~QxwO4e`2h8iY7=9+L#h^B4UaML<|)|+EOa1S@c1KcoO1C zNzE~}Q5r!TA$Tx{5JN)D;z7hv4MNeFy5!&NlWeEo*K_W<=k$K}_S?yQxZj@Ef3LOI z`meQ*SkIc)GrSA|PjrnBH9XYt1UrGDNl!3^t^uc24M)Vrz<$8>!12Hq9Ub5gz_Y+j zz!#FD?mn#nj)+Zx2Z6KeZr;+kn}Hi7{ZVJVHUYm09A0PB4#pVtwRJQ-YQRaeFPFf6 z4J-h@?Eu^=U|(Pcux+;f6iJ^~?KdjG3G9==iP=Vv0+&kqxoY##^hd;@!1EdCg_6#z zT6463%VxY7m|gciRS8$s9})9`%hI^zl6I<^(+F@MGkyg)PSUD~*bq1p_#Jq+&fTgK zv{!#bOaq=M`Xp82sT@$=sE-+2v(pXM<0E1=a9^4`Q_{mt09DP2h<$*Mx&~Y}V>_%< zCH-1#91(W|bJG8hNSaH8jL{}^y)`hBsabDC(dYEEYwj)((+_c8%q1x}IlOAoMHr}(>h>YFENZk6y& z`nv?Y)b}(A^*8Wz0<}RVsQK&;z{x-X*4;-*daVhdsyST(UePcSSRiRumEe6s&L+T? zz>odHT9<%pXCs;Lrk0nCl!QctL*+e*y*c~x|7LSnO8T?p9J}$-5s?Fa2lxaqxhOZA zxIOlgCT1KFlL0%!U3;v(3^-WQH(B^wCxA^IA82BxYnu}h&ZC{D2bje8UT>EU#5DG)aR<1M89xN%Vaze#OwRY(-ufS44@oXCj2{j6 zG2_)SJ0e^razf%7S-JUMpI?NhadC(Hn6dBVoD9fWsYH~6c9u3RPgDjTa33?i4Vatd z(vIa0dwIFWci0s5udyH=jlxntGX^dwfxX47Dg$QC9$f}I(04c@4gj7hk&3bzn>(9Q zTC)Z5Fj#wK7v9%s18LF`u@&$Fa7ZR`V>2Fjla7ePQXDO0U6?#=QUCItt!>67z*7^i z_s=UO>#&yBe8P_%7uYlbu1nEgC>ImOtOlN>2;vnEfz*Wq=**m*N z=D+8FizNNqMEK+j9QG!q+SmV>Sg$p^1iWJkN4uwuKLy?ZTq5${`@PuHNPwru0h1Fy zx!fx0>ZS{Rmwm$(UNOBEo%vyR7w+|>PA@@ou9`O3gRTuEyz-QSi2E7P) z3Gm(QRkH2kFznn+Cy({>YzEeQO_h|(*mM87fIZHi2wl?!iWb&v|D%?OFfsS{SAzz+ zyU&&qZ`})UHPJM&aAYkgX+%pbPeuD1$Lzzj5s5p7gKOR4F_f?Mt%rbHKhgnPaH!z{ oQ%LLL3^m;Pkq+2`>z#)G1L|gQTd4%04FCWD07*qoM6N<$f=)e_{{R30 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/ripple_fragment_save_botton_bg.xml b/app/src/main/res/drawable/ripple_fragment_save_button_bg.xml similarity index 100% rename from app/src/main/res/drawable/ripple_fragment_save_botton_bg.xml rename to app/src/main/res/drawable/ripple_fragment_save_button_bg.xml diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 6a3dcc15..d6c4333f 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -31,6 +31,28 @@ app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> + + + + + app:constraint_referenced_ids="main_activity_serach,main_activity_2d_3d,main_activity_camera,main_activity_trace,main_activity_note,main_activity_task_line,main_activity_calc_disance" /> + + + \ No newline at end of file diff --git a/app/src/main/res/layout/adapter_task_link_info.xml b/app/src/main/res/layout/adapter_task_link_info.xml new file mode 100644 index 00000000..f8edde78 --- /dev/null +++ b/app/src/main/res/layout/adapter_task_link_info.xml @@ -0,0 +1,17 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_evaluation_result.xml b/app/src/main/res/layout/fragment_evaluation_result.xml index c1070d32..7d77f88b 100644 --- a/app/src/main/res/layout/fragment_evaluation_result.xml +++ b/app/src/main/res/layout/fragment_evaluation_result.xml @@ -39,7 +39,7 @@ android:layout_height="40dp" android:layout_marginTop="9dp" android:layout_marginRight="14dp" - android:background="@drawable/ripple_fragment_save_botton_bg" + android:background="@drawable/ripple_fragment_save_button_bg" android:src="@drawable/icon_save" app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/layout/fragment_note.xml b/app/src/main/res/layout/fragment_note.xml index 6ee54057..121d4b04 100644 --- a/app/src/main/res/layout/fragment_note.xml +++ b/app/src/main/res/layout/fragment_note.xml @@ -1,5 +1,6 @@ - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_task_link_middle.xml b/app/src/main/res/layout/fragment_task_link_middle.xml new file mode 100644 index 00000000..70566d73 --- /dev/null +++ b/app/src/main/res/layout/fragment_task_link_middle.xml @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/middle_fragment_nav_graph.xml b/app/src/main/res/navigation/middle_fragment_nav_graph.xml index b1897830..58ce937b 100644 --- a/app/src/main/res/navigation/middle_fragment_nav_graph.xml +++ b/app/src/main/res/navigation/middle_fragment_nav_graph.xml @@ -25,5 +25,10 @@ android:name="com.navinfo.omqs.ui.fragment.note.CanvasFragment" android:label="绘图页面" tools:layout="@layout/fragment_canvas"> + \ No newline at end of file diff --git a/app/src/main/res/navigation/right_fragment_nav_graph.xml b/app/src/main/res/navigation/right_fragment_nav_graph.xml index b47ba040..a9248625 100644 --- a/app/src/main/res/navigation/right_fragment_nav_graph.xml +++ b/app/src/main/res/navigation/right_fragment_nav_graph.xml @@ -28,13 +28,19 @@ android:name="com.navinfo.omqs.ui.fragment.evaluationresult.EvaluationResultFragment" android:label="评测页面" tools:layout="@layout/fragment_evaluation_result"> - + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/icon_4004_0.svg b/collect-library/src/main/assets/omdb/icon_4004_0.svg index 54de0465..bbbc966e 100644 --- a/collect-library/src/main/assets/omdb/icon_4004_0.svg +++ b/collect-library/src/main/assets/omdb/icon_4004_0.svg @@ -1 +1,45 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/icon_4010.svg b/collect-library/src/main/assets/omdb/icon_4010.svg index 1c0c2379..12ef193c 100644 --- a/collect-library/src/main/assets/omdb/icon_4010.svg +++ b/collect-library/src/main/assets/omdb/icon_4010.svg @@ -1 +1,24 @@ - \ No newline at end of file + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/HadLinkDvoBean.kt b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/HadLinkDvoBean.kt index 3bfc9084..4727a0da 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/HadLinkDvoBean.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/HadLinkDvoBean.kt @@ -19,6 +19,15 @@ open class HadLinkDvoBean @JvmOverloads constructor( /** * 不作业原因 */ - var reason: String = "" + var reason: String = "", + /** + * 1:源库link, 3:现象新增 + */ + var linkStatus: Int = 1, + + /** + * link 长度 + */ + var linkLength: Double = 0.000 ) : RealmObject() \ No newline at end of file diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapController.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapController.kt index 9841797c..077575a3 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapController.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapController.kt @@ -1,18 +1,11 @@ package com.navinfo.collect.library.map import android.os.Build -import androidx.annotation.RequiresApi import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.lifecycleScope -import com.navinfo.collect.library.data.entity.NiLocation -import com.navinfo.collect.library.data.handler.DataNiLocationHandler -import com.navinfo.collect.library.map.NIMapView.OnMapClickListener import com.navinfo.collect.library.map.handler.* -import com.navinfo.collect.library.map.handler.MeasureLayerHandler -import com.navinfo.collect.library.map.handler.ViewportHandler import com.navinfo.collect.library.system.Constant import kotlinx.coroutines.flow.MutableSharedFlow -import kotlinx.coroutines.flow.SharedFlow import kotlinx.coroutines.launch import org.oscim.core.GeoPoint diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MeasureLayerHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MeasureLayerHandler.kt index 6308fe7a..b8966a5f 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MeasureLayerHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MeasureLayerHandler.kt @@ -5,13 +5,17 @@ import android.graphics.Canvas import android.graphics.Color import android.os.Build import android.text.TextPaint +import android.util.Log +import android.widget.Toast import androidx.annotation.RequiresApi import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.MutableLiveData import com.navinfo.collect.library.R import com.navinfo.collect.library.map.NIMapView import com.navinfo.collect.library.map.layers.NIPolygonLayer import com.navinfo.collect.library.utils.DistanceUtil import com.navinfo.collect.library.utils.GeometryTools +import com.navinfo.collect.library.utils.StringUtil.Companion.createUUID import org.oscim.android.canvas.AndroidBitmap import org.oscim.backend.CanvasAdapter import org.oscim.backend.canvas.Bitmap @@ -27,6 +31,8 @@ import org.oscim.layers.vector.PathLayer import org.oscim.layers.vector.geometries.Style import org.oscim.map.Map import java.math.BigDecimal +import kotlin.math.abs +import kotlin.math.ceil @RequiresApi(Build.VERSION_CODES.M) open class MeasureLayerHandler(context: AppCompatActivity, mapView: NIMapView) : @@ -37,230 +43,195 @@ open class MeasureLayerHandler(context: AppCompatActivity, mapView: NIMapView) : private var bDrawLine = false private val bDrawPoint = false - private var mAreaLayer: ItemizedLayer + /** + * 加上虚线的总长度 + */ + val tempLineDistanceLiveData = MutableLiveData("") + + /** + * 实际绘制的总长度 + */ + val lineLenghtLiveData = MutableLiveData(0.000) + + private val markerLayer: ItemizedLayer by lazy { + + val markerSymbol = MarkerSymbol( + mPathMarkerBitmap, MarkerSymbol.HotspotPlace.CENTER + ) + //新增marker图层 + val layer = ItemizedLayer( + mapView.vtmMap, mutableListOf(), markerSymbol, itemGestureListener + ) + + addLayer(layer, NIMapView.LAYER_GROUPS.OPERATE_MARKER) + layer + } + + private val mAreaLayer: ItemizedLayer by lazy { + val markerSymbol = MarkerSymbol(mPathMarkerBitmap, MarkerSymbol.HotspotPlace.CENTER) + ItemizedLayer(mMapView.vtmMap, ArrayList(), markerSymbol, null) + } //绘制线 样式 - private val lineStyle: Style - - private val newTempStyle: Style - - //线型编辑时的样式 - private val editTempStyle: Style - - //新增线数据引线 - private var mPathLayerTemp: PathLayer - - //新增线数据 - private var mPathLayer: PathLayer - - //线路端点图标 - private var mPathMarkerBitmap: Bitmap - - private var bDrawPolygon = false - - private var mPolygonLayer: NIPolygonLayer - - init { - + private val lineStyle: Style by lazy { //新增线数据图层和线样式 - lineStyle = Style.builder().scaleZoomLevel(20).buffer(1.0) + Style.builder().scaleZoomLevel(20).buffer(1.0) .stippleColor(context.resources.getColor(R.color.draw_line_blue1_color, null)) .strokeWidth(4f) .fillColor(context.resources.getColor(R.color.draw_line_blue2_color, null)) .fillAlpha(0.5f) .strokeColor(context.resources.getColor(R.color.draw_line_blue2_color, null)) .fillColor(context.resources.getColor(R.color.draw_line_red_color, null)) - .stippleWidth(4f) - .fixed(true) - .build() + .stippleWidth(4f).fixed(true).build() + } - newTempStyle = Style.builder() - .stippleColor(context.resources.getColor(R.color.transparent, null)) - .stipple(30) - .stippleWidth(30f) - .strokeWidth(4f) + private val newTempStyle: Style by lazy { + Style.builder().stippleColor(context.resources.getColor(R.color.transparent, null)) + .stipple(30).stippleWidth(30f).strokeWidth(4f) .strokeColor(context.resources.getColor(R.color.draw_line_blue2_color, null)) - .fixed(true) - .randomOffset(false) - .build() + .fixed(true).randomOffset(false).build() + } - editTempStyle = Style.builder() - .stippleColor(context.resources.getColor(R.color.transparent, null)) - .stipple(30) - .stippleWidth(30f) - .strokeWidth(8f) - .strokeColor(context.resources.getColor(R.color.draw_line_red_color, null)) - .fixed(true) - .randomOffset(false) - .build() - - mPolygonLayer = NIPolygonLayer( - mMapView.vtmMap, - lineStyle - ) -// addLayer(mPolygonLayer, NIMapView.LAYER_GROUPS.OPERATE) - - mPathLayerTemp = PathLayer(mMapView.vtmMap, newTempStyle) - // addLayer(mPathLayerTemp, NIMapView.LAYER_GROUPS.OPERATE) - - mPathMarkerBitmap = AndroidBitmap( - BitmapFactory.decodeResource( - context.resources, - R.mipmap.icon_path_maker - ) - ) - - val markerSymbol = MarkerSymbol(mPathMarkerBitmap, MarkerSymbol.HotspotPlace.CENTER) - - mAreaLayer = ItemizedLayer(mMapView.vtmMap, ArrayList(), markerSymbol, null) - - mPathLayer = PathLayer(mMapView.vtmMap, lineStyle) - - addLayer(mPathLayer, NIMapView.LAYER_GROUPS.OPERATE_LINE) + //线型编辑时的样式 + private val editTempStyle: Style by lazy { + Style.builder().stippleColor(context.resources.getColor(R.color.transparent, null)) + .stipple(30).stippleWidth(30f).strokeWidth(8f) + .strokeColor(context.resources.getColor(R.color.draw_line_red_color, null)).fixed(true) + .randomOffset(false).build() } - open fun drawLineOrPolygon(type: Int) { + //新增线数据引线 + private val mPathLayerTemp: PathLayer by lazy { + val layer = PathLayer(mMapView.vtmMap, newTempStyle) + addLayer(layer, NIMapView.LAYER_GROUPS.OPERATE_LINE) + layer + } + + //新增线数据 + val mPathLayer: PathLayer by lazy { + val layer = PathLayer(mMapView.vtmMap, lineStyle) + addLayer(layer, NIMapView.LAYER_GROUPS.OPERATE_LINE) + layer + } + + //线路端点图标 + private val mPathMarkerBitmap: Bitmap by lazy { + AndroidBitmap( + BitmapFactory.decodeResource( + context.resources, R.mipmap.icon_path_maker + ) + ) + } + + private var bDrawPolygon = false + + val mPolygonLayer: NIPolygonLayer by lazy { + val layer = NIPolygonLayer(mMapView.vtmMap, lineStyle) + addLayer(layer, NIMapView.LAYER_GROUPS.OPERATE_LINE) + layer + } + + + init { + mMapView.vtmMap.events.bind(this) + } + + open fun drawLineOrPolygon(isPolygon: Boolean) { bDrawLine = true -// //画面 -// if (type == 3) { -// if (mPolygonLayer == null) { -// mPolygonLayer = NIPolygonLayer(mMapView.vtmMap, lineStyle) -// addLayer(mPolygonLayer, NIMapView.LAYER_GROUPS.OPERATE) -// } else if (!mPolygonLayer.isEnabled) { -// mPolygonLayer.isEnabled = true -// } -// } else { -// if (mPathLayer == null) { -// mPathLayer = PathLayer(mMapView.vtmMap, lineStyle) -// addLayer(mPathLayer, NIMapView.LAYER_GROUPS.OPERATE) -// } else if (!mPathLayer.isEnabled()) { -// mPathLayer.setEnabled(true) -// } -// } -// //上一个点的引线 -// if (mPathLayerTemp == null) { -// mPathLayerTemp = PathLayer(mMapView.vtmMap, newTempStyle) -// addLayer(mPathLayerTemp, NIMapView.LAYER_GROUPS.OPERATE) -// } else if (!mPathLayerTemp.isEnabled) { -// mPathLayerTemp.isEnabled = true -// } -// val geoPoint: GeoPoint = -// GeoPoint( -// mMapView.vtmMap.getMapPosition().getLatitude(), -// mMapView.vtmMap.getMapPosition().getLongitude() -// ) -// -// //编辑点 -// if (editIndex > -1) { -// if (mPathMakers.size > editIndex) { -// mMapView.layerManager.removeMarker( -// mPathMakers[editIndex], -// NILayerManager.MARQUEE_MARKER_LAYER -// ) -// mPathMakers.removeAt(editIndex) -// if (mPathMarkerBitmap == null) { -// mPathMarkerBitmap = AndroidBitmap( -// BitmapFactory.decodeResource( -// mContext.getResources(), -// R.mipmap.icon_path_maker -// ) -// ) -// } -// val markerItem = MarkerItem(createUUID(), "", "", geoPoint) -// val markerSymbol = MarkerSymbol(mPathMarkerBitmap, MarkerSymbol.HotspotPlace.CENTER) -// markerItem.marker = markerSymbol -// mMapView.layerManager.addMarker2MarkerLayer( -// markerItem, -// mPathMarkerBitmap, -// NILayerManager.MARQUEE_MARKER_LAYER, -// NIMapView.LAYER_GROUPS.OTHER.ordinal, -// itemGestureListener -// ) -// mPathMakers.add(editIndex, markerItem) -// if (mPathLayer != null && mPathLayer.getPoints().size > 0) { -// val list: MutableList = mPathLayer.getPoints() -// if (editIndex < list.size) { -// list.removeAt(editIndex) -// val list2: MutableList = java.util.ArrayList(list) -// list2.add(editIndex, geoPoint) -// mPathLayer.setPoints(list2) -// } -// } else if (mPolygonLayer != null && mPolygonLayer.points.size > 0) { -// val list = mPolygonLayer.points -// if (editIndex < list.size) { -// list.removeAt(editIndex) -// val list2: MutableList = java.util.ArrayList(list) -// list2.add(editIndex, geoPoint) -// mPolygonLayer.setPoints(list2) -// } -// } -// if (mPathLayerTemp != null) { -// mPathLayerTemp.setStyle(newTempStyle) -// val list: MutableList = java.util.ArrayList() -// if (type == 3 && mPathMakers.size > 1) { -// list.add(mPathMakers[0].geoPoint) -// list.add(geoPoint) -// list.add(mPathMakers[mPathMakers.size - 1].geoPoint) -// } else { -// list.add(mPathMakers[mPathMakers.size - 1].geoPoint) -// list.add(geoPoint) -// } -// mPathLayerTemp.setPoints(list) -// } -// } -// editIndex = -1 -// } else { //新增点 -// if (type == 3) { -// val points: MutableList = java.util.ArrayList(mPolygonLayer.points) -// if (points.size > 2) { -// val list: MutableList = java.util.ArrayList() -// points.add(points[0]) -// list.add(points[0]) -// list.add(geoPoint) -// list.add(mPolygonLayer.points[mPolygonLayer.points.size - 1]) -// val bCross = GeometryTools.isPolygonCrosses(points, list) -// if (bCross == true) { -// Toast.makeText(mContext, "不能交叉", Toast.LENGTH_SHORT).show() -// return -// } -// } -// mPolygonLayer.addPoint(geoPoint) -// } else { -// val points: List = mPathLayer.getPoints() -// if (points.size > 2) { -// val list: MutableList = java.util.ArrayList() -// list.add(geoPoint) -// list.add(points[points.size - 1]) -// val bCross = GeometryTools.isLineStringCrosses(points, list) -// if (bCross == true) { -// Toast.makeText(mContext, "不能交叉", Toast.LENGTH_SHORT).show() -// return -// } -// } -// mPathLayer.addPoint(geoPoint) -// } -// if (mPathMarkerBitmap == null) { -// mPathMarkerBitmap = AndroidBitmap( -// BitmapFactory.decodeResource( -// mContext.getResources(), -// R.mipmap.icon_path_maker -// ) -// ) -// } -// val markerItem = MarkerItem(createUUID(), "", "", geoPoint) -// val markerSymbol = MarkerSymbol(mPathMarkerBitmap, MarkerSymbol.HotspotPlace.CENTER) -// markerItem.marker = markerSymbol -// mMapView.layerManager.addMarker2MarkerLayer( -// markerItem, -// mPathMarkerBitmap, -// NILayerManager.MARQUEE_MARKER_LAYER, -// NIMapView.LAYER_GROUPS.OTHER.ordinal, -// itemGestureListener -// ) -// mPathMakers.add(markerItem) -// } + //画面 + if (isPolygon && !mPolygonLayer.isEnabled) { + mPolygonLayer.isEnabled = true + } else if (!mPathLayer.isEnabled) { + mPathLayer.isEnabled = true + } + //上一个点的引线 + if (!mPathLayerTemp.isEnabled) { + mPathLayerTemp.isEnabled = true + } + val geoPoint = GeoPoint( + mMapView.vtmMap.mapPosition.latitude, mMapView.vtmMap.mapPosition.longitude + ) + + //编辑点 + if (editIndex > -1) { + if (mPathMakers.size > editIndex) { + markerLayer.removeItem(editIndex) + mPathMakers.removeAt(editIndex) + val markerItem = MarkerItem(createUUID(), "", "", geoPoint) + markerLayer.addItem(markerItem) + mPathMakers.add(editIndex, markerItem) + if (mPathLayer.points.size > 0) { + val list: MutableList = mPathLayer.points + if (editIndex < list.size) { + list.removeAt(editIndex) + val list2: MutableList = java.util.ArrayList(list) + list2.add(editIndex, geoPoint) + mPathLayer.setPoints(list2) + } + } else if (mPolygonLayer.points.size > 0) { + val list = mPolygonLayer.points + if (editIndex < list.size) { + list.removeAt(editIndex) + val list2: MutableList = java.util.ArrayList(list) + list2.add(editIndex, geoPoint) + mPolygonLayer.setPoints(list2) + } + } + mPathLayerTemp.setStyle(newTempStyle) + val list: MutableList = java.util.ArrayList() + if (isPolygon && mPathMakers.size > 1) { + list.add(mPathMakers[0].geoPoint) + list.add(geoPoint) + list.add(mPathMakers[mPathMakers.size - 1].geoPoint) + } else { + list.add(mPathMakers[mPathMakers.size - 1].geoPoint) + list.add(geoPoint) + } + mPathLayerTemp.setPoints(list) + } + editIndex = -1 + } else { //新增点 + if (isPolygon) { + val points: MutableList = java.util.ArrayList(mPolygonLayer.points) + if (points.size > 2) { + val list: MutableList = java.util.ArrayList() + points.add(points[0]) + list.add(points[0]) + list.add(geoPoint) + list.add(mPolygonLayer.points[mPolygonLayer.points.size - 1]) + val bCross = GeometryTools.isPolygonCrosses(points, list) + if (bCross) { + Toast.makeText(mContext, "不能交叉", Toast.LENGTH_SHORT).show() + return + } + } + mPolygonLayer.addPoint(geoPoint) + } else { + val points: List = mPathLayer.points + if (points.size > 2) { + val list: MutableList = java.util.ArrayList() + list.add(geoPoint) + list.add(points[points.size - 1]) + val bCross = GeometryTools.isLineStringCrosses(points, list) + if (bCross) { + Toast.makeText(mContext, "不能交叉", Toast.LENGTH_SHORT).show() + return + } + } + mPathLayer.addPoint(geoPoint) + if (mPathLayer.points.size > 1) { + val distance: Double = GeometryTools.getDistance(mPathLayer.points) + val bg = BigDecimal(distance) + val f1 = bg.setScale(3, BigDecimal.ROUND_HALF_UP).toDouble() + lineLenghtLiveData.value = f1 + } + } + val markerItem = MarkerItem(createUUID(), "", "", geoPoint) + markerLayer.addItem(markerItem) + mPathMakers.add(markerItem) + } showAreaLayer() } @@ -298,10 +269,8 @@ open class MeasureLayerHandler(context: AppCompatActivity, mapView: NIMapView) : * 隐藏面积计算 */ open fun hideAreaLayer() { - if (mAreaLayer != null) { - mAreaLayer.removeAllItems() - mMapView.vtmMap.layers().remove(mAreaLayer) - } + mAreaLayer.removeAllItems() + mMapView.vtmMap.layers().remove(mAreaLayer) } @@ -309,46 +278,39 @@ open class MeasureLayerHandler(context: AppCompatActivity, mapView: NIMapView) : * 显示面积计算 */ open fun showAreaLayer() { - if (mAreaLayer != null) { - mAreaLayer.removeAllItems() - mMapView.vtmMap.layers().remove(mAreaLayer) - } - if (mPolygonLayer != null && mPolygonLayer.points.size > 2) { + mAreaLayer.removeAllItems() + mMapView.vtmMap.layers().remove(mAreaLayer) + if (mPolygonLayer.points.size > 2) { val list: MutableList = ArrayList(mPolygonLayer.points) val area = DistanceUtil.planarPolygonAreaMeters2(list) - var areaString: String - if (area < 1000000) { - areaString = area.toString() + "平方米" + val areaString = if (area < 1000000) { + area.toString() + "平方米" } else if (area < 10000000000.0) { val d = area / 1000000.0 val bg = BigDecimal(d) val f1 = bg.setScale(1, BigDecimal.ROUND_HALF_UP).toDouble() - areaString = f1.toString() + "平方公里" + f1.toString() + "平方公里" } else { val d = area / 10000000000.0 val bg = BigDecimal(d) val f1 = bg.setScale(1, BigDecimal.ROUND_HALF_UP).toDouble() - areaString = f1.toString() + "万平方公里" + f1.toString() + "万平方公里" } val textPaint = TextPaint() textPaint.textSize = 13 * CanvasAdapter.getScale() textPaint.color = Color.BLUE - val width = Math.ceil(textPaint.measureText(areaString).toDouble()).toInt() + val width = ceil(textPaint.measureText(areaString).toDouble()).toInt() val fontMetrics = textPaint.fontMetrics - val height = - Math.ceil((Math.abs(fontMetrics.bottom) + Math.abs(fontMetrics.top)).toDouble()) - .toInt() + val height = ceil((abs(fontMetrics.bottom) + abs(fontMetrics.top)).toDouble()).toInt() val bitmap = android.graphics.Bitmap.createBitmap( - width, - height, - android.graphics.Bitmap.Config.ARGB_8888 + width, height, android.graphics.Bitmap.Config.ARGB_8888 ) val canvas = Canvas(bitmap) - canvas.drawText(areaString, 0f, Math.abs(fontMetrics.ascent), textPaint) - val bitmap2: Bitmap = AndroidBitmap(bitmap) - val markerSymbol = MarkerSymbol(bitmap2, MarkerSymbol.HotspotPlace.CENTER) - mAreaLayer = ItemizedLayer(mMapView.vtmMap, ArrayList(), markerSymbol, null) - mMapView.vtmMap.layers().add(mAreaLayer) + canvas.drawText(areaString, 0f, abs(fontMetrics.ascent), textPaint) +// val bitmap2: Bitmap = AndroidBitmap(bitmap) +// val markerSymbol = MarkerSymbol(bitmap2, MarkerSymbol.HotspotPlace.CENTER) +// mAreaLayer = ItemizedLayer(mMapView.vtmMap, ArrayList(), markerSymbol, null) +// mMapView.vtmMap.layers().add(mAreaLayer) list.add(list[0]) val polygon = GeometryTools.createPolygon(list) val point = polygon.centroid @@ -360,66 +322,119 @@ open class MeasureLayerHandler(context: AppCompatActivity, mapView: NIMapView) : } open fun removeLine() { -// bDrawLine = false -// editIndex = -1 -// for (item in mPathMakers) { -// mMapView.layerManager.removeMarker(item, NILayerManager.MARQUEE_MARKER_LAYER) -// } -// mPathMakers.clear() -// if (mPathLayer != null) { -// mPathLayer.clearPath() -// mPathLayer.isEnabled = false -// } -// if (mPolygonLayer != null) { -// mPolygonLayer.clearPath() -// mPolygonLayer.isEnabled = false -// } -// if (mPathLayerTemp != null) { -// mPathLayerTemp.clearPath() -// mPathLayerTemp.isEnabled = false -// mPathLayerTemp.setStyle(newTempStyle) -// } + bDrawLine = false + editIndex = -1 + markerLayer.removeAllItems() + mPathMakers.clear() + mPathLayer.clearPath() + mPathLayer.isEnabled = false + mPolygonLayer.clearPath() + mPolygonLayer.isEnabled = false + mPathLayerTemp.clearPath() + mPathLayerTemp.isEnabled = false + mPathLayerTemp.setStyle(newTempStyle) hideAreaLayer() } - fun clean() { + fun clear() { removeLine() mMapView.vtmMap.updateMap(true) } - override fun onMapEvent(e: Event?, mapPosition: MapPosition?) { - + override fun onMapEvent(e: Event, mapPosition: MapPosition) { + if (!bDrawLine) return +// if (mMapView.centerPixel[1] > mMapView.vtmMap.height / 2) { +// val geoPoint = +// mMapView.vtmMap.viewport() +// .fromScreenPoint( +// mMapView.centerPixel[0], +// mMapView.vtmMap.height - mMapView.centerPixel[1] +// ) +// mapPosition.setPosition(geoPoint) +// } + if (e === Map.POSITION_EVENT) { + if (mPathLayer.points.size > 0) { + if (editIndex > -1) { + val list: MutableList = mutableListOf() + if (editIndex == 0 || editIndex == mPathMakers.size - 1) { + list.add(mPathMakers[editIndex].geoPoint) + list.add( + GeoPoint( + mapPosition.latitude, mapPosition.longitude + ) + ) + } else { + list.add(mPathMakers[editIndex - 1].geoPoint) + list.add( + GeoPoint( + mapPosition.latitude, mapPosition.longitude + ) + ) + list.add(mPathMakers[editIndex + 1].geoPoint) + } + mPathLayerTemp.setPoints(list) +// crossText.setText("") + } else { + val list: MutableList = mutableListOf() + list.add(mPathLayer.points[mPathLayer.points.size - 1]) + val nowPoint = GeoPoint( + mapPosition.latitude, mapPosition.longitude + ) + list.add( + nowPoint + ) + mPathLayerTemp.setPoints(list) + if (mPathLayer.points.size > 0) { + val dList = mPathLayer.points.toMutableList() + dList.add(nowPoint) + val distance: Double = + GeometryTools.getDistance(dList) + if (distance < 1000) { + tempLineDistanceLiveData.value = "${distance.toInt()}米" + } else { + try { + val d = distance / 1000.0 + val bg = BigDecimal(d) + val f1 = + bg.setScale(1, BigDecimal.ROUND_HALF_UP).toDouble() + tempLineDistanceLiveData.value = "${f1}公里" + } catch (e: Exception) { + Log.e("jingo",e.toString() + "$distance") + } + } + } + } + } + } } - private val itemGestureListener: OnItemGestureListener<*> = + private val itemGestureListener: OnItemGestureListener = object : OnItemGestureListener { override fun onItemSingleTapUp(index: Int, item: MarkerInterface): Boolean { if (bDrawLine) { -// for (i in mPathMakers.indices) { -// val item1 = mPathMakers[i] -// if (item === item1) { -// mMapView.layerManager.jumpToPosition( -// item.getPoint().longitude, -// item.getPoint().latitude, -// 0 -// ) -// editIndex = i -// if (mPathLayerTemp != null) { -// mPathLayerTemp.setStyle(editTempStyle) -// val list: MutableList = java.util.ArrayList() -// if (editIndex == 0 || editIndex == mPathMakers.size - 1) { -// list.add(item.geoPoint as Nothing) -// list.add(item.geoPoint as Nothing) -// } else { -// list.add(mPathMakers[editIndex - 1].geoPoint as Nothing) -// list.add(item.geoPoint as Nothing) -// list.add(mPathMakers[editIndex + 1].geoPoint as Nothing) -// } -// mPathLayerTemp.setPoints(list) -// } -// return true -// } -// } + for (i in mPathMakers.indices) { + val item1 = mPathMakers[i] + if (item === item1) { + mMapView.vtmMap.animator().animateTo( + GeoPoint( + item.getPoint().latitude, item.getPoint().longitude + ) + ) + editIndex = i + mPathLayerTemp.setStyle(editTempStyle) + val list: MutableList = mutableListOf() + if (editIndex == 0 || editIndex == mPathMakers.size - 1) { + list.add(item.getPoint()) + list.add(item.getPoint()) + } else { + list.add(mPathMakers[editIndex - 1].geoPoint) + list.add(item.getPoint()) + list.add(mPathMakers[editIndex + 1].geoPoint) + } + mPathLayerTemp.setPoints(list) + return true + } + } } return false } diff --git a/collect-library/src/main/java/com/navinfo/collect/library/utils/StringUtil.kt b/collect-library/src/main/java/com/navinfo/collect/library/utils/StringUtil.kt index 7346c131..7641cfa5 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/utils/StringUtil.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/utils/StringUtil.kt @@ -1,6 +1,5 @@ package com.navinfo.collect.library.utils -import java.text.ParsePosition import java.text.SimpleDateFormat import java.util.* diff --git a/vtm b/vtm index dd13e533..1ee201a4 160000 --- a/vtm +++ b/vtm @@ -1 +1 @@ -Subproject commit dd13e533c38b5738ab404c2737d7ccadeff01323 +Subproject commit 1ee201a41f78f169873848209a3f3bdac36f185a From 7ebdfc93ff262b5037676c13fabb8cc3bcbc3fa2 Mon Sep 17 00:00:00 2001 From: qiji4215 Date: Thu, 13 Jul 2023 16:00:19 +0800 Subject: [PATCH 08/40] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=BD=A8=E8=BF=B9?= =?UTF-8?q?=E5=AD=98=E5=82=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/fragment/tasklist/TaskListFragment.kt | 11 +- .../library/data/entity/NiLocation.java | 20 ++ .../library/map/handler/MarkHandler.kt | 185 +++++++++++++----- .../src/main/res/mipmap-xxhdpi/icon_gps.png | Bin 0 -> 401 bytes .../src/main/res/mipmap-xxhdpi/icon_gps_1.png | Bin 0 -> 377 bytes .../res/mipmap-xxhdpi/icon_nilocation.png | Bin 0 -> 492 bytes .../res/mipmap-xxhdpi/icon_nilocation_1.png | Bin 0 -> 611 bytes vtm | 2 +- 8 files changed, 164 insertions(+), 54 deletions(-) create mode 100644 collect-library/src/main/res/mipmap-xxhdpi/icon_gps.png create mode 100644 collect-library/src/main/res/mipmap-xxhdpi/icon_gps_1.png create mode 100644 collect-library/src/main/res/mipmap-xxhdpi/icon_nilocation.png create mode 100644 collect-library/src/main/res/mipmap-xxhdpi/icon_nilocation_1.png diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt index f1f5e966..b45d51e9 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt @@ -40,6 +40,7 @@ class TaskListFragment : BaseFragment() { if (taskBean.hadLinkDvoList.isEmpty()) { Toast.makeText(context, "数据错误,无Link数据!", Toast.LENGTH_SHORT).show() } + when (status) { TaskListAdapter.Companion.ItemClickStatus.ITEM_LAYOUT_CLICK -> { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { @@ -48,6 +49,7 @@ class TaskListFragment : BaseFragment() { } } TaskListAdapter.Companion.ItemClickStatus.DELETE_LAYOUT_CLICK -> { + showLoadingDialog("正在关闭") context?.let { viewModel.removeTask(it, taskBean) } } TaskListAdapter.Companion.ItemClickStatus.UPLOAD_LAYOUT_CLICK -> { @@ -56,15 +58,6 @@ class TaskListFragment : BaseFragment() { viewModel.checkUploadTask(binding.root.context, taskBean) } else -> { - if(status==TaskListAdapter.Companion.ItemClickStatus.ITEM_LAYOUT_CLICK){ - viewModel.setSelectTaskBean(taskBean as TaskBean) - }else if(status==TaskListAdapter.Companion.ItemClickStatus.DELETE_LAYOUT_CLICK){ - showLoadingDialog("正在关闭") - context?.let { viewModel.removeTask(it, taskBean as TaskBean) } - }else if(status==TaskListAdapter.Companion.ItemClickStatus.UPLOAD_LAYOUT_CLICK){ - showLoadingDialog("正在校验") - viewModel.checkUploadTask(binding.root.context,taskBean) - } else { } } diff --git a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/NiLocation.java b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/NiLocation.java index 21e3a1fc..a81dc929 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/NiLocation.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/NiLocation.java @@ -65,6 +65,10 @@ public class NiLocation extends Feature{ private String groupId; @ColumnInfo(name = "timeStamp") private String timeStamp; + @ColumnInfo(name = "media") + private int media; + @ColumnInfo(name = "taskId") + private String taskId; private boolean isAccouracy; private boolean isSpeed; @@ -318,4 +322,20 @@ public class NiLocation extends Feature{ public void setTimeStamp(String timeStamp) { this.timeStamp = timeStamp; } + + public int getMedia() { + return media; + } + + public void setMedia(int media) { + this.media = media; + } + + public String getTaskId() { + return taskId; + } + + public void setTaskId(String taskId) { + this.taskId = taskId; + } } diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt index 4ba05831..63aca800 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt @@ -8,6 +8,7 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.content.res.ResourcesCompat import androidx.lifecycle.lifecycleScope import com.navinfo.collect.library.R +import com.navinfo.collect.library.data.entity.NiLocation import com.navinfo.collect.library.data.entity.NoteBean import com.navinfo.collect.library.data.entity.QsRecordBean import com.navinfo.collect.library.map.NIMapView @@ -30,11 +31,19 @@ import org.oscim.backend.CanvasAdapter import org.oscim.backend.canvas.Bitmap import org.oscim.backend.canvas.Paint import org.oscim.core.GeoPoint -import org.oscim.layers.marker.* +import org.oscim.layers.marker.ItemizedLayer import org.oscim.layers.marker.ItemizedLayer.OnItemGestureListener -import org.oscim.layers.vector.geometries.* +import org.oscim.layers.marker.MarkerInterface +import org.oscim.layers.marker.MarkerItem +import org.oscim.layers.marker.MarkerRendererFactory +import org.oscim.layers.marker.MarkerSymbol +import org.oscim.layers.vector.geometries.Drawable +import org.oscim.layers.vector.geometries.LineDrawable +import org.oscim.layers.vector.geometries.PointDrawable +import org.oscim.layers.vector.geometries.PolygonDrawable +import org.oscim.layers.vector.geometries.Style import org.oscim.map.Map -import java.util.* +import java.util.Locale /** * marker 操作 @@ -60,10 +69,16 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : private lateinit var canvas: org.oscim.backend.canvas.Canvas private lateinit var itemizedLayer: MyItemizedLayer + private lateinit var niLocationItemizedLayer: MyItemizedLayer + private lateinit var markerRendererFactory: MarkerRendererFactory private val resId = R.mipmap.map_icon_report private val noteResId = R.drawable.icon_note_marker private var itemListener: OnQsRecordItemClickListener? = null + private var niLocationBitmap: Bitmap? = null + private var niLocationBitmap1: Bitmap? = null + private var niLocationBitmap2: Bitmap? = null + private var niLocationBitmap3: Bitmap? = null /** * 文字大小 @@ -123,13 +138,17 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : init { //新增marker图标样式 val mDefaultBitmap = - AndroidBitmap(BitmapFactory.decodeResource(context.resources, R.mipmap.marker)); - + AndroidBitmap(BitmapFactory.decodeResource(context.resources, R.mipmap.marker)) val markerSymbol = MarkerSymbol( mDefaultBitmap, - MarkerSymbol.HotspotPlace.BOTTOM_CENTER - ); - //新增marker图层 + MarkerSymbol.HotspotPlace.BOTTOM_CENTER) + + niLocationBitmap = AndroidBitmap(BitmapFactory.decodeResource(context.resources, R.mipmap.icon_gps)) + niLocationBitmap1 = AndroidBitmap(BitmapFactory.decodeResource(context.resources, R.mipmap.icon_gps_1)) + niLocationBitmap2 = AndroidBitmap(BitmapFactory.decodeResource(context.resources, R.mipmap.icon_nilocation)) + niLocationBitmap3 = AndroidBitmap(BitmapFactory.decodeResource(context.resources, R.mipmap.icon_nilocation_1)) + + //新增marker图层 mDefaultMarkerLayer = ItemizedLayer( mapView.vtmMap, ArrayList(), @@ -156,6 +175,8 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : } }) initNoteData() + //初始化加载轨迹 + initNiLocationDataLayer() mMapView.updateMap() } @@ -413,6 +434,52 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : } + /** + * 初始化定位图层 + */ + private fun initNiLocationDataLayer() { + niLocationItemizedLayer = + MyItemizedLayer( + mMapView.vtmMap, + mutableListOf(), + markerRendererFactory, + object : MyItemizedLayer.OnItemGestureListener { + override fun onItemSingleTapUp( + list: MutableList, + nearest: Int + ): Boolean { + itemListener?.let { + val idList = mutableListOf() + if (list.size == 0) { + } else { + for (i in list) { + val markerInterface: MarkerInterface = + itemizedLayer.itemList[i] + if (markerInterface is MarkerItem) { + idList.add(markerInterface.title) + } + } + it.onQsRecordList(idList.distinct().toMutableList()) + } + } + return true + } + + override fun onItemLongPress( + list: MutableList?, + nearest: Int + ): Boolean { + return true + } + }) + addLayer(niLocationItemizedLayer, NIMapView.LAYER_GROUPS.OPERATE_MARKER) + mContext.lifecycleScope.launch(Dispatchers.IO) { + var list = mutableListOf() + + } + + } + /** * 添加质检数据marker */ @@ -456,34 +523,6 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : when (geometry.geometryType.uppercase(Locale.getDefault())) { "POINT" -> geoPoint = org.oscim.core.GeoPoint(geometry.coordinate.y, geometry.coordinate.x) -// "LINESTRING" -> { -// val lineString = geometry as LineString -// if (lineString != null && lineString.coordinates.size > 0) { -// geoPoint = GeoPoint( -// lineString.coordinates[0].y, -// lineString.coordinates[0].x -// ) -// } -// val drawableLine: Drawable = -// convertGeometry2Drawable(geometry, lineStyle) -// if (drawableLine != null) { -// dataVectorLayer.add(drawableLine) -// } -// } -// "POLYGON" -> { -// val polygon = geometry as Polygon -// if (polygon != null && polygon.coordinates.size > 0) { -// geoPoint = GeoPoint( -// polygon.coordinates[0].y, -// polygon.coordinates[0].x -// ) -// } -// val drawablePolygon: Drawable = -// convertGeometry2Drawable(geometry, polygonStyle) -// if (drawablePolygon != null) { -// dataVectorLayer.add(drawablePolygon) -// } -// } } } if (geoPoint != null) { @@ -492,14 +531,6 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : geoMarkerItem = ClusterMarkerItem( 1, item.id, item.description, geoPoint ) -// } else { -// geoMarkerItem = MarkerItem( -// ePointTemp.getType(), -// ePointTemp.getId(), -// ePointTemp.getStyleText(), -// geoPoint -// ) -// } val markerSymbol = MarkerSymbol(bitmap, MarkerSymbol.HotspotPlace.CENTER) geoMarkerItem.marker = markerSymbol @@ -510,6 +541,53 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : itemizedLayer.populate() } + /** + * 添加质检数据marker + */ + private suspend fun addNiLocationMarkerItem(niLocation: NiLocation) { + val item = MarkerItem(niLocation.id, "", GeoPoint(niLocation.latitude, niLocation.longitude)) + var itemizedLayer: ItemizedLayer? = null + val direction: Double = niLocation.direction + //角度 + when(niLocation.media){ + 0->{ + //角度不为0时需要预先设置marker样式并进行角度设置,否则使用图层默认的sym即可 + //角度不为0时需要预先设置marker样式并进行角度设置,否则使用图层默认的sym即可 + if (direction != 0.0) { + val symbolGpsTemp = + MarkerSymbol(niLocationBitmap, MarkerSymbol.HotspotPlace.CENTER, false) + item.marker = symbolGpsTemp + item.setRotation(direction.toFloat()) + }else{ + val symbolGpsTemp = + MarkerSymbol(niLocationBitmap2, MarkerSymbol.HotspotPlace.CENTER, false) + item.marker = symbolGpsTemp + } + niLocationItemizedLayer.addItem(item) + itemizedLayer = niLocationItemizedLayer + } + 1->{ + //角度不为0时需要预先设置marker样式并进行角度设置,否则使用图层默认的sym即可 + //角度不为0时需要预先设置marker样式并进行角度设置,否则使用图层默认的sym即可 + if (direction != 0.0) { + val symbolLidarTemp = MarkerSymbol(niLocationBitmap1, MarkerSymbol.HotspotPlace.CENTER, false) + item.marker = symbolLidarTemp + item.setRotation(direction.toFloat()) + }else{ + val symbolGpsTemp = + MarkerSymbol(niLocationBitmap3, MarkerSymbol.HotspotPlace.CENTER, false) + item.marker = symbolGpsTemp + } + niLocationItemizedLayer.addItem(item) + itemizedLayer = niLocationItemizedLayer + } + + } + + itemizedLayer!!.update() + + } + /** * 文字和图片拼装,文字换行 @@ -720,6 +798,25 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : bitmap } } + + /** + * 添加质检数据marker + */ + private suspend fun createTrackMarkerItem(item: NiLocation) { + for (item in itemizedLayer.itemList) { + if (item is MarkerItem) { + if (item.title == item.uid) { + itemizedLayer.itemList.remove(item) + break + } + } + } + //createMarkerItem(data) + withContext(Dispatchers.Main) { + mMapView.updateMap(true) + } + } + } interface OnQsRecordItemClickListener { diff --git a/collect-library/src/main/res/mipmap-xxhdpi/icon_gps.png b/collect-library/src/main/res/mipmap-xxhdpi/icon_gps.png new file mode 100644 index 0000000000000000000000000000000000000000..4dda1af7251a99f84e3e3a71f0cb7383a5526960 GIT binary patch literal 401 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=hEVFh+Q~IEF;Hzn$jmci2F{ZNK81 zz`TIG2hsv7H#}!6IeEYENAw}y8`Hg>vh8!MX7094oFF(c>gYz>#}2J6s@@alWZbLn zKG7npf9qq-pWKFHbNy=$rvBYHQV#nmg;F3@}M zwzJ?F)-GVWvE}`xZ0!{cW^b(-a#;->PV8IKB%zQJALPg)u=#qJ0OOH2TSYf9 z7QHcrkqj!|E^$RN2vujcsx%yn3sU4_gquSx&_ literal 0 HcmV?d00001 diff --git a/collect-library/src/main/res/mipmap-xxhdpi/icon_gps_1.png b/collect-library/src/main/res/mipmap-xxhdpi/icon_gps_1.png new file mode 100644 index 0000000000000000000000000000000000000000..770c1aea85439077e7a409df6ea7aeb06b4bdb69 GIT binary patch literal 377 zcmV-<0fzpGP)?!83TA+y{e%j3fUv#0f(amM@2p@0h}*j=r~y>=jtY7JoxQn& z3czGis9_Q?uCfUNe3 z3Soe}_R$IhfPb-%R2Txp>=`Ez8Zc@w8hoRXXFp*Hl2w4^JRg~o2UAlIAYi`-WD{9b zwHqd8a4xX~dTVvQPx$rb$FWR7efAmOW3yFc60C9O%bT2EF#_20*?9W&pP6T=V!LY1`VP*-%oYb)794_L#X&-hQ2YodFEajDw7@q{ z3s=3ymimhG(&3nh2exdHT%yXF?x^^NRwE&|ABUV=|0+b<#bVxJN)Slp4+lS26S)T_ zE4td}v=g?hfPPx%9Z5t%R7efAmOV%uK@`W|o7|nm!#h!%M3jJaau5>OLLq6yO*lot#x!YcVs8;8 z2!V7d)0ierECoFhu}K1YVL=fzbqdcfgha9?MlO5o%bN-B+`R+2aJ$pIdGp@*eF zyg|66(cobEm+KDs03(EuL!#?|&_)2q2(S-;ALvSAsl8a-yhO%?IKRHp_;~7czw`ur znq|?>`i$@hB784GdiKcqPq1v=#w9ba%F2iLTfx$n*Xz@OE`e zpeai<=~~vKpoRgRT2`JR_kw|D`vm?Avh5bpF(4xUnG8f`33}Zh-ye&fI`8lA<#V|s z15sM^aZL17xl(x`PV|=UQ$F9SbrqjYU-W=~io8?FpC>0h2877hN{kJmV)XUTz~K0s zBEq9MF$9T2t*-#_Yg{0{-@LYtjy(fvNhIFK1>!RD5etRi26T0Oy~Nl2MjS9wv?#jf zX5d=#Tm~Yu2&HU$=Nr*8ATC%1KC4eM7=`7Je~K$BWzjMq?Ie?_35Fd=pec*^I_o%Z zgBn#(dTs3}2{_Du%C}&`|Mqp^%ihXO)y}JebRg|GTPaj`d1YT}6C3imlxJ*vxVF0L xxuH@nV&-wOw>!mm#tdH@@jOlhrfrnZt-stZuT%vO)qMZ}002ovPDHLkV1hJF7+nAW literal 0 HcmV?d00001 diff --git a/vtm b/vtm index 1ee201a4..dd13e533 160000 --- a/vtm +++ b/vtm @@ -1 +1 @@ -Subproject commit 1ee201a41f78f169873848209a3f3bdac36f185a +Subproject commit dd13e533c38b5738ab404c2737d7ccadeff01323 From 43b62f9947d4a046e57590b10b45c4b15988da7e Mon Sep 17 00:00:00 2001 From: squallzhjch Date: Thu, 13 Jul 2023 16:36:43 +0800 Subject: [PATCH 09/40] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=AF=84=E6=B5=8Blink?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 + .../main/java/com/navinfo/omqs/Constant.kt | 2 + .../omqs/ui/activity/map/MainViewModel.kt | 27 +-- .../ui/fragment/tasklink/TaskLinkFragment.kt | 6 +- .../ui/fragment/tasklink/TaskLinkViewModel.kt | 39 +++- .../ui/fragment/tasklist/TaskViewModel.kt | 212 +++++++++++------- 6 files changed, 168 insertions(+), 120 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 03268d5c..ca4fa52f 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -131,6 +131,8 @@ dependencies { //图片加载 implementation 'com.github.bumptech.glide:glide:4.15.1' annotationProcessor 'com.github.bumptech.glide:compiler:4.15.1' +// implementation "io.realm:realm-kotlin-extensions:6.1.0" + } //允许引用生成的代码 kapt { diff --git a/app/src/main/java/com/navinfo/omqs/Constant.kt b/app/src/main/java/com/navinfo/omqs/Constant.kt index 3e194ff9..27fb6278 100644 --- a/app/src/main/java/com/navinfo/omqs/Constant.kt +++ b/app/src/main/java/com/navinfo/omqs/Constant.kt @@ -94,6 +94,8 @@ class Constant { const val EVENT_LAYER_MANAGER_CHANGE = "EVENT_LAYER_MANAGER_CHANGE" // 图层管理中的配置修改 const val SELECT_TASK_ID = "select_task_id" //选中的任务ID + + const val SHARED_SYNC_TASK_LINK_ID = "shared_sync_task_link_id"//利用shared通知任务页面更新 } 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 33720482..0894b197 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 @@ -3,6 +3,7 @@ package com.navinfo.omqs.ui.activity.map import android.app.Activity import android.content.Context import android.content.DialogInterface +import android.content.SharedPreferences import android.graphics.drawable.AnimationDrawable import android.graphics.drawable.BitmapDrawable import android.os.Build @@ -64,6 +65,7 @@ class MainViewModel @Inject constructor( private val mapController: NIMapController, private val traceDataBase: TraceDataBase, private val realmOperateHelper: RealmOperateHelper, + private val sharedPreferences: SharedPreferences ) : ViewModel() { private var mCameraDialog: CommonDialog? = null @@ -152,30 +154,19 @@ class MainViewModel @Inject constructor( } /** - * 初始话任务高亮高亮 + * 初始化选中的任务高亮高亮 */ private fun initTaskData() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - viewModelScope.launch { + viewModelScope.launch(Dispatchers.IO) { + val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) val realm = Realm.getDefaultInstance() - val results = realm.where(TaskBean::class.java).findAll() - val list = realm.copyFromRealm(results) - results.addChangeListener { changes -> - val list2 = realm.copyFromRealm(changes) - mapController.lineHandler.omdbTaskLinkLayer.removeAll() - for (item in list2) { - mapController.lineHandler.omdbTaskLinkLayer.addLineList(item.hadLinkDvoList) - } - } - mapController.lineHandler.omdbTaskLinkLayer.removeAll() - for (item in list) { -// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { -// mapController.lineHandler.omdbTaskLinkLayer.setLineColor(Color.valueOf(item.color)) -// } - mapController.lineHandler.omdbTaskLinkLayer.addLineList(item.hadLinkDvoList) + val res = realm.where(TaskBean::class.java).equalTo("id", id).findFirst() + if (res != null) { + val taskBean = realm.copyFromRealm(res) + mapController.lineHandler.omdbTaskLinkLayer.addLineList(taskBean.hadLinkDvoList) } } -// realm.close() } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkFragment.kt index 703e0d85..f259415d 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkFragment.kt @@ -6,7 +6,6 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Toast -import androidx.fragment.app.viewModels import androidx.navigation.findNavController import androidx.navigation.fragment.findNavController import com.navinfo.collect.library.map.NIMapController @@ -14,7 +13,6 @@ import com.navinfo.omqs.R import com.navinfo.omqs.databinding.FragmentTaskLinkBinding import com.navinfo.omqs.ui.activity.map.MainActivity import com.navinfo.omqs.ui.fragment.BaseFragment -import com.navinfo.omqs.ui.other.BaseToast import com.navinfo.omqs.ui.other.shareViewModels import dagger.hilt.android.AndroidEntryPoint import javax.inject.Inject @@ -144,7 +142,9 @@ class TaskLinkFragment : BaseFragment(), View.OnClickListener { onBackPressed() } binding.taskLinkBarSave -> { - viewModel.saveData() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + viewModel.saveData() + } } } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt index 88778e8e..1ccd5587 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt @@ -2,12 +2,14 @@ package com.navinfo.omqs.ui.fragment.tasklink import android.content.SharedPreferences import android.os.Build +import androidx.annotation.RequiresApi import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.navinfo.collect.library.data.entity.HadLinkDvoBean import com.navinfo.collect.library.data.entity.TaskBean import com.navinfo.collect.library.map.NIMapController +import com.navinfo.collect.library.utils.GeometryTools import com.navinfo.omqs.Constant import dagger.hilt.android.lifecycle.HiltViewModel import io.realm.Realm @@ -22,14 +24,14 @@ import javax.inject.Inject @HiltViewModel class TaskLinkViewModel @Inject constructor( - val mapController: NIMapController, - val sharedPreferences: SharedPreferences + private val mapController: NIMapController, + private val sharedPreferences: SharedPreferences ) : ViewModel(), SharedPreferences.OnSharedPreferenceChangeListener { /** * 种别 */ - private val kindList = listOf( + private val kindList = listOf( TaskLinkInfoAdapterItem("高速道路", "1"), TaskLinkInfoAdapterItem("城市高速", "2"), TaskLinkInfoAdapterItem("国道", "3"), @@ -47,7 +49,7 @@ class TaskLinkViewModel @Inject constructor( /** * FunctionGrade 功能等级 */ - private val functionLevelList = listOf( + private val functionLevelList = listOf( TaskLinkInfoAdapterItem("等级1", "1"), TaskLinkInfoAdapterItem("等级2", "2"), TaskLinkInfoAdapterItem("等级3", "3"), @@ -58,7 +60,7 @@ class TaskLinkViewModel @Inject constructor( /** * 数据级别 */ - private val dataLevelList = listOf( + private val dataLevelList = listOf( TaskLinkInfoAdapterItem("Pro lane model(有高精车道模型覆盖的高速和城高link)", "1"), TaskLinkInfoAdapterItem("Lite lane model(有高精车道模型覆盖的普通路link)", "2"), TaskLinkInfoAdapterItem("Standard road model(其他link)", "3"), @@ -115,7 +117,7 @@ class TaskLinkViewModel @Inject constructor( val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) val realm = Realm.getDefaultInstance() val res = realm.where(TaskBean::class.java).equalTo("id", id).findFirst() - liveDataTaskBean.postValue(realm.copyFromRealm(res)) + liveDataTaskBean.postValue(res?.let { realm.copyFromRealm(it) }) } } @@ -162,18 +164,17 @@ class TaskLinkViewModel @Inject constructor( /** * 保存数据 */ + @RequiresApi(Build.VERSION_CODES.M) fun saveData() { viewModelScope.launch(Dispatchers.Default) { if (liveDataTaskBean.value == null) { liveDataToastMessage.postValue("还没有选择任何一条任务!") return@launch } - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - if (mapController.measureLayerHandler.mPathLayer.points.size < 2) { - liveDataToastMessage.postValue("道路点少于2个!") - return@launch - } + if (mapController.measureLayerHandler.mPathLayer.points.size < 2) { + liveDataToastMessage.postValue("道路点少于2个!") + return@launch } if (liveDataSelectKind.value == null) { liveDataToastMessage.postValue("请选择种别!") @@ -187,7 +188,21 @@ class TaskLinkViewModel @Inject constructor( liveDataToastMessage.postValue("请选择数据等级!") return@launch } - val linkBean = HadLinkDvoBean(linkPid = UUID.randomUUID().toString()) + val linkBean = HadLinkDvoBean( + linkPid = UUID.randomUUID().toString(), + linkStatus = 3, + geometry = GeometryTools.getLineString(mapController.measureLayerHandler.mPathLayer.points), + linkLength = mapController.measureLayerHandler.lineLenghtLiveData.value!!, + ) + val task: TaskBean = liveDataTaskBean.value!! + task.hadLinkDvoList.add(linkBean) + val realm = Realm.getDefaultInstance() + realm.executeTransaction { + it.copyToRealmOrUpdate(task) + } + sharedPreferences.edit().putString(Constant.SHARED_SYNC_TASK_LINK_ID, linkBean.linkPid) + .apply() + liveDataFinish.postValue(true) } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt index 7ffa46e3..2552b46e 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt @@ -1,9 +1,8 @@ package com.navinfo.omqs.ui.fragment.tasklist -import android.app.Dialog import android.content.Context import android.content.SharedPreferences -import android.graphics.Color +import android.content.SharedPreferences.OnSharedPreferenceChangeListener import android.os.Build import android.widget.Toast import androidx.annotation.RequiresApi @@ -32,7 +31,7 @@ class TaskViewModel @Inject constructor( private val networkService: NetworkService, private val mapController: NIMapController, private val sharedPreferences: SharedPreferences -) : ViewModel() { +) : ViewModel(), OnSharedPreferenceChangeListener { /** * 用来更新任务列表 @@ -49,8 +48,8 @@ class TaskViewModel @Inject constructor( */ val liveDataTaskUpload = MutableLiveData>() - private val colors = - arrayOf(Color.RED, Color.YELLOW, Color.BLUE, Color.MAGENTA, Color.GREEN, Color.CYAN) +// private val colors = +// arrayOf(Color.RED, Color.YELLOW, Color.BLUE, Color.MAGENTA, Color.GREEN, Color.CYAN) /** * 当前选中的任务 @@ -65,13 +64,16 @@ class TaskViewModel @Inject constructor( private var filterTaskJob: Job? = null + init { + sharedPreferences.registerOnSharedPreferenceChangeListener(this) + } + /** * 下载任务列表 */ fun getTaskList(context: Context) { viewModelScope.launch(Dispatchers.IO) { - var taskList: List = mutableListOf() when (val result = networkService.getTaskList(Constant.USER_ID)) { is NetResult.Success -> { if (result.data != null) { @@ -87,6 +89,7 @@ class TaskViewModel @Inject constructor( task.fileSize = item.fileSize task.status = item.status task.currentSize = item.currentSize + task.hadLinkDvoList = item.hadLinkDvoList //已上传后不在更新操作时间 if (task.syncStatus != FileManager.Companion.FileUploadStatus.DONE) { //赋值时间,用于查询过滤 @@ -120,27 +123,40 @@ class TaskViewModel @Inject constructor( is NetResult.Loading -> {} } - val realm = Realm.getDefaultInstance() - //过滤掉已上传的超过90天的数据 - var nowTime: Long = DateTimeUtil.getNowDate().time - var beginNowTime: Long = nowTime - 90 * 3600 * 24 * 1000L - var syncUpload: Int = FileManager.Companion.FileUploadStatus.DONE - val objects = - realm.where(TaskBean::class.java).notEqualTo("syncStatus", syncUpload).or() - .between("operationTime", beginNowTime, nowTime) - .equalTo("syncStatus", syncUpload).findAll() - taskList = realm.copyFromRealm(objects) + getLocalTaskList() + } + } + + /** + * 获取任务列表 + */ + private suspend fun getLocalTaskList() { + val realm = Realm.getDefaultInstance() + //过滤掉已上传的超过90天的数据 + val nowTime: Long = DateTimeUtil.getNowDate().time + val beginNowTime: Long = nowTime - 90 * 3600 * 24 * 1000L + val syncUpload: Int = FileManager.Companion.FileUploadStatus.DONE + val objects = + realm.where(TaskBean::class.java).notEqualTo("syncStatus", syncUpload).or() + .between("operationTime", beginNowTime, nowTime) + .equalTo("syncStatus", syncUpload).findAll() + val taskList = realm.copyFromRealm(objects) + for (item in taskList) { + FileManager.checkOMDBFileInfo(item) + } + liveDataTaskList.postValue(taskList) + val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) + if (id > -1) { for (item in taskList) { - FileManager.checkOMDBFileInfo(item) - } - liveDataTaskList.postValue(taskList) - val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) - if (id > -1) { - for(item in taskList){ - if(item.id == id){ - currentSelectTaskBean = item - liveDataTaskLinks.postValue(currentSelectTaskBean!!.hadLinkDvoList) + if (item.id == id) { + currentSelectTaskBean = item + liveDataTaskLinks.postValue(currentSelectTaskBean!!.hadLinkDvoList) + withContext(Dispatchers.Main) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + showTaskLinks(currentSelectTaskBean!!) + } } + break } } } @@ -149,14 +165,21 @@ class TaskViewModel @Inject constructor( /** * 设置当前选择的任务,并高亮当前任务的所有link */ - @RequiresApi(Build.VERSION_CODES.M) + fun setSelectTaskBean(taskBean: TaskBean) { - sharedPreferences.edit().putInt(Constant.SELECT_TASK_ID, taskBean.id).commit() + sharedPreferences.edit().putInt(Constant.SELECT_TASK_ID, taskBean.id).apply() currentSelectTaskBean = taskBean liveDataTaskLinks.value = taskBean.hadLinkDvoList + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + showTaskLinks(taskBean) + } + } + + @RequiresApi(Build.VERSION_CODES.M) + private fun showTaskLinks(taskBean: TaskBean) { mapController.lineHandler.omdbTaskLinkLayer.removeAll() if (taskBean.hadLinkDvoList.isNotEmpty()) { @@ -215,10 +238,13 @@ class TaskViewModel @Inject constructor( if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { mapController.lineHandler.omdbTaskLinkLayer.clearSelectLine() } + sharedPreferences.unregisterOnSharedPreferenceChangeListener(this) super.onCleared() } - + /** + * 保存link补作业原因 + */ suspend fun saveLinkReason(bean: HadLinkDvoBean, text: String) { withContext(Dispatchers.IO) { currentSelectTaskBean?.let { @@ -227,11 +253,12 @@ class TaskViewModel @Inject constructor( item.reason = text } } + val realm = Realm.getDefaultInstance() + realm.executeTransaction { r -> + r.copyToRealmOrUpdate(it) + } } - val realm = Realm.getDefaultInstance() - realm.executeTransaction { - realm.copyToRealmOrUpdate(currentSelectTaskBean) - } + } } @@ -255,6 +282,9 @@ class TaskViewModel @Inject constructor( } } + /** + * 筛选link + */ fun filterTask(pidKey: String) { if (currentSelectTaskBean == null) return @@ -272,53 +302,54 @@ class TaskViewModel @Inject constructor( } } + /** + * 关闭任务 + */ fun removeTask(context: Context, taskBean: TaskBean) { - if (taskBean != null) { - val mDialog = FirstDialog(context) - mDialog.setTitle("提示?") - mDialog.setMessage("是否关闭,请确认!") - mDialog.setPositiveButton("确定", object : FirstDialog.OnClickListener { - override fun onClick(dialog: Dialog?, which: Int) { - mDialog.dismiss() - viewModelScope.launch(Dispatchers.IO) { - val realm = Realm.getDefaultInstance() - realm.executeTransaction { - val objects = it.where(TaskBean::class.java) - .equalTo("id", taskBean.id).findFirst() - objects?.deleteFromRealm() + val mDialog = FirstDialog(context) + mDialog.setTitle("提示?") + mDialog.setMessage("是否关闭,请确认!") + mDialog.setPositiveButton( + "确定" + ) { _, _ -> + mDialog.dismiss() + viewModelScope.launch(Dispatchers.IO) { + val realm = Realm.getDefaultInstance() + realm.executeTransaction { + val objects = it.where(TaskBean::class.java) + .equalTo("id", taskBean.id).findFirst() + objects?.deleteFromRealm() + } + //遍历删除对应的数据 + taskBean.hadLinkDvoList.forEach { hadLinkDvoBean -> + val qsRecordList = realm.where(QsRecordBean::class.java) + .equalTo("linkId", hadLinkDvoBean.linkPid).findAll() + if (qsRecordList != null && qsRecordList.size > 0) { + val copyList = realm.copyFromRealm(qsRecordList) + copyList.forEach { + it.deleteFromRealm() + mapController.markerHandle.removeQsRecordMark(it) + mapController.mMapView.vtmMap.updateMap(true) } - //遍历删除对应的数据 - taskBean.hadLinkDvoList.forEach { hadLinkDvoBean -> - val qsRecordList = realm.where(QsRecordBean::class.java) - .equalTo("linkId", hadLinkDvoBean.linkPid).findAll() - if (qsRecordList != null && qsRecordList.size > 0) { - val copyList = realm.copyFromRealm(qsRecordList) - copyList.forEach { - it.deleteFromRealm() - mapController.markerHandle.removeQsRecordMark(it) - mapController.mMapView.vtmMap.updateMap(true) - } - } - } - //过滤掉已上传的超过90天的数据 - var nowTime: Long = DateTimeUtil.getNowDate().time - var beginNowTime: Long = nowTime - 90 * 3600 * 24 * 1000L - var syncUpload: Int = FileManager.Companion.FileUploadStatus.DONE - val objects = realm.where(TaskBean::class.java) - .notEqualTo("syncStatus", syncUpload).or() - .between("operationTime", beginNowTime, nowTime) - .equalTo("syncStatus", syncUpload).findAll() - val taskList = realm.copyFromRealm(objects) - for (item in taskList) { - FileManager.checkOMDBFileInfo(item) - } - liveDataTaskList.postValue(taskList) } } - }) - mDialog.setNegativeButton("取消", null) - mDialog.show() + //过滤掉已上传的超过90天的数据 + val nowTime: Long = DateTimeUtil.getNowDate().time + val beginNowTime: Long = nowTime - 90 * 3600 * 24 * 1000L + val syncUpload: Int = FileManager.Companion.FileUploadStatus.DONE + val objects = realm.where(TaskBean::class.java) + .notEqualTo("syncStatus", syncUpload).or() + .between("operationTime", beginNowTime, nowTime) + .equalTo("syncStatus", syncUpload).findAll() + val taskList = realm.copyFromRealm(objects) + for (item in taskList) { + FileManager.checkOMDBFileInfo(item) + } + liveDataTaskList.postValue(taskList) + } } + mDialog.setNegativeButton("取消", null) + mDialog.show() } fun checkUploadTask(context: Context, taskBean: TaskBean) { @@ -335,19 +366,15 @@ class TaskViewModel @Inject constructor( mDialog.setTitle("提示?") mDialog.setMessage("此任务中存在未测评link,请确认!") mDialog.setPositiveButton( - "确定", - object : FirstDialog.OnClickListener { - override fun onClick(dialog: Dialog?, which: Int) { - mDialog.dismiss() - map[taskBean] = true - liveDataTaskUpload.postValue(map) - } - }) - mDialog.setNegativeButton("取消", object : FirstDialog.OnClickListener { - override fun onClick(dialog: Dialog?, which: Int) { - mDialog.dismiss() - } - }) + "确定" + ) { _, _ -> + mDialog.dismiss() + map[taskBean] = true + liveDataTaskUpload.postValue(map) + } + mDialog.setNegativeButton( + "取消" + ) { _, _ -> mDialog.dismiss() } mDialog.show() } return@launch @@ -357,4 +384,15 @@ class TaskViewModel @Inject constructor( } } } + + /** + * 监听新增的评测link + */ + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { + if (key == Constant.SHARED_SYNC_TASK_LINK_ID) { + viewModelScope.launch(Dispatchers.IO) { + getLocalTaskList() + } + } + } } From be2d0389cfc56a8d6f779d466409eb42090b0c6f Mon Sep 17 00:00:00 2001 From: squallzhjch Date: Thu, 13 Jul 2023 17:43:38 +0800 Subject: [PATCH 10/40] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=AF=84=E6=B5=8Blink?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../omqs/ui/activity/map/MainViewModel.kt | 61 ++- .../library/map/handler/MarkHandler.kt | 367 +++++++++--------- 2 files changed, 228 insertions(+), 200 deletions(-) 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 0894b197..ab19604d 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 @@ -19,10 +19,13 @@ import androidx.annotation.RequiresApi import androidx.constraintlayout.widget.Group import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import androidx.lifecycle.lifecycleScope import androidx.lifecycle.viewModelScope import androidx.navigation.findNavController import com.blankj.utilcode.util.ToastUtils import com.navinfo.collect.library.data.dao.impl.TraceDataBase +import com.navinfo.collect.library.data.entity.NoteBean +import com.navinfo.collect.library.data.entity.QsRecordBean import com.navinfo.collect.library.data.entity.RenderEntity import com.navinfo.collect.library.data.entity.TaskBean import com.navinfo.collect.library.map.NIMapController @@ -44,6 +47,7 @@ import com.navinfo.omqs.util.SpeakMode import dagger.hilt.android.lifecycle.HiltViewModel import io.realm.Realm import io.realm.RealmSet +import io.realm.kotlin.where import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch @@ -149,27 +153,62 @@ class MainViewModel @Inject constructor( } } } - - initTaskData() + viewModelScope.launch(Dispatchers.IO) { + initTaskData() + initQsRecordData() + initNoteData() + } } /** * 初始化选中的任务高亮高亮 */ - private fun initTaskData() { + private suspend fun initTaskData() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - viewModelScope.launch(Dispatchers.IO) { - val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) - val realm = Realm.getDefaultInstance() - val res = realm.where(TaskBean::class.java).equalTo("id", id).findFirst() - if (res != null) { - val taskBean = realm.copyFromRealm(res) - mapController.lineHandler.omdbTaskLinkLayer.addLineList(taskBean.hadLinkDvoList) - } + val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) + val realm = Realm.getDefaultInstance() + val res = realm.where(TaskBean::class.java).equalTo("id", id).findFirst() + if (res != null) { + val taskBean = realm.copyFromRealm(res) + mapController.lineHandler.omdbTaskLinkLayer.addLineList(taskBean.hadLinkDvoList) } } } + /** + * 初始化渲染质检数据 + */ + private suspend fun initQsRecordData() { + var list = mutableListOf() + val realm = Realm.getDefaultInstance() + realm.executeTransaction { + val objects = realm.where().findAll() + list = realm.copyFromRealm(objects) + } + for (item in list) { + mapController.markerHandle.addOrUpdateQsRecordMark(item) + } + } + + /** + * 初始化渲染便签数据 + */ + private suspend fun initNoteData() { + var list = mutableListOf() + val realm = Realm.getDefaultInstance() + realm.executeTransaction { + val objects = realm.where().findAll() + list = realm.copyFromRealm(objects) + } + + for (item in list) { + mapController.markerHandle.addOrUpdateNoteMark(item) + } + } + + /** + * 初始化定位信息 + */ private fun initLocation() { //用于定位点存储到数据库 viewModelScope.launch(Dispatchers.Default) { diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt index 4ba05831..a8d968dc 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt @@ -42,8 +42,6 @@ import java.util.* class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler(context, mapView) { - // //默认marker图层 - private var mDefaultMarkerLayer: ItemizedLayer /** * 默认文字颜色 @@ -53,22 +51,94 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : /** * 文字画笔 */ - - private lateinit var paint: Paint - - //画布 - private lateinit var canvas: org.oscim.backend.canvas.Canvas - private lateinit var itemizedLayer: MyItemizedLayer - - private lateinit var markerRendererFactory: MarkerRendererFactory - private val resId = R.mipmap.map_icon_report - private val noteResId = R.drawable.icon_note_marker - private var itemListener: OnQsRecordItemClickListener? = null + private val paint: Paint by lazy { + val p = CanvasAdapter.newPaint() + p.setTypeface(Paint.FontFamily.DEFAULT, Paint.FontStyle.NORMAL) + p.setTextSize(NUM_13 * CanvasAdapter.getScale()) + p.strokeWidth = 2 * CanvasAdapter.getScale() + p.color = Color.parseColor(mDefaultTextColor) + p + } /** - * 文字大小 + * 画布 */ - private val NUM_13 = 13 + private val canvas: org.oscim.backend.canvas.Canvas by lazy { + CanvasAdapter.newCanvas() + } + + /** + * 默认marker图层 + */ + private val mDefaultMarkerLayer: ItemizedLayer by lazy { + //新增marker图标样式 + val mDefaultBitmap = + AndroidBitmap(BitmapFactory.decodeResource(context.resources, R.mipmap.marker)) + + val markerSymbol = MarkerSymbol( + mDefaultBitmap, + MarkerSymbol.HotspotPlace.BOTTOM_CENTER + ) + val layer = ItemizedLayer( + mapView.vtmMap, + ArrayList(), + markerSymbol, + object : OnItemGestureListener { + override fun onItemSingleTapUp(index: Int, item: MarkerInterface?): Boolean { + return false + } + + override fun onItemLongPress(index: Int, item: MarkerInterface?): Boolean { + return false + } + + } + ) + addLayer(layer, NIMapView.LAYER_GROUPS.OPERATE_MARKER) + layer + } + + + /** + * 评测数据marker 图层 + */ + private val qsRecordItemizedLayer: MyItemizedLayer by lazy { + val layer = MyItemizedLayer( + mMapView.vtmMap, + mutableListOf(), + markerRendererFactory, + object : MyItemizedLayer.OnItemGestureListener { + override fun onItemSingleTapUp( + list: MutableList, + nearest: Int + ): Boolean { + itemListener?.let { + val idList = mutableListOf() + if (list.size == 0) { + } else { + for (i in list) { + val markerInterface: MarkerInterface = + qsRecordItemizedLayer.itemList[i] + if (markerInterface is MarkerItem) { + idList.add(markerInterface.title) + } + } + it.onQsRecordList(idList.distinct().toMutableList()) + } + } + return true + } + + override fun onItemLongPress( + list: MutableList?, + nearest: Int + ): Boolean { + return true + } + }) + addLayer(layer, NIMapView.LAYER_GROUPS.OPERATE_MARKER) + layer + } /** * 便签线图层 @@ -79,7 +149,9 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : layer } - + /** + * 便签图标图层 + */ private val noteLayer: MyItemizedLayer by lazy { val layer = MyItemizedLayer( @@ -94,6 +166,7 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : itemListener?.let { val idList = mutableListOf() if (list.size == 0) { + } else { for (i in list) { val markerInterface: MarkerInterface = @@ -120,50 +193,61 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : layer } - init { - //新增marker图标样式 - val mDefaultBitmap = - AndroidBitmap(BitmapFactory.decodeResource(context.resources, R.mipmap.marker)); - val markerSymbol = MarkerSymbol( - mDefaultBitmap, - MarkerSymbol.HotspotPlace.BOTTOM_CENTER - ); - //新增marker图层 - mDefaultMarkerLayer = ItemizedLayer( - mapView.vtmMap, - ArrayList(), - markerSymbol, - object : OnItemGestureListener { - override fun onItemSingleTapUp(index: Int, item: MarkerInterface?): Boolean { - return false - } - - override fun onItemLongPress(index: Int, item: MarkerInterface?): Boolean { - return false - } - - } + private val markerRendererFactory: MarkerRendererFactory by lazy { + val bitmapPoi: Bitmap = AndroidBitmap( + BitmapFactory.decodeResource( + mContext.resources, + R.mipmap.map_icon_blue2 + ) ) + val symbol = MarkerSymbol(bitmapPoi, MarkerSymbol.HotspotPlace.BOTTOM_CENTER) + MarkerRendererFactory { markerLayer -> + object : ClusterMarkerRenderer( + mContext, + markerLayer, + symbol, + ClusterStyle( + org.oscim.backend.canvas.Color.WHITE, + org.oscim.backend.canvas.Color.BLUE + ) + ) { +// override fun getClusterBitmap(size: Int): Bitmap? { +// return super.getclusterbitmap(size) +// } + } + } + } + private val resId = R.mipmap.map_icon_report + private val noteResId = R.drawable.icon_note_marker + private var itemListener: OnQsRecordItemClickListener? = null - //初始化之间数据图层 - initQsRecordDataLayer() - addLayer(mDefaultMarkerLayer, NIMapView.LAYER_GROUPS.OPERATE_MARKER); + /** + * 文字大小 + */ + private val NUM_13 = 13 + + + init { // 设置矢量图层均在12级以上才显示 mMapView.vtmMap.events.bind(Map.UpdateListener { e, mapPosition -> if (e == Map.SCALE_EVENT) { - itemizedLayer.isEnabled = mapPosition.getZoomLevel() >= 12 + qsRecordItemizedLayer.isEnabled = mapPosition.getZoomLevel() >= 12 } }) - initNoteData() - mMapView.updateMap() } + /** + * 设置marker 点击回调 + */ fun setOnQsRecordItemClickListener(listener: OnQsRecordItemClickListener?) { itemListener = listener } - //增加marker + /** + * 增加marker + */ + fun addMarker( geoPoint: GeoPoint, title: String?, @@ -177,16 +261,16 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : } } if (marker == null) { - var tempTitle = title; + var tempTitle = title if (tempTitle.isNullOrBlank()) { - tempTitle = StringUtil.createUUID(); + tempTitle = StringUtil.createUUID() } val marker = MarkerItem( tempTitle, description, geoPoint ) - mDefaultMarkerLayer.addItem(marker); + mDefaultMarkerLayer.addItem(marker) mMapView.vtmMap.updateMap(true) } else { marker.description = description @@ -218,26 +302,24 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : /** * 增加或更新marker */ - suspend fun addOrUpdateQsRecordMark(data: QsRecordBean) { - for (item in itemizedLayer.itemList) { + fun addOrUpdateQsRecordMark(data: QsRecordBean) { + for (item in qsRecordItemizedLayer.itemList) { if (item is MarkerItem) { if (item.title == data.id) { - itemizedLayer.itemList.remove(item) + qsRecordItemizedLayer.itemList.remove(item) break } } } - createMarkerItem(data) - withContext(Dispatchers.Main) { - mMapView.updateMap(true) - } + createQsRecordMarker(data) + mMapView.updateMap(true) } /** * 增加或更新便签 */ - suspend fun addOrUpdateNoteMark(data: NoteBean) { + fun addOrUpdateNoteMark(data: NoteBean) { for (item in noteLayer.itemList) { if (item is MarkerItem) { if (item.title == data.id) { @@ -248,9 +330,7 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : } noteLineLayer.removeNoteBeanLines(data) createNoteMarkerItem(data) - withContext(Dispatchers.Main) { - mMapView.updateMap(true) - } + mMapView.updateMap(true) } @@ -258,19 +338,13 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : var resultDrawable: Drawable? = null if ("POINT" == geometry.geometryType.uppercase(Locale.getDefault())) { val geoPoint = GeoPoint(geometry.coordinate.y, geometry.coordinate.x) - if (geoPoint != null) { - resultDrawable = PointDrawable(geoPoint, vectorLayerStyle) - } + resultDrawable = PointDrawable(geoPoint, vectorLayerStyle) } else if ("LINESTRING" == geometry.geometryType.uppercase(Locale.getDefault())) { val lineString = geometry as LineString - if (lineString != null) { - resultDrawable = LineDrawable(lineString, vectorLayerStyle) - } + resultDrawable = LineDrawable(lineString, vectorLayerStyle) } else if ("POLYGON" == geometry.geometryType.uppercase(Locale.getDefault())) { val polygon = geometry as Polygon - if (polygon != null) { - resultDrawable = PolygonDrawable(polygon, vectorLayerStyle) - } + resultDrawable = PolygonDrawable(polygon, vectorLayerStyle) } return resultDrawable } @@ -279,12 +353,12 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : /** * 删除质检数据 */ - suspend fun removeQsRecordMark(data: QsRecordBean) { - for (item in itemizedLayer.itemList) { + fun removeQsRecordMark(data: QsRecordBean) { + for (item in qsRecordItemizedLayer.itemList) { if (item is MarkerItem) { if (item.title == data.id) { - itemizedLayer.itemList.remove(item) - itemizedLayer.populate() + qsRecordItemizedLayer.itemList.remove(item) + qsRecordItemizedLayer.populate() return } } @@ -294,141 +368,56 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : /** * 删除标签 */ - suspend fun removeNoteMark(data: NoteBean) { + fun removeNoteMark(data: NoteBean) { for (item in noteLayer.itemList) { if (item is MarkerItem) { if (item.title == data.id) { noteLayer.itemList.remove(item) noteLineLayer.removeNoteBeanLines(data) noteLayer.populate() - withContext(Dispatchers.Main) { - mMapView.updateMap(true) - } + mMapView.updateMap(true) return } } } } - /** - * 初始化便签 - */ - private fun initNoteData() { - mContext.lifecycleScope.launch(Dispatchers.IO) { - var list = mutableListOf() - val realm = Realm.getDefaultInstance() - realm.executeTransaction { - val objects = realm.where().findAll() - list = realm.copyFromRealm(objects) - } - for (item in list) { - createNoteMarkerItem(item) - } - } - } - - /** - * 初始话质检数据图层 - */ - private fun initQsRecordDataLayer() { - - canvas = CanvasAdapter.newCanvas() - paint = CanvasAdapter.newPaint() - paint.setTypeface(Paint.FontFamily.DEFAULT, Paint.FontStyle.NORMAL) - paint.setTextSize(NUM_13 * CanvasAdapter.getScale()) - paint.strokeWidth = 2 * CanvasAdapter.getScale() - paint.color = Color.parseColor(mDefaultTextColor) - val bitmapPoi: Bitmap = AndroidBitmap( - BitmapFactory.decodeResource( - mContext.resources, - R.mipmap.map_icon_blue2 - ) - ) - val symbol = MarkerSymbol(bitmapPoi, MarkerSymbol.HotspotPlace.BOTTOM_CENTER) - markerRendererFactory = MarkerRendererFactory { markerLayer -> - object : ClusterMarkerRenderer( - mContext, - markerLayer, - symbol, - ClusterStyle( - org.oscim.backend.canvas.Color.WHITE, - org.oscim.backend.canvas.Color.BLUE - ) - ) { -// override fun getClusterBitmap(size: Int): Bitmap? { -// return super.getclusterbitmap(size) -// } - } - } - - itemizedLayer = - MyItemizedLayer( - mMapView.vtmMap, - mutableListOf(), - markerRendererFactory, - object : MyItemizedLayer.OnItemGestureListener { - override fun onItemSingleTapUp( - list: MutableList, - nearest: Int - ): Boolean { - itemListener?.let { - val idList = mutableListOf() - if (list.size == 0) { - } else { - for (i in list) { - val markerInterface: MarkerInterface = - itemizedLayer.itemList[i] - if (markerInterface is MarkerItem) { - idList.add(markerInterface.title) - } - } - it.onQsRecordList(idList.distinct().toMutableList()) - } - } - return true - } - - override fun onItemLongPress( - list: MutableList?, - nearest: Int - ): Boolean { - return true - } - }) - addLayer(itemizedLayer, NIMapView.LAYER_GROUPS.OPERATE_MARKER) - mContext.lifecycleScope.launch(Dispatchers.IO) { - var list = mutableListOf() - val realm = Realm.getDefaultInstance() - realm.executeTransaction { - val objects = realm.where().findAll() - list = realm.copyFromRealm(objects) - } -// realm.close() - - for (item in list) { - createMarkerItem(item) - } - } - - } +// /** +// * 初始话质检数据图层 +// */ +// private fun initQsRecordDataLayer() { +// +// mContext.lifecycleScope.launch(Dispatchers.IO) { +// var list = mutableListOf() +// val realm = Realm.getDefaultInstance() +// realm.executeTransaction { +// val objects = realm.where().findAll() +// list = realm.copyFromRealm(objects) +// } +// for (item in list) { +// createMarkerItem(item) +// } +// } +// +// } /** * 添加质检数据marker */ - private suspend fun createNoteMarkerItem(item: NoteBean) { + private fun createNoteMarkerItem(item: NoteBean) { val bitmap: Bitmap = createTextMarkerBitmap(mContext, item.description, noteResId) val geometry: Geometry? = GeometryTools.createGeometry(item.guideGeometry) if (geometry != null) { - var geoPoint: org.oscim.core.GeoPoint? = null + var geoPoint: GeoPoint? = null if (geometry.geometryType != null) { when (geometry.geometryType.uppercase(Locale.getDefault())) { "POINT" -> geoPoint = - org.oscim.core.GeoPoint(geometry.coordinate.y, geometry.coordinate.x) + GeoPoint(geometry.coordinate.y, geometry.coordinate.x) } } if (geoPoint != null) { - var geoMarkerItem: MarkerItem + val geoMarkerItem: MarkerItem geoMarkerItem = ClusterMarkerItem( 1, item.id, item.description, geoPoint ) @@ -446,16 +435,16 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : /** * 添加质检数据marker */ - private suspend fun createMarkerItem(item: QsRecordBean) { + private fun createQsRecordMarker(item: QsRecordBean) { val bitmap: Bitmap = createTextMarkerBitmap(mContext, item.description, resId) if (item.t_lifecycle != 2) { val geometry: Geometry? = GeometryTools.createGeometry(item.geometry) if (geometry != null) { - var geoPoint: org.oscim.core.GeoPoint? = null + var geoPoint: GeoPoint? = null if (geometry.geometryType != null) { when (geometry.geometryType.uppercase(Locale.getDefault())) { "POINT" -> geoPoint = - org.oscim.core.GeoPoint(geometry.coordinate.y, geometry.coordinate.x) + GeoPoint(geometry.coordinate.y, geometry.coordinate.x) // "LINESTRING" -> { // val lineString = geometry as LineString // if (lineString != null && lineString.coordinates.size > 0) { @@ -487,7 +476,7 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : } } if (geoPoint != null) { - var geoMarkerItem: MarkerItem + val geoMarkerItem: MarkerItem // if (item.getType() === 1) { geoMarkerItem = ClusterMarkerItem( 1, item.id, item.description, geoPoint @@ -503,11 +492,11 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : val markerSymbol = MarkerSymbol(bitmap, MarkerSymbol.HotspotPlace.CENTER) geoMarkerItem.marker = markerSymbol - itemizedLayer.itemList.add(geoMarkerItem) + qsRecordItemizedLayer.itemList.add(geoMarkerItem) } } } - itemizedLayer.populate() + qsRecordItemizedLayer.populate() } @@ -700,7 +689,7 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : val originBitmap = android.graphics.Bitmap.createBitmap( if (drawable.intrinsicWidth > maxWidth) drawable.intrinsicWidth else maxWidth.toInt(), drawable.intrinsicHeight * 2, - android.graphics.Bitmap.Config.ARGB_4444 + android.graphics.Bitmap.Config.ARGB_8888 ) val androidCanvas = Canvas(originBitmap) val startX = (originBitmap.width - drawable.intrinsicWidth) / 2 From 108c6daa2f230afe598dc7d536ba76619634853f Mon Sep 17 00:00:00 2001 From: qiji4215 Date: Fri, 14 Jul 2023 10:54:02 +0800 Subject: [PATCH 11/40] merge code --- .../omqs/ui/activity/map/MainActivity.kt | 6 + .../omqs/ui/activity/map/MainViewModel.kt | 245 ++++++++++-------- .../ui/fragment/tasklist/TaskViewModel.kt | 15 ++ .../library/data/dao/impl/INiLocationDao.java | 3 + .../library/map/handler/MarkHandler.kt | 39 +-- 5 files changed, 180 insertions(+), 128 deletions(-) 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 470c9128..c5151558 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 @@ -220,6 +220,12 @@ class MainActivity : BaseActivity() { } } } + + //捕捉列表变化回调 + viewModel.liveDataNILocationList.observe(this) { + Toast.makeText(this,"轨迹被点击了",Toast.LENGTH_LONG).show() + } + //右上角菜单是否被点击 viewModel.liveDataMenuState.observe(this) { binding.mainActivityMenu.isSelected = it 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 33720482..eb5ada1d 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 @@ -3,6 +3,7 @@ package com.navinfo.omqs.ui.activity.map import android.app.Activity import android.content.Context import android.content.DialogInterface +import android.content.SharedPreferences import android.graphics.drawable.AnimationDrawable import android.graphics.drawable.BitmapDrawable import android.os.Build @@ -15,13 +16,13 @@ import android.view.ViewGroup import android.widget.ImageView import android.widget.PopupWindow import androidx.annotation.RequiresApi -import androidx.constraintlayout.widget.Group import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import androidx.navigation.findNavController import com.blankj.utilcode.util.ToastUtils import com.navinfo.collect.library.data.dao.impl.TraceDataBase +import com.navinfo.collect.library.data.entity.NiLocation import com.navinfo.collect.library.data.entity.RenderEntity import com.navinfo.collect.library.data.entity.TaskBean import com.navinfo.collect.library.map.NIMapController @@ -31,7 +32,6 @@ import com.navinfo.collect.library.utils.GeometryToolsKt import com.navinfo.omqs.Constant import com.navinfo.omqs.R import com.navinfo.omqs.bean.ImportConfig -import com.navinfo.omqs.bean.RoadNameBean import com.navinfo.omqs.bean.SignBean import com.navinfo.omqs.db.RealmOperateHelper import com.navinfo.omqs.ui.dialog.CommonDialog @@ -59,11 +59,13 @@ import javax.inject.Inject * 创建Activity全局viewmode */ +@RequiresApi(Build.VERSION_CODES.M) @HiltViewModel class MainViewModel @Inject constructor( private val mapController: NIMapController, private val traceDataBase: TraceDataBase, private val realmOperateHelper: RealmOperateHelper, + private val sharedPreferences: SharedPreferences, ) : ViewModel() { private var mCameraDialog: CommonDialog? = null @@ -74,6 +76,9 @@ class MainViewModel @Inject constructor( //地图点击捕捉到的标签ID列表 val liveDataNoteIdList = MutableLiveData>() + //地图点击捕捉到的轨迹列表 + val liveDataNILocationList = MutableLiveData>() + //左侧看板数据 val liveDataSignList = MutableLiveData>() @@ -117,6 +122,8 @@ class MainViewModel @Inject constructor( private var linkIdCache = "" + private var lastNiLocaion: NiLocation? = null + init { mapController.mMapView.vtmMap.events.bind(Map.UpdateListener { e, mapPosition -> when (e) { @@ -135,6 +142,10 @@ class MainViewModel @Inject constructor( override fun onNoteList(list: MutableList) { liveDataNoteIdList.value = list } + + override fun onNiLocationList(list: MutableList) { + liveDataNILocationList.value = list + } }) initLocation() //处理地图点击操作 @@ -154,29 +165,26 @@ class MainViewModel @Inject constructor( /** * 初始话任务高亮高亮 */ + @RequiresApi(Build.VERSION_CODES.M) private fun initTaskData() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - viewModelScope.launch { - val realm = Realm.getDefaultInstance() - val results = realm.where(TaskBean::class.java).findAll() - val list = realm.copyFromRealm(results) - results.addChangeListener { changes -> - val list2 = realm.copyFromRealm(changes) - mapController.lineHandler.omdbTaskLinkLayer.removeAll() - for (item in list2) { - mapController.lineHandler.omdbTaskLinkLayer.addLineList(item.hadLinkDvoList) - } - } + viewModelScope.launch { + val realm = Realm.getDefaultInstance() + val results = realm.where(TaskBean::class.java).findAll() + val list = realm.copyFromRealm(results) + results.addChangeListener { changes -> + val list2 = realm.copyFromRealm(changes) mapController.lineHandler.omdbTaskLinkLayer.removeAll() - for (item in list) { -// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { -// mapController.lineHandler.omdbTaskLinkLayer.setLineColor(Color.valueOf(item.color)) -// } + for (item in list2) { mapController.lineHandler.omdbTaskLinkLayer.addLineList(item.hadLinkDvoList) } } -// realm.close() + mapController.lineHandler.omdbTaskLinkLayer.removeAll() + for (item in list) { + mapController.lineHandler.omdbTaskLinkLayer.addLineList(item.hadLinkDvoList) + } } + + } private fun initLocation() { @@ -206,8 +214,27 @@ class MainViewModel @Inject constructor( } catch (e: Exception) { } - traceDataBase.niLocationDao.insert(location) - mapController.mMapView.vtmMap.updateMap(true) + val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) + location.taskId = id.toString() + //增加间距判断 + if (lastNiLocaion != null) { + val disance = GeometryTools.distanceToDouble( + GeoPoint(location.latitude, location.longitude), GeoPoint( + lastNiLocaion!!.latitude, lastNiLocaion!!.longitude + ) + ) + //相距差距大于0.5米以上进行存储 + if (disance > 0.5) { + traceDataBase.niLocationDao.insert(location) + mapController.markerHandle.addNiLocationMarkerItem(location) + } + } else { + traceDataBase.niLocationDao.insert(location) + mapController.markerHandle.addNiLocationMarkerItem(location) + } + + lastNiLocaion = location + //mapController.mMapView.vtmMap.updateMap(true) } } //用于定位点捕捉道路 @@ -217,6 +244,18 @@ class MainViewModel @Inject constructor( } } + //加载轨迹数据 + viewModelScope.launch(Dispatchers.IO) { + val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) + val list: List? = TraceDataBase.getDatabase( + mapController.mMapView.context, + Constant.USER_DATA_PATH + ).niLocationDao.findToTaskIdAll(id.toString()) + list!!.forEach { + mapController.markerHandle.addNiLocationMarkerItem(it) + } + } + //显示轨迹图层 mapController.layerManagerHandler.showNiLocationLayer() @@ -225,102 +264,104 @@ class MainViewModel @Inject constructor( /** * 捕获道路和面板 */ + @RequiresApi(Build.VERSION_CODES.N) private suspend fun captureLink(point: GeoPoint) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - val linkList = realmOperateHelper.queryLink( - point = point, - ) - var hisRoadName = false - if (linkList.isNotEmpty()) { - //看板数据 - val signList = mutableListOf() - val topSignList = mutableListOf() - mapController.lineHandler.linksLayer.clear() - val link = linkList[0] + val linkList = realmOperateHelper.queryLink( + point = point, + ) + var hisRoadName = false + if (linkList.isNotEmpty()) { + //看板数据 + val signList = mutableListOf() + val topSignList = mutableListOf() + mapController.lineHandler.linksLayer.clear() - val linkId = link.properties[RenderEntity.Companion.LinkTable.linkPid] + val link = linkList[0] - if (linkIdCache != linkId) { + val linkId = link.properties[RenderEntity.Companion.LinkTable.linkPid] - mapController.lineHandler.showLine(link.geometry) - linkId?.let { - var elementList = realmOperateHelper.queryLinkByLinkPid(it) - for (element in elementList) { + if (linkIdCache != linkId) { - if (element.code == 2011) { - hisRoadName = true - liveDataRoadName.postValue(element) - continue - } - - val distance = GeometryTools.distanceToDouble( - point, GeometryTools.createGeoPoint(element.geometry) - ) - - val signBean = SignBean( - iconId = SignUtil.getSignIcon(element), - iconText = SignUtil.getSignIconText(element), - distance = distance.toInt(), - linkId = linkId, - name = SignUtil.getSignNameText(element), - bottomRightText = SignUtil.getSignBottomRightText(element), - renderEntity = element, - isMoreInfo = SignUtil.isMoreInfo(element), - index = SignUtil.getRoadInfoIndex(element) - ) - Log.e("jingo", "捕捉到的数据code ${element.code}") - when (element.code) { - //车道数,种别,功能等级,线限速,道路方向 - 2041, 2008, 2002, 2019, 2010 -> topSignList.add( - signBean - ) - 4002, 4003, 4004, 4010, 4022, 4601 -> signList.add( - signBean - ) - } + mapController.lineHandler.showLine(link.geometry) + linkId?.let { + var elementList = realmOperateHelper.queryLinkByLinkPid(it) + for (element in elementList) { + if (element.code == 2011) { + hisRoadName = true + liveDataRoadName.postValue(element) + continue } - val realm = Realm.getDefaultInstance() - val entity = realm.where(RenderEntity::class.java) - .equalTo("table", "OMDB_RESTRICTION").and().equalTo( - "properties['linkIn']", it + val distance = GeometryTools.distanceToDouble( + point, GeometryTools.createGeoPoint(element.geometry) + ) + + val signBean = SignBean( + iconId = SignUtil.getSignIcon(element), + iconText = SignUtil.getSignIconText(element), + distance = distance.toInt(), + linkId = linkId, + name = SignUtil.getSignNameText(element), + bottomRightText = SignUtil.getSignBottomRightText(element), + renderEntity = element, + isMoreInfo = SignUtil.isMoreInfo(element), + index = SignUtil.getRoadInfoIndex(element) + ) + Log.e("jingo", "捕捉到的数据code ${element.code}") + when (element.code) { + //车道数,种别,功能等级,线限速,道路方向 + 2041, 2008, 2002, 2019, 2010 -> topSignList.add( + signBean + ) + + 4002, 4003, 4004, 4010, 4022, 4601 -> signList.add( + signBean + ) + } + + } + + val realm = Realm.getDefaultInstance() + val entity = realm.where(RenderEntity::class.java) + .equalTo("table", "OMDB_RESTRICTION").and().equalTo( + "properties['linkIn']", it + ).findFirst() + if (entity != null) { + val outLink = entity.properties["linkOut"] + val linkOutEntity = realm.where(RenderEntity::class.java) + .equalTo("table", "OMDB_RD_LINK").and().equalTo( + "properties['${RenderEntity.Companion.LinkTable.linkPid}']", + outLink ).findFirst() - if (entity != null) { - val outLink = entity.properties["linkOut"] - val linkOutEntity = realm.where(RenderEntity::class.java) - .equalTo("table", "OMDB_RD_LINK").and().equalTo( - "properties['${RenderEntity.Companion.LinkTable.linkPid}']", - outLink - ).findFirst() - if (linkOutEntity != null) { - mapController.lineHandler.linksLayer.addLine( - linkOutEntity.geometry, 0x7DFF0000 - ) - } + if (linkOutEntity != null) { + mapController.lineHandler.linksLayer.addLine( + linkOutEntity.geometry, 0x7DFF0000 + ) } } - - liveDataTopSignList.postValue(topSignList.distinctBy { it.name } - .sortedBy { it.index }) - - liveDataSignList.postValue(signList.sortedBy { it.distance }) - val speechText = SignUtil.getRoadSpeechText(topSignList) - withContext(Dispatchers.Main) { - speakMode?.speakText(speechText) - } - linkIdCache = linkId ?: "" } - } else { - mapController.lineHandler.removeLine() - linkIdCache = "" - } - //如果没有捕捉到道路名 - if (!hisRoadName) { - liveDataRoadName.postValue(null) + + liveDataTopSignList.postValue(topSignList.distinctBy { it.name } + .sortedBy { it.index }) + + liveDataSignList.postValue(signList.sortedBy { it.distance }) + val speechText = SignUtil.getRoadSpeechText(topSignList) + withContext(Dispatchers.Main) { + speakMode?.speakText(speechText) + } + linkIdCache = linkId ?: "" } + } else { + mapController.lineHandler.removeLine() + linkIdCache = "" } + //如果没有捕捉到道路名 + if (!hisRoadName) { + liveDataRoadName.postValue(null) + } + } /** diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt index 35a66f37..64df50fb 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt @@ -10,7 +10,9 @@ import androidx.annotation.RequiresApi import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope +import com.navinfo.collect.library.data.dao.impl.TraceDataBase import com.navinfo.collect.library.data.entity.HadLinkDvoBean +import com.navinfo.collect.library.data.entity.NiLocation import com.navinfo.collect.library.data.entity.QsRecordBean import com.navinfo.collect.library.data.entity.TaskBean import com.navinfo.collect.library.map.NIMapController @@ -164,6 +166,8 @@ class TaskViewModel @Inject constructor( liveDataTaskLinks.value = taskBean.hadLinkDvoList mapController.lineHandler.omdbTaskLinkLayer.removeAll() + mapController.markerHandle.clearNiLocationLayer() + if (taskBean.hadLinkDvoList.isNotEmpty()) { mapController.lineHandler.omdbTaskLinkLayer.addLineList(taskBean.hadLinkDvoList) var maxX = 0.0 @@ -195,6 +199,17 @@ class TaskViewModel @Inject constructor( ) } } + + //重新加载轨迹 + viewModelScope.launch(Dispatchers.IO) { + val list: List? = TraceDataBase.getDatabase( + mapController.mMapView.context, + Constant.USER_DATA_PATH + ).niLocationDao.findToTaskIdAll(taskBean.id.toString()) + list!!.forEach { + mapController.markerHandle.addNiLocationMarkerItem(it) + } + } } /** diff --git a/collect-library/src/main/java/com/navinfo/collect/library/data/dao/impl/INiLocationDao.java b/collect-library/src/main/java/com/navinfo/collect/library/data/dao/impl/INiLocationDao.java index 89c6c185..9d362617 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/data/dao/impl/INiLocationDao.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/data/dao/impl/INiLocationDao.java @@ -46,4 +46,7 @@ public interface INiLocationDao { @Query("SELECT * FROM niLocation") List findAll(); + + @Query("SELECT * FROM niLocation where taskId =:taskId") + List findToTaskIdAll(String taskId); } diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt index 63aca800..45eff38c 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt @@ -1,6 +1,7 @@ package com.navinfo.collect.library.map.handler import android.content.Context +import android.content.SharedPreferences import android.graphics.BitmapFactory import android.graphics.Canvas import android.graphics.Color @@ -8,6 +9,7 @@ import androidx.appcompat.app.AppCompatActivity import androidx.core.content.res.ResourcesCompat import androidx.lifecycle.lifecycleScope import com.navinfo.collect.library.R +import com.navinfo.collect.library.data.dao.impl.TraceDataBase import com.navinfo.collect.library.data.entity.NiLocation import com.navinfo.collect.library.data.entity.NoteBean import com.navinfo.collect.library.data.entity.QsRecordBean @@ -235,7 +237,6 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : } } - /** * 增加或更新marker */ @@ -449,17 +450,17 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : nearest: Int ): Boolean { itemListener?.let { - val idList = mutableListOf() + val idList = mutableListOf() if (list.size == 0) { } else { for (i in list) { val markerInterface: MarkerInterface = - itemizedLayer.itemList[i] + niLocationItemizedLayer.itemList[i] if (markerInterface is MarkerItem) { - idList.add(markerInterface.title) + idList.add(markerInterface.uid as NiLocation) } } - it.onQsRecordList(idList.distinct().toMutableList()) + it.onNiLocationList(idList.distinct().toMutableList()) } } return true @@ -473,11 +474,6 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : } }) addLayer(niLocationItemizedLayer, NIMapView.LAYER_GROUPS.OPERATE_MARKER) - mContext.lifecycleScope.launch(Dispatchers.IO) { - var list = mutableListOf() - - } - } /** @@ -544,8 +540,8 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : /** * 添加质检数据marker */ - private suspend fun addNiLocationMarkerItem(niLocation: NiLocation) { - val item = MarkerItem(niLocation.id, "", GeoPoint(niLocation.latitude, niLocation.longitude)) + public suspend fun addNiLocationMarkerItem(niLocation: NiLocation) { + val item = MarkerItem(niLocation, niLocation.id, "", GeoPoint(niLocation.latitude, niLocation.longitude)) var itemizedLayer: ItemizedLayer? = null val direction: Double = niLocation.direction //角度 @@ -800,21 +796,11 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : } /** - * 添加质检数据marker + * 移除轨迹图层 */ - private suspend fun createTrackMarkerItem(item: NiLocation) { - for (item in itemizedLayer.itemList) { - if (item is MarkerItem) { - if (item.title == item.uid) { - itemizedLayer.itemList.remove(item) - break - } - } - } - //createMarkerItem(data) - withContext(Dispatchers.Main) { - mMapView.updateMap(true) - } + fun clearNiLocationLayer() { + niLocationItemizedLayer.removeAllItems() + niLocationItemizedLayer.update() } } @@ -822,4 +808,5 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : interface OnQsRecordItemClickListener { fun onQsRecordList(list: MutableList) fun onNoteList(list: MutableList) + fun onNiLocationList(list: MutableList) } From c8ac5c9582948ccac21e7a8ff7992fe4d32fb4e2 Mon Sep 17 00:00:00 2001 From: qiji4215 Date: Fri, 14 Jul 2023 14:20:34 +0800 Subject: [PATCH 12/40] =?UTF-8?q?1=E3=80=81=E9=80=82=E9=85=8D=E4=B8=8A?= =?UTF-8?q?=E4=BC=A0=E6=8E=A5=E5=8F=A32=E3=80=81=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E8=9E=8D=E5=90=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/navinfo/omqs/bean/EvaluationInfo.kt | 4 +- .../omqs/http/taskupload/TaskUploadScope.kt | 107 ++++---- .../omqs/ui/activity/map/MainActivity.kt | 8 +- .../omqs/ui/activity/map/MainViewModel.kt | 51 ++-- .../ui/fragment/tasklist/TaskViewModel.kt | 6 +- .../com/navinfo/omqs/ui/widget/SignUtil.kt | 8 +- .../library/map/handler/MarkHandler.kt | 236 +++++++----------- .../library/map/layers/MyItemizedLayer.java | 11 +- 8 files changed, 193 insertions(+), 238 deletions(-) diff --git a/app/src/main/java/com/navinfo/omqs/bean/EvaluationInfo.kt b/app/src/main/java/com/navinfo/omqs/bean/EvaluationInfo.kt index b1418d1d..d4e18612 100644 --- a/app/src/main/java/com/navinfo/omqs/bean/EvaluationInfo.kt +++ b/app/src/main/java/com/navinfo/omqs/bean/EvaluationInfo.kt @@ -54,7 +54,7 @@ data class EvaluationInfo( val roadClassfcation: String = "",//道路种别 @SerializedName("roadFunctionGrade") - val roadFunctionGrade: String = "",//道路功能等级 + val roadFunctionGrade: Int = 3,//道路功能等级 @SerializedName("noEvaluationreason") val noEvaluationreason: String = "",//未测评原因 @@ -63,7 +63,7 @@ data class EvaluationInfo( val linkLength: Double = 0.0,//link长度(m 保留3位小数) @SerializedName("dataLevel") - val dataLevel: String = "",//数据级别 + val dataLevel: Int = 3,//数据级别 @SerializedName("linstringLength") val linstringLength: Double = 0.0,//错误要素长度(m) diff --git a/app/src/main/java/com/navinfo/omqs/http/taskupload/TaskUploadScope.kt b/app/src/main/java/com/navinfo/omqs/http/taskupload/TaskUploadScope.kt index dd1189c2..fbbac726 100644 --- a/app/src/main/java/com/navinfo/omqs/http/taskupload/TaskUploadScope.kt +++ b/app/src/main/java/com/navinfo/omqs/http/taskupload/TaskUploadScope.kt @@ -123,54 +123,13 @@ class TaskUploadScope( } taskBean.hadLinkDvoList.forEach { hadLinkDvoBean -> - val objects = realm.where(QsRecordBean::class.java) - .equalTo("linkId", /*"84207223282277331"*/hadLinkDvoBean.linkPid).findAll() - if (objects != null&&objects.size>0) { - val copyList = realm.copyFromRealm(objects) - copyList.forEach { - var problemType = 0 - if(it.problemType=="错误"){ - problemType = 0 - }else if(it.problemType=="多余"){ - problemType = 1 - }else if(it.problemType=="遗漏"){ - problemType = 2 - } - var evaluationWay = 2 - val evaluationInfo = EvaluationInfo( - evaluationTaskId = taskBean.id.toString(), - linkPid = hadLinkDvoBean.linkPid,//"84207223282277331" - linkStatus = 1, - markId = hadLinkDvoBean.mesh,//"20065597" - trackPhotoNumber = "", - markGeometry = it.geometry, - featureName = it.classCode, - problemType = problemType, - problemPhenomenon = it.phenomenon, - problemDesc = it.description, - problemLink = it.problemLink, - preliminaryAnalysis = it.cause, - evaluatorName = it.checkUserId, - evaluationDate = it.checkTime, - evaluationWay = evaluationWay, - roadClassfcation = "", - roadFunctionGrade = "", - noEvaluationreason = "", - linkLength = 0.0, - dataLevel = "", - linstringLength = 0.0, - ) - bodyList.add(evaluationInfo) - } - }else{ - val linkStatus = 1 - //存在原因标记未测评 - if(hadLinkDvoBean.reason.isNotEmpty()){ - val linkStatus = 0 - }else{ - val linkStatus = 1 - } + val linkStatus = 1 + //存在原因标记未测评 + if(hadLinkDvoBean.reason.isNotEmpty()){ + //未测评 + val linkStatus = 0 + val evaluationInfo = EvaluationInfo( evaluationTaskId = taskBean.id.toString(), linkPid = hadLinkDvoBean.linkPid,//"84207223282277331" @@ -188,14 +147,64 @@ class TaskUploadScope( evaluationDate = "", evaluationWay = 2, roadClassfcation = "", - roadFunctionGrade = "", + roadFunctionGrade = 0, noEvaluationreason = hadLinkDvoBean.reason, linkLength = 0.0, - dataLevel = "", + dataLevel = 0, linstringLength = 0.0, ) + bodyList.add(evaluationInfo) + + }else{ + + val linkStatus = hadLinkDvoBean.linkStatus + + var s: String = "%.3f".format(hadLinkDvoBean.linkLength)//保留一位小数(且支持四舍五入) + + val objects = realm.where(QsRecordBean::class.java).equalTo("linkId", /*"84207223282277331"*/hadLinkDvoBean.linkPid).findAll() + + if (objects != null&&objects.size>0) { + val copyList = realm.copyFromRealm(objects) + copyList.forEach { + var problemType = 0 + if(it.problemType=="错误"){ + problemType = 0 + }else if(it.problemType=="多余"){ + problemType = 1 + }else if(it.problemType=="遗漏"){ + problemType = 2 + } + var evaluationWay = 2 + val evaluationInfo = EvaluationInfo( + evaluationTaskId = taskBean.id.toString(), + linkPid = hadLinkDvoBean.linkPid,//"84207223282277331" + linkStatus = linkStatus, + markId = hadLinkDvoBean.mesh,//"20065597" + trackPhotoNumber = "", + markGeometry = it.geometry, + featureName = it.classCode, + problemType = problemType, + problemPhenomenon = it.phenomenon, + problemDesc = it.description, + problemLink = it.problemLink, + preliminaryAnalysis = it.cause, + evaluatorName = it.checkUserId, + evaluationDate = it.checkTime, + evaluationWay = evaluationWay, + roadClassfcation = "", + roadFunctionGrade = 3, + noEvaluationreason = "", + linkLength = s.toDouble(), + dataLevel = 3, + linstringLength = 0.0, + ) + + bodyList.add(evaluationInfo) + } + } } + } if(bodyList.size>0){ 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 c5151558..b84b5b45 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 @@ -12,6 +12,7 @@ import android.widget.EditText import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels +import androidx.annotation.RequiresApi import androidx.databinding.DataBindingUtil import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope @@ -145,6 +146,7 @@ class MainActivity : BaseActivity() { } + @RequiresApi(Build.VERSION_CODES.M) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -370,6 +372,7 @@ class MainActivity : BaseActivity() { mapController.mMapView.onPause() } + @RequiresApi(Build.VERSION_CODES.M) override fun onDestroy() { super.onDestroy() viewModel.speakMode?.shutdown() @@ -400,6 +403,7 @@ class MainActivity : BaseActivity() { /** * 打开相机预览 */ + @RequiresApi(Build.VERSION_CODES.M) fun openCamera() { //显示轨迹图层 viewModel.onClickCameraButton(this) @@ -408,6 +412,7 @@ class MainActivity : BaseActivity() { /** * 开关菜单 */ + @RequiresApi(Build.VERSION_CODES.M) fun onClickMenu() { //显示菜单图层 viewModel.onClickMenu() @@ -543,6 +548,7 @@ class MainActivity : BaseActivity() { .animateTo(GeoPoint( mapController.mMapView.vtmMap.mapPosition.geoPoint.latitude,mapController.mMapView.vtmMap.mapPosition.geoPoint.longitude)) } + @RequiresApi(Build.VERSION_CODES.M) private fun voiceOnTouchStart() { viewModel.startSoundMetter(this, binding.mainActivityVoice) } @@ -625,6 +631,7 @@ class MainActivity : BaseActivity() { /** * 打开道路名称属性看板,选择的道路在viewmodel里记录,不用 */ + @RequiresApi(Build.VERSION_CODES.M) fun openRoadNameFragment() { if (viewModel.liveDataRoadName.value != null) { viewModel.showSignMoreInfo(viewModel.liveDataRoadName.value!!) @@ -643,7 +650,6 @@ class MainActivity : BaseActivity() { */ fun onClickTaskLink() { rightController.navigate(R.id.TaskLinkFragment) - } /** 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 3237ee9d..26386fb9 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 @@ -151,7 +151,9 @@ class MainViewModel @Inject constructor( liveDataNILocationList.value = list } }) + initLocation() + //处理地图点击操作 viewModelScope.launch(Dispatchers.Default) { mapController.onMapClickFlow.collectLatest { @@ -172,33 +174,15 @@ class MainViewModel @Inject constructor( /** * 初始化选中的任务高亮高亮 */ - @RequiresApi(Build.VERSION_CODES.M) - private fun initTaskData() { - viewModelScope.launch { - val realm = Realm.getDefaultInstance() - val results = realm.where(TaskBean::class.java).findAll() - val list = realm.copyFromRealm(results) - results.addChangeListener { changes -> - val list2 = realm.copyFromRealm(changes) - mapController.lineHandler.omdbTaskLinkLayer.removeAll() - for (item in list2) { - mapController.lineHandler.omdbTaskLinkLayer.addLineList(item.hadLinkDvoList) - } - } - mapController.lineHandler.omdbTaskLinkLayer.removeAll() - for (item in list) { - mapController.lineHandler.omdbTaskLinkLayer.addLineList(item.hadLinkDvoList) - } private suspend fun initTaskData() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) - val realm = Realm.getDefaultInstance() - val res = realm.where(TaskBean::class.java).equalTo("id", id).findFirst() - if (res != null) { - val taskBean = realm.copyFromRealm(res) - mapController.lineHandler.omdbTaskLinkLayer.addLineList(taskBean.hadLinkDvoList) - } + val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) + val realm = Realm.getDefaultInstance() + val res = realm.where(TaskBean::class.java).equalTo("id", id).findFirst() + if (res != null) { + val taskBean = realm.copyFromRealm(res) + mapController.lineHandler.omdbTaskLinkLayer.addLineList(taskBean.hadLinkDvoList) } + } /** @@ -237,6 +221,7 @@ class MainViewModel @Inject constructor( /** * 初始化定位信息 */ + @RequiresApi(Build.VERSION_CODES.N) private fun initLocation() { //用于定位点存储到数据库 viewModelScope.launch(Dispatchers.Default) { @@ -290,7 +275,12 @@ class MainViewModel @Inject constructor( //用于定位点捕捉道路 viewModelScope.launch(Dispatchers.Default) { mapController.locationLayerHandler.niLocationFlow.collectLatest { location -> - if (!isSelectRoad()) captureLink(GeoPoint(location.latitude, location.longitude)) + if (!isSelectRoad()) captureLink( + GeoPoint( + location.latitude, + location.longitude + ) + ) } } @@ -459,9 +449,13 @@ class MainViewModel @Inject constructor( mCameraDialog!!.stopVideo() try { if (!mCameraDialog!!.getmShareUtil().connectstate) { - mCameraDialog!!.updateCameraResources(1, mCameraDialog!!.getmDeviceNum()) + mCameraDialog!!.updateCameraResources( + 1, + mCameraDialog!!.getmDeviceNum() + ) } - TakePhotoManager.getInstance().getCameraVedioClent(mCameraDialog!!.getmDeviceNum()) + TakePhotoManager.getInstance() + .getCameraVedioClent(mCameraDialog!!.getmDeviceNum()) .StopSearch() } catch (e: Exception) { } @@ -598,4 +592,5 @@ class MainViewModel @Inject constructor( liveDataSignMoreInfo.value = data } + } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt index e0d9876e..83705224 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt @@ -1,5 +1,6 @@ package com.navinfo.omqs.ui.fragment.tasklist +import android.app.Dialog import android.content.Context import android.content.SharedPreferences import android.content.SharedPreferences.OnSharedPreferenceChangeListener @@ -33,7 +34,7 @@ class TaskViewModel @Inject constructor( private val networkService: NetworkService, private val mapController: NIMapController, private val sharedPreferences: SharedPreferences -) : ViewModel() { +) : ViewModel(), OnSharedPreferenceChangeListener { /** * 用来更新任务列表 @@ -57,9 +58,6 @@ class TaskViewModel @Inject constructor( */ val liveDataCloseTask = MutableLiveData() - private val colors = - arrayOf(Color.RED, Color.YELLOW, Color.BLUE, Color.MAGENTA, Color.GREEN, Color.CYAN) - /** * 当前选中的任务 */ diff --git a/app/src/main/java/com/navinfo/omqs/ui/widget/SignUtil.kt b/app/src/main/java/com/navinfo/omqs/ui/widget/SignUtil.kt index fcfe77a1..3be3da98 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/widget/SignUtil.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/widget/SignUtil.kt @@ -45,7 +45,7 @@ class SignUtil { *获取道路功能等级文字 */ private fun getLinkFunctionClassText(data: RenderEntity): String { - return "等级${data.properties["functionClass"]}" + return "FC${data.properties["functionClass"]}" } /** @@ -55,9 +55,9 @@ class SignUtil { val direct = data.properties["direct"] when (direct?.toInt()) { 0 -> return "不应用" - 1 -> return "双方向" - 2 -> return "顺方向" - 3 -> return "逆方向" + 1 -> return "双" + 2 -> return "顺" + 3 -> return "逆" } return "" } diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt index a5637f28..26c97517 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt @@ -53,9 +53,6 @@ import java.util.Locale class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler(context, mapView) { - // //默认marker图层 - private var mDefaultMarkerLayer: ItemizedLayer - /** * 默认文字颜色 */ @@ -111,12 +108,6 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : layer } - private lateinit var niLocationItemizedLayer: MyItemizedLayer - - private lateinit var markerRendererFactory: MarkerRendererFactory - private val resId = R.mipmap.map_icon_report - private val noteResId = R.drawable.icon_note_marker - private var itemListener: OnQsRecordItemClickListener? = null private var niLocationBitmap: Bitmap? = null private var niLocationBitmap1: Bitmap? = null private var niLocationBitmap2: Bitmap? = null @@ -163,6 +154,61 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : layer } + /** + * 评测数据marker 图层 + */ + private val niLocationItemizedLayer: MyItemizedLayer by lazy { + + niLocationBitmap = + AndroidBitmap(BitmapFactory.decodeResource(context.resources, R.mipmap.icon_gps)) + niLocationBitmap1 = + AndroidBitmap(BitmapFactory.decodeResource(context.resources, R.mipmap.icon_gps_1)) + niLocationBitmap2 = + AndroidBitmap(BitmapFactory.decodeResource(context.resources, R.mipmap.icon_nilocation)) + niLocationBitmap3 = AndroidBitmap( + BitmapFactory.decodeResource( + context.resources, + R.mipmap.icon_nilocation_1 + ) + ) + + val layer = MyItemizedLayer( + mMapView.vtmMap, + mutableListOf(), + markerRendererFactory, + object : MyItemizedLayer.OnItemGestureListener { + override fun onItemSingleTapUp( + list: MutableList, + nearest: Int + ): Boolean { + itemListener?.let { + val idList = mutableListOf() + if (list.size == 0) { + } else { + for (i in list) { + val markerInterface: MarkerInterface = + niLocationItemizedLayer.itemList[i] + if (markerInterface is MarkerItem) { + idList.add(markerInterface.uid as NiLocation) + } + } + it.onNiLocationList(idList.distinct().toMutableList()) + } + } + return true + } + + override fun onItemLongPress( + list: MutableList?, + nearest: Int + ): Boolean { + return true + } + }) + addLayer(layer, NIMapView.LAYER_GROUPS.OPERATE_MARKER) + layer + } + /** * 便签线图层 */ @@ -235,9 +281,6 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : org.oscim.backend.canvas.Color.BLUE ) ) { -// override fun getClusterBitmap(size: Int): Bitmap? { -// return super.getclusterbitmap(size) -// } } } } @@ -252,48 +295,13 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : init { - //新增marker图标样式 - val mDefaultBitmap = - AndroidBitmap(BitmapFactory.decodeResource(context.resources, R.mipmap.marker)) - val markerSymbol = MarkerSymbol( - mDefaultBitmap, - MarkerSymbol.HotspotPlace.BOTTOM_CENTER) - - niLocationBitmap = AndroidBitmap(BitmapFactory.decodeResource(context.resources, R.mipmap.icon_gps)) - niLocationBitmap1 = AndroidBitmap(BitmapFactory.decodeResource(context.resources, R.mipmap.icon_gps_1)) - niLocationBitmap2 = AndroidBitmap(BitmapFactory.decodeResource(context.resources, R.mipmap.icon_nilocation)) - niLocationBitmap3 = AndroidBitmap(BitmapFactory.decodeResource(context.resources, R.mipmap.icon_nilocation_1)) - - //新增marker图层 - mDefaultMarkerLayer = ItemizedLayer( - mapView.vtmMap, - ArrayList(), - markerSymbol, - object : OnItemGestureListener { - override fun onItemSingleTapUp(index: Int, item: MarkerInterface?): Boolean { - return false - } - - override fun onItemLongPress(index: Int, item: MarkerInterface?): Boolean { - return false - } - - } - ) - - //初始化之间数据图层 - initQsRecordDataLayer() - addLayer(mDefaultMarkerLayer, NIMapView.LAYER_GROUPS.OPERATE_MARKER); // 设置矢量图层均在12级以上才显示 mMapView.vtmMap.events.bind(Map.UpdateListener { e, mapPosition -> if (e == Map.SCALE_EVENT) { qsRecordItemizedLayer.isEnabled = mapPosition.getZoomLevel() >= 12 + niLocationItemizedLayer.isEnabled = mapPosition.getZoomLevel() >= 12 } }) - initNoteData() - //初始化加载轨迹 - initNiLocationDataLayer() - mMapView.updateMap() } /** @@ -461,46 +469,6 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : // // } - /** - * 初始化定位图层 - */ - private fun initNiLocationDataLayer() { - niLocationItemizedLayer = - MyItemizedLayer( - mMapView.vtmMap, - mutableListOf(), - markerRendererFactory, - object : MyItemizedLayer.OnItemGestureListener { - override fun onItemSingleTapUp( - list: MutableList, - nearest: Int - ): Boolean { - itemListener?.let { - val idList = mutableListOf() - if (list.size == 0) { - } else { - for (i in list) { - val markerInterface: MarkerInterface = - niLocationItemizedLayer.itemList[i] - if (markerInterface is MarkerItem) { - idList.add(markerInterface.uid as NiLocation) - } - } - it.onNiLocationList(idList.distinct().toMutableList()) - } - } - return true - } - - override fun onItemLongPress( - list: MutableList?, - nearest: Int - ): Boolean { - return true - } - }) - addLayer(niLocationItemizedLayer, NIMapView.LAYER_GROUPS.OPERATE_MARKER) - } /** * 添加质检数据marker @@ -545,54 +513,18 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : when (geometry.geometryType.uppercase(Locale.getDefault())) { "POINT" -> geoPoint = GeoPoint(geometry.coordinate.y, geometry.coordinate.x) -// "LINESTRING" -> { -// val lineString = geometry as LineString -// if (lineString != null && lineString.coordinates.size > 0) { -// geoPoint = GeoPoint( -// lineString.coordinates[0].y, -// lineString.coordinates[0].x -// ) -// } -// val drawableLine: Drawable = -// convertGeometry2Drawable(geometry, lineStyle) -// if (drawableLine != null) { -// dataVectorLayer.add(drawableLine) -// } -// } -// "POLYGON" -> { -// val polygon = geometry as Polygon -// if (polygon != null && polygon.coordinates.size > 0) { -// geoPoint = GeoPoint( -// polygon.coordinates[0].y, -// polygon.coordinates[0].x -// ) -// } -// val drawablePolygon: Drawable = -// convertGeometry2Drawable(geometry, polygonStyle) -// if (drawablePolygon != null) { -// dataVectorLayer.add(drawablePolygon) -// } -// } - org.oscim.core.GeoPoint(geometry.coordinate.y, geometry.coordinate.x) } } if (geoPoint != null) { + val geoMarkerItem: MarkerItem -// if (item.getType() === 1) { - geoMarkerItem = ClusterMarkerItem( - 1, item.id, item.description, geoPoint - ) -// } else { -// geoMarkerItem = MarkerItem( -// ePointTemp.getType(), -// ePointTemp.getId(), -// ePointTemp.getStyleText(), -// geoPoint -// ) -// } - val markerSymbol = - MarkerSymbol(bitmap, MarkerSymbol.HotspotPlace.CENTER) + + geoMarkerItem = ClusterMarkerItem(1, item.id, item.description, geoPoint) + + val markerSymbol = MarkerSymbol(bitmap, MarkerSymbol.HotspotPlace.CENTER) + geoMarkerItem.marker = markerSymbol + qsRecordItemizedLayer.itemList.add(geoMarkerItem) } } @@ -604,40 +536,51 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : * 添加质检数据marker */ public suspend fun addNiLocationMarkerItem(niLocation: NiLocation) { - val item = MarkerItem(niLocation, niLocation.id, "", GeoPoint(niLocation.latitude, niLocation.longitude)) + var itemizedLayer: ItemizedLayer? = null + val direction: Double = niLocation.direction + + val geoMarkerItem: MarkerItem = ClusterMarkerItem( + niLocation, + niLocation.id, + niLocation.time, + GeoPoint(niLocation.latitude, niLocation.longitude) + ) + //角度 - when(niLocation.media){ - 0->{ + when (niLocation.media) { + 0 -> { //角度不为0时需要预先设置marker样式并进行角度设置,否则使用图层默认的sym即可 //角度不为0时需要预先设置marker样式并进行角度设置,否则使用图层默认的sym即可 if (direction != 0.0) { val symbolGpsTemp = MarkerSymbol(niLocationBitmap, MarkerSymbol.HotspotPlace.CENTER, false) - item.marker = symbolGpsTemp - item.setRotation(direction.toFloat()) - }else{ + geoMarkerItem.marker = symbolGpsTemp + geoMarkerItem.setRotation(direction.toFloat()) + } else { val symbolGpsTemp = MarkerSymbol(niLocationBitmap2, MarkerSymbol.HotspotPlace.CENTER, false) - item.marker = symbolGpsTemp + geoMarkerItem.marker = symbolGpsTemp } - niLocationItemizedLayer.addItem(item) + niLocationItemizedLayer.addItem(geoMarkerItem) itemizedLayer = niLocationItemizedLayer } - 1->{ + + 1 -> { //角度不为0时需要预先设置marker样式并进行角度设置,否则使用图层默认的sym即可 //角度不为0时需要预先设置marker样式并进行角度设置,否则使用图层默认的sym即可 if (direction != 0.0) { - val symbolLidarTemp = MarkerSymbol(niLocationBitmap1, MarkerSymbol.HotspotPlace.CENTER, false) - item.marker = symbolLidarTemp - item.setRotation(direction.toFloat()) - }else{ + val symbolLidarTemp = + MarkerSymbol(niLocationBitmap1, MarkerSymbol.HotspotPlace.CENTER, false) + geoMarkerItem.marker = symbolLidarTemp + geoMarkerItem.setRotation(direction.toFloat()) + } else { val symbolGpsTemp = MarkerSymbol(niLocationBitmap3, MarkerSymbol.HotspotPlace.CENTER, false) - item.marker = symbolGpsTemp + geoMarkerItem.marker = symbolGpsTemp } - niLocationItemizedLayer.addItem(item) + niLocationItemizedLayer.addItem(geoMarkerItem) itemizedLayer = niLocationItemizedLayer } @@ -871,4 +814,5 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : interface OnQsRecordItemClickListener { fun onQsRecordList(list: MutableList) fun onNoteList(list: MutableList) + fun onNiLocationList(list: MutableList) } diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/layers/MyItemizedLayer.java b/collect-library/src/main/java/com/navinfo/collect/library/map/layers/MyItemizedLayer.java index fb9b4c47..cc13685b 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/layers/MyItemizedLayer.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/layers/MyItemizedLayer.java @@ -115,10 +115,13 @@ public class MyItemizedLayer extends ItemizedLayer { // it = this.mMarkerRenderer.mDefaultMarker; } - if (it.isInside(dx, dy)) {// && this.mTmpPoint.y > insideY) { -// insideY = this.mTmpPoint.y; - inside = i; - list.add(i); + try{ + if (it.isInside(dx, dy)) { + inside = i; + list.add(i); + } + }catch (Exception e){ + } if (inside < 0) { From 4fa9df8e3ca137b5c22e004a47d4fe72bab4da57 Mon Sep 17 00:00:00 2001 From: qiji4215 Date: Fri, 14 Jul 2023 14:25:44 +0800 Subject: [PATCH 13/40] merge code --- .../com/navinfo/omqs/bean/EvaluationInfo.kt | 6 ++--- .../omqs/http/taskupload/TaskUploadScope.kt | 4 +-- .../omqs/ui/activity/map/MainViewModel.kt | 25 ++++++++++--------- 3 files changed, 18 insertions(+), 17 deletions(-) diff --git a/app/src/main/java/com/navinfo/omqs/bean/EvaluationInfo.kt b/app/src/main/java/com/navinfo/omqs/bean/EvaluationInfo.kt index d4e18612..c0c49de6 100644 --- a/app/src/main/java/com/navinfo/omqs/bean/EvaluationInfo.kt +++ b/app/src/main/java/com/navinfo/omqs/bean/EvaluationInfo.kt @@ -51,10 +51,10 @@ data class EvaluationInfo( val evaluationWay: Int = 2,//测评方式 1生产测评 2现场测评 服务字段定义为Integer,使用包装类,对应无值情况为空 @SerializedName("roadClassfcation") - val roadClassfcation: String = "",//道路种别 + val roadClassfcation: Int = 1,//道路种别 @SerializedName("roadFunctionGrade") - val roadFunctionGrade: Int = 3,//道路功能等级 + val roadFunctionGrade: Int = 1,//道路功能等级 @SerializedName("noEvaluationreason") val noEvaluationreason: String = "",//未测评原因 @@ -63,7 +63,7 @@ data class EvaluationInfo( val linkLength: Double = 0.0,//link长度(m 保留3位小数) @SerializedName("dataLevel") - val dataLevel: Int = 3,//数据级别 + val dataLevel: Int = 1,//数据级别 @SerializedName("linstringLength") val linstringLength: Double = 0.0,//错误要素长度(m) diff --git a/app/src/main/java/com/navinfo/omqs/http/taskupload/TaskUploadScope.kt b/app/src/main/java/com/navinfo/omqs/http/taskupload/TaskUploadScope.kt index fbbac726..2da98af0 100644 --- a/app/src/main/java/com/navinfo/omqs/http/taskupload/TaskUploadScope.kt +++ b/app/src/main/java/com/navinfo/omqs/http/taskupload/TaskUploadScope.kt @@ -146,7 +146,7 @@ class TaskUploadScope( evaluatorName = "", evaluationDate = "", evaluationWay = 2, - roadClassfcation = "", + roadClassfcation = 1, roadFunctionGrade = 0, noEvaluationreason = hadLinkDvoBean.reason, linkLength = 0.0, @@ -192,7 +192,7 @@ class TaskUploadScope( evaluatorName = it.checkUserId, evaluationDate = it.checkTime, evaluationWay = evaluationWay, - roadClassfcation = "", + roadClassfcation = 1, roadFunctionGrade = 3, noEvaluationreason = "", linkLength = s.toDouble(), 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 26386fb9..427a2321 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 @@ -168,6 +168,7 @@ class MainViewModel @Inject constructor( initTaskData() initQsRecordData() initNoteData() + initNILocationData() } } @@ -218,6 +219,18 @@ class MainViewModel @Inject constructor( } } + private suspend fun initNILocationData() { + //加载轨迹数据 + val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) + val list: List? = TraceDataBase.getDatabase( + mapController.mMapView.context, + Constant.USER_DATA_PATH + ).niLocationDao.findToTaskIdAll(id.toString()) + list!!.forEach { + mapController.markerHandle.addNiLocationMarkerItem(it) + } + } + /** * 初始化定位信息 */ @@ -284,18 +297,6 @@ class MainViewModel @Inject constructor( } } - //加载轨迹数据 - viewModelScope.launch(Dispatchers.IO) { - val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) - val list: List? = TraceDataBase.getDatabase( - mapController.mMapView.context, - Constant.USER_DATA_PATH - ).niLocationDao.findToTaskIdAll(id.toString()) - list!!.forEach { - mapController.markerHandle.addNiLocationMarkerItem(it) - } - } - //显示轨迹图层 mapController.layerManagerHandler.showNiLocationLayer() From 1412f7106a3a75237b6857da5272920c0b3850e6 Mon Sep 17 00:00:00 2001 From: squallzhjch Date: Fri, 14 Jul 2023 16:28:19 +0800 Subject: [PATCH 14/40] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=AF=84=E6=B5=8Blink?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../omqs/ui/activity/map/MainViewModel.kt | 29 +- .../EvaluationResultViewModel.kt | 4 +- .../fragment/evaluationresult/LeftAdapter.kt | 4 - .../evaluationresult/MiddleAdapter.kt | 5 +- .../evaluationresult/PhenomenonFragment.kt | 10 +- .../evaluationresult/ProblemLinkFragment.kt | 12 +- .../RightGroupHeaderDecoration.kt | 5 +- .../omqs/ui/fragment/note/CanvasFragment.kt | 4 +- .../ui/fragment/tasklink/TaskLinkFragment.kt | 24 +- .../tasklink/TaskLinkMiddleAdapter.kt | 7 +- .../ui/fragment/tasklink/TaskLinkViewModel.kt | 73 +-- .../ui/fragment/tasklist/TaskListFragment.kt | 7 +- .../ui/fragment/tasklist/TaskViewModel.kt | 21 +- .../omqs/ui/widget/TextProgressButtonBar.kt | 44 +- .../main/res/layout/fragment_task_link.xml | 13 +- .../library/data/entity/HadLinkDvoBean.kt | 11 +- .../library/data/entity/LinkInfoBean.kt | 29 ++ .../collect/library/map/NIMapController.kt | 8 +- .../library/map/handler/LineHandler.kt | 454 ++++++------------ .../map/handler/MeasureLayerHandler.kt | 83 +++- .../library/map/layers/OmdbTaskLinkLayer.kt | 4 +- .../main/res/raw/icon_task_link_marker.png | Bin 0 -> 4735 bytes 22 files changed, 364 insertions(+), 487 deletions(-) create mode 100644 collect-library/src/main/java/com/navinfo/collect/library/data/entity/LinkInfoBean.kt create mode 100644 collect-library/src/main/res/raw/icon_task_link_marker.png 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 ab19604d..4210d091 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 @@ -150,6 +150,8 @@ class MainViewModel @Inject constructor( //线选择状态 if (bSelectRoad) { captureLink(it) + } else { + captureItem(it) } } } @@ -164,14 +166,12 @@ class MainViewModel @Inject constructor( * 初始化选中的任务高亮高亮 */ private suspend fun initTaskData() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) - val realm = Realm.getDefaultInstance() - val res = realm.where(TaskBean::class.java).equalTo("id", id).findFirst() - if (res != null) { - val taskBean = realm.copyFromRealm(res) - mapController.lineHandler.omdbTaskLinkLayer.addLineList(taskBean.hadLinkDvoList) - } + val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) + val realm = Realm.getDefaultInstance() + val res = realm.where(TaskBean::class.java).equalTo("id", id).findFirst() + if (res != null) { + val taskBean = realm.copyFromRealm(res) + mapController.lineHandler.showTaskLines(taskBean.hadLinkDvoList) } } @@ -252,6 +252,13 @@ class MainViewModel @Inject constructor( } + /** + * 捕捉要素 + */ + private suspend fun captureItem(point: GeoPoint) { + + } + /** * 捕获道路和面板 */ @@ -516,10 +523,8 @@ class MainViewModel @Inject constructor( bSelectRoad = select //去掉缓存 linkIdCache = "" - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - mapController.lineHandler.removeLine() - liveDataSignList.value = mutableListOf() - } + mapController.lineHandler.removeLine() + liveDataSignList.value = mutableListOf() } /** diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt index a8b6ca0a..0532446b 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt @@ -154,9 +154,7 @@ class EvaluationResultViewModel @Inject constructor( viewModelScope.launch { val link = realmOperateHelper.queryLink(linkId) link?.let { l -> - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - mapController.lineHandler.showLine(l.geometry) - } + mapController.lineHandler.showLine(l.geometry) } } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/LeftAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/LeftAdapter.kt index 9668f889..d5a1f5d5 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/LeftAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/LeftAdapter.kt @@ -1,10 +1,7 @@ package com.navinfo.omqs.ui.fragment.evaluationresult -import android.os.Build import android.view.LayoutInflater import android.view.ViewGroup -import androidx.annotation.RequiresApi -import com.navinfo.omqs.R import com.navinfo.omqs.bean.ScProblemTypeBean import com.navinfo.omqs.databinding.TextItemSelectBinding import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter @@ -21,7 +18,6 @@ class LeftAdapter(private var itemListener: ((Int, String) -> Unit?)? = null) : return BaseViewHolder(viewBinding) } - @RequiresApi(Build.VERSION_CODES.M) override fun onBindViewHolder(holder: BaseViewHolder, position: Int) { val bd = holder.viewBinding as TextItemSelectBinding val title = data[position] diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/MiddleAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/MiddleAdapter.kt index ee0b6044..6843dce8 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/MiddleAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/MiddleAdapter.kt @@ -20,7 +20,6 @@ class MiddleAdapter(private var itemListener: ((Int, String) -> Unit?)? = null) return BaseViewHolder(viewBinding) } - @RequiresApi(Build.VERSION_CODES.M) override fun onBindViewHolder(holder: BaseViewHolder, position: Int) { val bd = holder.viewBinding as TextItemSelectBinding val title = data[position] @@ -30,10 +29,10 @@ class MiddleAdapter(private var itemListener: ((Int, String) -> Unit?)? = null) bd.itemLayout.layoutParams = layoutParams if (selectTitle == title) { bd.itemId.setBackgroundResource(R.drawable.shape_bg_blue_bg_4_radius) - bd.itemId.setTextColor(holder.viewBinding.root.context.getColor(R.color.white)) + bd.itemId.setTextColor(holder.viewBinding.root.context.resources.getColor(R.color.white)) } else { bd.itemId.setBackgroundResource(R.drawable.shape_rect_white_2dp_bg) - bd.itemId.setTextColor(holder.viewBinding.root.context.getColor(R.color.black)) + bd.itemId.setTextColor(holder.viewBinding.root.context.resources.getColor(R.color.black)) } bd.root.setOnClickListener { if (selectTitle != title) { diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/PhenomenonFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/PhenomenonFragment.kt index 0442c928..1c58c6e2 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/PhenomenonFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/PhenomenonFragment.kt @@ -73,13 +73,11 @@ class PhenomenonFragment : } binding.phenomenonRightRecyclerview.adapter = rightAdapter //右侧菜单增加组标题 - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - binding.phenomenonRightRecyclerview.addItemDecoration( - RightGroupHeaderDecoration( - requireContext() - ) + binding.phenomenonRightRecyclerview.addItemDecoration( + RightGroupHeaderDecoration( + requireContext() ) - } + ) //右侧菜单查询数据监听 viewModel.liveDataRightTypeList.observe(viewLifecycleOwner) { rightAdapter.setSelectTitle(viewModel.liveDataQsRecordBean.value!!.phenomenon) diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/ProblemLinkFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/ProblemLinkFragment.kt index 9af567f5..7355f34b 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/ProblemLinkFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/ProblemLinkFragment.kt @@ -1,8 +1,6 @@ package com.navinfo.omqs.ui.fragment.evaluationresult -import android.os.Build import android.os.Bundle -import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -50,13 +48,11 @@ class ProblemLinkFragment : BaseFragment() { } binding.linkRightRecyclerview.adapter = rightAdapter //右侧菜单增加组标题 - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - binding.linkRightRecyclerview.addItemDecoration( - RightGroupHeaderDecoration( - requireContext() - ) + binding.linkRightRecyclerview.addItemDecoration( + RightGroupHeaderDecoration( + requireContext() ) - } + ) //右侧菜单查询数据监听 viewModel.liveDataRightTypeList.observe(viewLifecycleOwner) { rightAdapter.setSelectTitle(viewModel.liveDataQsRecordBean.value!!.cause) diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/RightGroupHeaderDecoration.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/RightGroupHeaderDecoration.kt index 13b6fad4..41071b8c 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/RightGroupHeaderDecoration.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/RightGroupHeaderDecoration.kt @@ -5,9 +5,7 @@ import android.graphics.Canvas import android.graphics.Color import android.graphics.Paint import android.graphics.Rect -import android.os.Build import android.view.View -import androidx.annotation.RequiresApi import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.ItemDecoration @@ -17,7 +15,6 @@ import com.navinfo.omqs.R /** * 自定义装饰器(实现分组+吸顶效果) */ -@RequiresApi(Build.VERSION_CODES.M) class RightGroupHeaderDecoration(context: Context) : ItemDecoration() { //头部的高 private val mItemHeaderHeight: Int @@ -35,7 +32,7 @@ class RightGroupHeaderDecoration(context: Context) : ItemDecoration() { mTextPaddingLeft = dp2px(context, 6f) mTextRect = Rect() mItemHeaderPaint = Paint(Paint.ANTI_ALIAS_FLAG) - mItemHeaderPaint.color = context.getColor(R.color.btn_bg_blue) + mItemHeaderPaint.color = context.resources.getColor(R.color.btn_bg_blue) mTextPaint = Paint(Paint.ANTI_ALIAS_FLAG) mTextPaint.textSize = 46f mTextPaint.color = Color.WHITE diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/note/CanvasFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/note/CanvasFragment.kt index 09ca56e9..dc865185 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/note/CanvasFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/note/CanvasFragment.kt @@ -78,9 +78,7 @@ class CanvasFragment : BaseFragment() { canvasView.setStyle(mStyle) if (mColor == -1) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - mColor = resources.getColor(R.color.black, null) - } + mColor = resources.getColor(R.color.black) } canvasView.setPaintColor(mColor) canvasView.setPaintWidth(width) diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkFragment.kt index f259415d..571a1d23 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkFragment.kt @@ -42,6 +42,8 @@ class TaskLinkFragment : BaseFragment(), View.OnClickListener { binding.taskLinkDataLevel.setOnClickListener(this) binding.taskLinkBarCancel.setOnClickListener(this) binding.taskLinkBarSave.setOnClickListener(this) + binding.taskLinkBack.setOnClickListener(this) + binding.taskLinkClear.setOnClickListener(this) /** * 数据操作结束 */ @@ -86,13 +88,11 @@ class TaskLinkFragment : BaseFragment(), View.OnClickListener { /** * 线长度 */ - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - mapController.measureLayerHandler.lineLenghtLiveData.observe(viewLifecycleOwner) { - binding.taskLinkLength.text = "${it}米" - } - mapController.measureLayerHandler.tempLineDistanceLiveData.observe(viewLifecycleOwner) { - (activity as MainActivity).setHomeCenterText(it) - } + mapController.measureLayerHandler.lineLengthLiveData.observe(viewLifecycleOwner) { + binding.taskLinkLength.text = "${it}米" + } + mapController.measureLayerHandler.tempLineDistanceLiveData.observe(viewLifecycleOwner) { + (activity as MainActivity).setHomeCenterText(it) } } @@ -142,9 +142,13 @@ class TaskLinkFragment : BaseFragment(), View.OnClickListener { onBackPressed() } binding.taskLinkBarSave -> { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - viewModel.saveData() - } + viewModel.saveData() + } + binding.taskLinkBack -> { + viewModel.removeLinkLastPoint() + } + binding.taskLinkClear -> { + viewModel.clearLink() } } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkMiddleAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkMiddleAdapter.kt index 3ce977fa..2536192a 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkMiddleAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkMiddleAdapter.kt @@ -12,7 +12,7 @@ import com.navinfo.omqs.ui.other.BaseViewHolder data class TaskLinkInfoAdapterItem( val title: String, - val type: String + val type: Int ) class TaskLinkMiddleAdapter(private var itemListener: ((Int, TaskLinkInfoAdapterItem) -> Unit?)? = null) : @@ -26,17 +26,16 @@ class TaskLinkMiddleAdapter(private var itemListener: ((Int, TaskLinkInfoAdapter return BaseViewHolder(viewBinding) } - @RequiresApi(Build.VERSION_CODES.M) override fun onBindViewHolder(holder: BaseViewHolder, position: Int) { val binding = holder.viewBinding as AdapterTaskLinkInfoBinding binding.title.text = data[position].title if (selectTitle == binding.title.text) { binding.title.setBackgroundResource(R.drawable.shape_bg_blue_bg_4_radius) - binding.title.setTextColor(holder.viewBinding.root.context.getColor(R.color.white)) + binding.title.setTextColor(holder.viewBinding.root.context.resources.getColor(R.color.white)) } else { binding.title.setBackgroundResource(R.drawable.shape_rect_white_2dp_bg) - binding.title.setTextColor(holder.viewBinding.root.context.getColor(R.color.black)) + binding.title.setTextColor(holder.viewBinding.root.context.resources.getColor(R.color.black)) } binding.root.setOnClickListener { if (selectTitle != data[position].title) { diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt index 1ccd5587..17cfbf74 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt @@ -7,6 +7,7 @@ import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.navinfo.collect.library.data.entity.HadLinkDvoBean +import com.navinfo.collect.library.data.entity.LinkInfoBean import com.navinfo.collect.library.data.entity.TaskBean import com.navinfo.collect.library.map.NIMapController import com.navinfo.collect.library.utils.GeometryTools @@ -32,38 +33,38 @@ class TaskLinkViewModel @Inject constructor( * 种别 */ private val kindList = listOf( - TaskLinkInfoAdapterItem("高速道路", "1"), - TaskLinkInfoAdapterItem("城市高速", "2"), - TaskLinkInfoAdapterItem("国道", "3"), - TaskLinkInfoAdapterItem("省道", "4"), - TaskLinkInfoAdapterItem("县道", "6"), - TaskLinkInfoAdapterItem("乡镇村道路", "7"), - TaskLinkInfoAdapterItem("其他道路", "8"), - TaskLinkInfoAdapterItem("非引导道路", "9"), - TaskLinkInfoAdapterItem("步行道路", "10"), - TaskLinkInfoAdapterItem("人渡", "11"), - TaskLinkInfoAdapterItem("轮渡", "13"), - TaskLinkInfoAdapterItem("自行车道路", "15"), + TaskLinkInfoAdapterItem("高速道路", 1), + TaskLinkInfoAdapterItem("城市高速", 2), + TaskLinkInfoAdapterItem("国道", 3), + TaskLinkInfoAdapterItem("省道", 4), + TaskLinkInfoAdapterItem("县道", 6), + TaskLinkInfoAdapterItem("乡镇村道路", 7), + TaskLinkInfoAdapterItem("其他道路", 8), + TaskLinkInfoAdapterItem("非引导道路", 9), + TaskLinkInfoAdapterItem("步行道路", 10), + TaskLinkInfoAdapterItem("人渡", 11), + TaskLinkInfoAdapterItem("轮渡", 13), + TaskLinkInfoAdapterItem("自行车道路", 15), ) /** * FunctionGrade 功能等级 */ private val functionLevelList = listOf( - TaskLinkInfoAdapterItem("等级1", "1"), - TaskLinkInfoAdapterItem("等级2", "2"), - TaskLinkInfoAdapterItem("等级3", "3"), - TaskLinkInfoAdapterItem("等级4", "4"), - TaskLinkInfoAdapterItem("等级5", "5"), + TaskLinkInfoAdapterItem("等级1", 1), + TaskLinkInfoAdapterItem("等级2", 2), + TaskLinkInfoAdapterItem("等级3", 3), + TaskLinkInfoAdapterItem("等级4", 4), + TaskLinkInfoAdapterItem("等级5", 5), ) /** * 数据级别 */ private val dataLevelList = listOf( - TaskLinkInfoAdapterItem("Pro lane model(有高精车道模型覆盖的高速和城高link)", "1"), - TaskLinkInfoAdapterItem("Lite lane model(有高精车道模型覆盖的普通路link)", "2"), - TaskLinkInfoAdapterItem("Standard road model(其他link)", "3"), + TaskLinkInfoAdapterItem("Pro lane model(有高精车道模型覆盖的高速和城高link)", 1), + TaskLinkInfoAdapterItem("Lite lane model(有高精车道模型覆盖的普通路link)", 2), + TaskLinkInfoAdapterItem("Standard road model(其他link)", 3), ) /** @@ -125,9 +126,7 @@ class TaskLinkViewModel @Inject constructor( * 编辑点 */ fun addPoint() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - mapController.measureLayerHandler.drawLineOrPolygon(false) - } + mapController.measureLayerHandler.drawLineOrPolygon(false) } /** @@ -154,9 +153,7 @@ class TaskLinkViewModel @Inject constructor( } override fun onCleared() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - mapController.measureLayerHandler.clear() - } + mapController.measureLayerHandler.clear() sharedPreferences.unregisterOnSharedPreferenceChangeListener(this) super.onCleared() } @@ -164,7 +161,6 @@ class TaskLinkViewModel @Inject constructor( /** * 保存数据 */ - @RequiresApi(Build.VERSION_CODES.M) fun saveData() { viewModelScope.launch(Dispatchers.Default) { if (liveDataTaskBean.value == null) { @@ -189,10 +185,16 @@ class TaskLinkViewModel @Inject constructor( return@launch } val linkBean = HadLinkDvoBean( +// taskId = liveDataTaskBean.value!!.id, linkPid = UUID.randomUUID().toString(), linkStatus = 3, geometry = GeometryTools.getLineString(mapController.measureLayerHandler.mPathLayer.points), - linkLength = mapController.measureLayerHandler.lineLenghtLiveData.value!!, + linkInfo = LinkInfoBean( + kind = liveDataSelectKind.value!!.type, + functionLevel = liveDataSelectFunctionLevel.value!!.type, + dataLevel = liveDataSelectDataLevel.value!!.type, + length = mapController.measureLayerHandler.lineLengthLiveData.value!!, + ) ) val task: TaskBean = liveDataTaskBean.value!! task.hadLinkDvoList.add(linkBean) @@ -200,6 +202,7 @@ class TaskLinkViewModel @Inject constructor( realm.executeTransaction { it.copyToRealmOrUpdate(task) } + mapController.lineHandler.addTaskLink(linkBean) sharedPreferences.edit().putString(Constant.SHARED_SYNC_TASK_LINK_ID, linkBean.linkPid) .apply() liveDataFinish.postValue(true) @@ -214,4 +217,18 @@ class TaskLinkViewModel @Inject constructor( getTaskBean() } } + + /** + * 绘制线的时候回退点 + */ + fun removeLinkLastPoint() { + mapController.measureLayerHandler.drawLineBackspace() + } + + /** + * 清除重绘 + */ + fun clearLink() { + mapController.measureLayerHandler.clear() + } } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt index 20a57e5a..196a7ca7 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt @@ -42,10 +42,7 @@ class TaskListFragment : BaseFragment() { } when (status) { TaskListAdapter.Companion.ItemClickStatus.ITEM_LAYOUT_CLICK -> { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - viewModel.setSelectTaskBean(taskBean) - } else { - } + viewModel.setSelectTaskBean(taskBean) } TaskListAdapter.Companion.ItemClickStatus.DELETE_LAYOUT_CLICK -> { context?.let { viewModel.removeTask(it, taskBean) } @@ -81,7 +78,7 @@ class TaskListFragment : BaseFragment() { binding.taskListRecyclerview.layoutManager = layoutManager binding.taskListRecyclerview.adapter = adapter viewModel.liveDataTaskList.observe(viewLifecycleOwner) { - adapter.initSelectTask(it,viewModel.currentSelectTaskBean?.id) + adapter.initSelectTask(it, viewModel.currentSelectTaskBean?.id) } //监听并调用上传 diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt index 2552b46e..c71a5fbb 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt @@ -152,9 +152,7 @@ class TaskViewModel @Inject constructor( currentSelectTaskBean = item liveDataTaskLinks.postValue(currentSelectTaskBean!!.hadLinkDvoList) withContext(Dispatchers.Main) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - showTaskLinks(currentSelectTaskBean!!) - } + showTaskLinks(currentSelectTaskBean!!) } break } @@ -173,17 +171,14 @@ class TaskViewModel @Inject constructor( currentSelectTaskBean = taskBean liveDataTaskLinks.value = taskBean.hadLinkDvoList - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - showTaskLinks(taskBean) - } + showTaskLinks(taskBean) } - @RequiresApi(Build.VERSION_CODES.M) private fun showTaskLinks(taskBean: TaskBean) { - mapController.lineHandler.omdbTaskLinkLayer.removeAll() + mapController.lineHandler.removeAllTaskLine() if (taskBean.hadLinkDvoList.isNotEmpty()) { - mapController.lineHandler.omdbTaskLinkLayer.addLineList(taskBean.hadLinkDvoList) + mapController.lineHandler.showTaskLines(taskBean.hadLinkDvoList) var maxX = 0.0 var maxY = 0.0 var minX = 0.0 @@ -218,9 +213,9 @@ class TaskViewModel @Inject constructor( /** * 高亮当前选中的link */ - @RequiresApi(Build.VERSION_CODES.M) fun showCurrentLink(link: HadLinkDvoBean) { - mapController.lineHandler.omdbTaskLinkLayer.showSelectLine(link) + mapController.lineHandler.showLine(link.geometry) +// mapController.lineHandler.omdbTaskLinkLayer.showSelectLine(link) val geometry = GeometryTools.createGeometry(link.geometry) if (geometry != null) { val envelope = geometry.envelopeInternal @@ -235,9 +230,7 @@ class TaskViewModel @Inject constructor( } override fun onCleared() { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - mapController.lineHandler.omdbTaskLinkLayer.clearSelectLine() - } + mapController.lineHandler.removeLine() sharedPreferences.unregisterOnSharedPreferenceChangeListener(this) super.onCleared() } diff --git a/app/src/main/java/com/navinfo/omqs/ui/widget/TextProgressButtonBar.kt b/app/src/main/java/com/navinfo/omqs/ui/widget/TextProgressButtonBar.kt index 3e687f45..d74c6580 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/widget/TextProgressButtonBar.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/widget/TextProgressButtonBar.kt @@ -122,18 +122,16 @@ class TextProgressButtonBar : View { * 绘制进度值 */ - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - val shader = LinearGradient( - oval.left, - oval.top, - oval.right, - oval.bottom, - mStartColor, - mCurrentColor, - Shader.TileMode.MIRROR - ) - it.shader = shader - } + val shader = LinearGradient( + oval.left, + oval.top, + oval.right, + oval.bottom, + mStartColor, + mCurrentColor, + Shader.TileMode.MIRROR + ) + it.shader = shader canvas.drawRoundRect(oval, progress.toFloat(), progress.toFloat(), it) } else { oval = RectF( @@ -143,18 +141,16 @@ class TextProgressButtonBar : View { * 绘制进度值 */ - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - val shader = LinearGradient( - oval.left, - oval.top, - oval.right, - oval.bottom, - mStartColor, - mCurrentColor, - Shader.TileMode.CLAMP - ) - it.shader = shader - } + val shader = LinearGradient( + oval.left, + oval.top, + oval.right, + oval.bottom, + mStartColor, + mCurrentColor, + Shader.TileMode.CLAMP + ) + it.shader = shader canvas.drawRoundRect(oval, corner.toFloat(), corner.toFloat(), it) } /*** diff --git a/app/src/main/res/layout/fragment_task_link.xml b/app/src/main/res/layout/fragment_task_link.xml index 277b16bd..e0e4ad8e 100644 --- a/app/src/main/res/layout/fragment_task_link.xml +++ b/app/src/main/res/layout/fragment_task_link.xml @@ -86,7 +86,7 @@ android:orientation="horizontal"> @@ -94,17 +94,8 @@ style="@style/link_gray_style" android:layout_margin="2dp" /> - - - - diff --git a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/HadLinkDvoBean.kt b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/HadLinkDvoBean.kt index 4727a0da..06c7cdb8 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/HadLinkDvoBean.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/HadLinkDvoBean.kt @@ -3,6 +3,10 @@ package com.navinfo.collect.library.data.entity import io.realm.RealmObject open class HadLinkDvoBean @JvmOverloads constructor( +// /** +// * 任务id,方便捕捉查询 +// */ +// var taskId: Int = 0, /** * 图幅号 */ @@ -22,12 +26,11 @@ open class HadLinkDvoBean @JvmOverloads constructor( var reason: String = "", /** - * 1:源库link, 3:现象新增 + * 1:源库link,2:选择link 3:现场新增 */ var linkStatus: Int = 1, - /** - * link 长度 + * 详细属性 */ - var linkLength: Double = 0.000 + var linkInfo: LinkInfoBean? = null ) : RealmObject() \ No newline at end of file diff --git a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/LinkInfoBean.kt b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/LinkInfoBean.kt new file mode 100644 index 00000000..ab5b6f5e --- /dev/null +++ b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/LinkInfoBean.kt @@ -0,0 +1,29 @@ +package com.navinfo.collect.library.data.entity + +import io.realm.RealmObject + +/** + * 道路信息 + */ +open class LinkInfoBean @JvmOverloads constructor( + /** + * 种别 + */ + var kind: Int = 0, + /** + * 功能等级 + */ + var functionLevel: Int = 0, + /** + * 数据的等级 + */ + var dataLevel: Int = 0, + /** + * 长度(米) + */ + var length: Double = 0.000, + /** + * 备注信息 + */ + var description: String = "" +) : RealmObject() diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapController.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapController.kt index 077575a3..d449d4a2 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapController.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapController.kt @@ -38,14 +38,10 @@ class NIMapController { locationLayerHandler = LocationLayerHandler(context, mapView) animationHandler = AnimationHandler(context, mapView) markerHandle = MarkHandler(context, mapView) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - lineHandler = LineHandler(context, mapView) - } + lineHandler = LineHandler(context, mapView) polygonHandler = PolygonHandler(context, mapView) viewportHandler = ViewportHandler(context, mapView) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - measureLayerHandler = MeasureLayerHandler(context, mapView) - } + measureLayerHandler = MeasureLayerHandler(context, mapView) mMapView = mapView mMapView.setOnMapClickListener { context.lifecycleScope.launch { diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt index 68bff116..0cdee3b3 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt @@ -1,22 +1,14 @@ package com.navinfo.collect.library.map.handler -import android.graphics.BitmapFactory -import android.os.Build import android.widget.Toast -import androidx.annotation.RequiresApi import androidx.appcompat.app.AppCompatActivity import com.navinfo.collect.library.R +import com.navinfo.collect.library.data.entity.HadLinkDvoBean import com.navinfo.collect.library.map.NIMapView import com.navinfo.collect.library.map.layers.MultiLinesLayer -import com.navinfo.collect.library.map.layers.NoteLineLayer import com.navinfo.collect.library.map.layers.OmdbTaskLinkLayer import com.navinfo.collect.library.utils.GeometryTools -import com.navinfo.collect.library.utils.StringUtil import org.oscim.android.canvas.AndroidBitmap -import org.oscim.backend.canvas.Bitmap -import org.oscim.core.GeoPoint -import org.oscim.core.MapPosition -import org.oscim.event.Event import org.oscim.layers.marker.ItemizedLayer import org.oscim.layers.marker.ItemizedLayer.OnItemGestureListener import org.oscim.layers.marker.MarkerInterface @@ -24,17 +16,8 @@ import org.oscim.layers.marker.MarkerItem import org.oscim.layers.marker.MarkerSymbol import org.oscim.layers.vector.PathLayer import org.oscim.layers.vector.geometries.Style -import org.oscim.map.Map -@RequiresApi(Build.VERSION_CODES.M) -class LineHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler(context, mapView), - Map.UpdateListener { - - private var editIndex: Int = -1; - private val mPathMakers: MutableList = mutableListOf() - - //绘制线 引导线样式 - private val newTempStyle: Style +class LineHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler(context, mapView) { //绘制线 样式 private val lineStyle: Style @@ -42,26 +25,20 @@ class LineHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler( //高亮线绘制线 样式 private val defaultLineStyle: Style - //线型编辑时的样式 - private val editTempStyle: Style - - //新增线数据 - private val mPathLayer: PathLayer - - //新增线数据引线 - private val mPathLayerTemp: PathLayer - - //线路端点图标 - private val mPathMarkerBitmap: Bitmap - - //线路端点marker - private val mEndpointLayer: ItemizedLayer - - private var bDrawLine = false - - + /** + * 高亮线图层,同时只高亮一条线,如线选择 + */ private val mDefaultPathLayer: PathLayer + private var onTaskLinkItemClickListener: OnTaskLinkItemClickListener? = null + + fun setOnTaskLinkItemClickListener(listener: OnTaskLinkItemClickListener) { + onTaskLinkItemClickListener = listener + } + + /** + * 路口高亮 + */ val linksLayer by lazy { val layer = MultiLinesLayer(mapView.vtmMap) addLayer(layer, NIMapView.LAYER_GROUPS.VECTOR) @@ -71,109 +48,88 @@ class LineHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler( /** * 任务线图层 */ - val omdbTaskLinkLayer by lazy { - val omdbTaskLinkLayer = OmdbTaskLinkLayer( + private val omdbTaskLinkLayer: OmdbTaskLinkLayer by lazy { + val layer = OmdbTaskLinkLayer( mMapView.vtmMap, Style.builder() // .stippleColor(context.resources.getColor(R.color.draw_line_red_color, null)) - .fillColor(context.resources.getColor(R.color.draw_line_red_color, null)) + .fillColor(context.resources.getColor(R.color.draw_line_red_color)) .fillAlpha(0.5f) - .strokeColor(context.resources.getColor(R.color.draw_line_red_color, null)) + .strokeColor(context.resources.getColor(R.color.draw_line_red_color)) .strokeWidth(8f) .fixed(true).build() ) - addLayer(omdbTaskLinkLayer, NIMapView.LAYER_GROUPS.VECTOR) - omdbTaskLinkLayer + addLayer(layer, NIMapView.LAYER_GROUPS.VECTOR) + layer } + /** + * 任务线的marker,新增link会有marker + */ + private val omdbTaskMarkerLayer: ItemizedLayer by lazy { + + //新增marker图标样式 + val mDefaultBitmap = + AndroidBitmap( + context.resources.openRawResource(R.raw.icon_task_link_marker), 48, 48, 100 + ) + val markerSymbol = MarkerSymbol( + mDefaultBitmap, + MarkerSymbol.HotspotPlace.CENTER + ) + val layer = ItemizedLayer( + mapView.vtmMap, + ArrayList(), + markerSymbol, + object : OnItemGestureListener { + override fun onItemSingleTapUp(index: Int, item: MarkerInterface?): Boolean { + onTaskLinkItemClickListener?.let { + if (item is MarkerItem) { + it.onTaskLink(item.title) + } + } + + return false + } + + override fun onItemLongPress(index: Int, item: MarkerInterface?): Boolean { + return false + } + + } + ) + addLayer(layer, NIMapView.LAYER_GROUPS.OPERATE_MARKER) + layer + } init { - mMapView.vtmMap.events.bind(this) //新增线数据图层和线样式 lineStyle = Style.builder() - .stippleColor(context.resources.getColor(R.color.draw_line_blue1_color, null)) + .stippleColor(context.resources.getColor(R.color.draw_line_blue1_color)) .strokeWidth(4f) - .fillColor(context.resources.getColor(R.color.draw_line_blue2_color, null)) + .fillColor(context.resources.getColor(R.color.draw_line_blue2_color)) .fillAlpha(0.5f) - .strokeColor(context.resources.getColor(R.color.draw_line_blue2_color, null)) + .strokeColor(context.resources.getColor(R.color.draw_line_blue2_color)) .fixed(true).build() defaultLineStyle = Style.builder() - .stippleColor(context.resources.getColor(R.color.draw_line_blue2_color, null)) + .stippleColor(context.resources.getColor(R.color.draw_line_blue2_color)) .strokeWidth(10f) - .fillColor(context.resources.getColor(R.color.teal_200, null)) + .fillColor(context.resources.getColor(R.color.teal_200)) .fillAlpha(0.5f) - .strokeColor(context.resources.getColor(R.color.teal_200, null)) + .strokeColor(context.resources.getColor(R.color.teal_200)) .fixed(true).build() - newTempStyle = - Style.builder().stippleColor(context.resources.getColor(R.color.transparent, null)) - .stipple(30).stippleWidth(30f).strokeWidth(4f) - .strokeColor(context.resources.getColor(R.color.draw_line_blue2_color, null)) - .fixed(true).randomOffset(false).build() - - editTempStyle = - Style.builder().stippleColor(context.resources.getColor(R.color.transparent, null)) - .stipple(30).stippleWidth(30f).strokeWidth(8f) - .strokeColor(context.resources.getColor(R.color.draw_line_red_color, null)) - .fixed(true).randomOffset(false).build() mDefaultPathLayer = PathLayer(mMapView.vtmMap, defaultLineStyle) addLayer(mDefaultPathLayer, NIMapView.LAYER_GROUPS.OPERATE_LINE) - mPathLayer = PathLayer(mMapView.vtmMap, lineStyle) -// addLayer(mPathLayer, NIMapView.LAYER_GROUPS.OPERATE) - mPathLayerTemp = PathLayer(mMapView.vtmMap, newTempStyle) - // addLayer(mPathLayerTemp, NIMapView.LAYER_GROUPS.OPERATE) - - mPathMarkerBitmap = AndroidBitmap( - BitmapFactory.decodeResource( - mContext.resources, R.mipmap.icon_path_maker - ) - ) - val markerSymbol = MarkerSymbol(mPathMarkerBitmap, MarkerSymbol.HotspotPlace.CENTER) - //新增marker图层 - mEndpointLayer = ItemizedLayer( - mMapView.vtmMap, ArrayList(), markerSymbol, null - ) - // addLayer(mEndpointLayer, NIMapView.LAYER_GROUPS.OPERATE) - mEndpointLayer.setOnItemGestureListener(object : OnItemGestureListener { - override fun onItemSingleTapUp(index: Int, item: MarkerInterface): Boolean { - if (bDrawLine) { - for (i in mPathMakers.indices) { - val item1 = mPathMakers[i] - if (item === item1) { - mMapView.vtmMap.animator().animateTo( - GeoPoint( - item.getPoint().latitude, item.getPoint().longitude - ) - ) - editIndex = i - mPathLayerTemp.setStyle(editTempStyle) - val list: MutableList = mutableListOf() - if (editIndex == 0 || editIndex == mPathMakers.size - 1) { - list.add(item.getPoint()) - list.add(item.getPoint()) - } else { - list.add(mPathMakers[editIndex - 1].geoPoint) - list.add(item.getPoint()) - list.add(mPathMakers[editIndex + 1].geoPoint) - } - mPathLayerTemp.setPoints(list) - return false - } - } - } - return false - } - - override fun onItemLongPress(index: Int, item: MarkerInterface): Boolean { - return false - } - }) } + /** + * 高亮一条线 + */ fun showLine(geometry: String) { try { mDefaultPathLayer.clearPath() @@ -184,218 +140,80 @@ class LineHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler( } } + /** + * 取消高亮线 + */ fun removeLine() { mDefaultPathLayer.clearPath() mDefaultPathLayer.isEnabled = false } - fun addDrawLinePoint(geoPoint: GeoPoint): List { - - if (!bDrawLine) { - mPathLayer.isEnabled = true - mPathLayerTemp.isEnabled = true - mEndpointLayer.isEnabled = true - bDrawLine = true - } - //编辑点 - if (editIndex > -1) { - if (mPathLayer.points.size > 0) { - var list: MutableList = mutableListOf() - list.addAll(mPathLayer.points) - if (list.size > 3) { - if (editIndex == 0) { - val listNew = mutableListOf() - listNew.add(geoPoint) - listNew.add(list[1]) - list.removeAt(0) - if (GeometryTools.isLineStringCrosses(list, listNew)) { - Toast.makeText(mContext, "不能交叉", Toast.LENGTH_SHORT).show() - return mPathLayer.points - } - } else if (editIndex == list.size - 1) { - val listNew = mutableListOf() - listNew.add(geoPoint) - listNew.add(list[editIndex - 1]) - list.removeAt(editIndex) - if (GeometryTools.isLineStringCrosses(list, listNew)) { - Toast.makeText(mContext, "不能交叉", Toast.LENGTH_SHORT).show() - return mPathLayer.points - } - } else if (editIndex == 1) { - val listNew = mutableListOf() - listNew.add(list[0]) - listNew.add(geoPoint) - listNew.add(list[2]) - list = list.subList(2, list.size) - if (GeometryTools.isLineStringCrosses(list, listNew)) { - Toast.makeText(mContext, "不能交叉", Toast.LENGTH_SHORT).show() - return mPathLayer.points - } - } else if (editIndex == list.size - 2) { - val listNew = mutableListOf() - listNew.add(list[list.size - 1]) - listNew.add(geoPoint) - listNew.add(list[editIndex - 1]) - list = list.subList(0, list.size - 2) - if (GeometryTools.isLineStringCrosses(list, listNew)) { - Toast.makeText(mContext, "不能交叉", Toast.LENGTH_SHORT).show() - return mPathLayer.points - } - } else { - val listNew = mutableListOf() - listNew.add(list[editIndex - 1]) - listNew.add(geoPoint) - listNew.add(list[editIndex + 1]) - val list1: MutableList = mutableListOf(); - list1.addAll(list.subList(0, editIndex)) - val list2: MutableList = mutableListOf() - list2.addAll(list.subList(editIndex + 1, list.size)) - if (GeometryTools.isLineStringCrosses(list1, listNew)) { - Toast.makeText(mContext, "不能交叉", Toast.LENGTH_SHORT).show() - return mPathLayer.points - } - if (GeometryTools.isLineStringCrosses(list2, listNew)) { - Toast.makeText(mContext, "不能交叉", Toast.LENGTH_SHORT).show() - return mPathLayer.points - } - } - } - if (editIndex < mPathLayer.points.size) { - mPathLayer.points.removeAt(editIndex) - val list2: MutableList = mutableListOf() - list2.addAll(mPathLayer.points) - list2.add(editIndex, geoPoint) - mPathLayer.setPoints(list2) - } - } - if (mPathMakers.size > editIndex) { - mEndpointLayer.removeItem(mPathMakers[editIndex]) - mPathMakers.removeAt(editIndex) - val markerItem = MarkerItem(StringUtil.createUUID(), "", "", geoPoint) - mEndpointLayer.addItem(markerItem) - mPathMakers.add(editIndex, markerItem) - mPathLayerTemp.setStyle(newTempStyle) - val list: MutableList = mutableListOf() -// if (NMPFragmentManager.getInstance() -// .getNewDataBottomType() === 3 && mPathMakers.size > 1 -// ) { -// list.add(mPathMakers[0].geoPoint) -// list.add(geoPoint) -// list.add(mPathMakers[mPathMakers.size - 1].geoPoint) -// } else { - list.add(mPathMakers[mPathMakers.size - 1].geoPoint) - list.add(geoPoint) -// } - mPathLayerTemp.setPoints(list) - } - editIndex = -1 - } else { //新增点 - val points: List = mPathLayer.points - if (points.size > 2) { - val list: MutableList = mutableListOf() - list.add(geoPoint) - list.add(points[points.size - 1]) - val bCross = GeometryTools.isLineStringCrosses(points, list) - if (bCross) { - Toast.makeText(mContext, "不能交叉", Toast.LENGTH_SHORT).show() - return mPathLayer.points - } - } - mPathLayer.addPoint(geoPoint) - val markerItem = MarkerItem(StringUtil.createUUID(), "", "", geoPoint) - mEndpointLayer.addItem(markerItem) - mPathMakers.add(markerItem) - } - - return mPathLayer.points - } - - fun addDrawLine(list: List) { - for (item in list) { - addDrawLinePoint(item) - } - } - - - override fun onMapEvent(e: Event, mapPosition: MapPosition) { - if (!bDrawLine) return -// if (mMapView.centerPixel[1] > mMapView.vtmMap.height / 2) { -// val geoPoint = -// mMapView.vtmMap.viewport() -// .fromScreenPoint( -// mMapView.centerPixel[0], -// mMapView.vtmMap.height - mMapView.centerPixel[1] -// ) -// mapPosition.setPosition(geoPoint) -// } - if (e === Map.POSITION_EVENT) { - if (mPathLayer.points.size > 0) { - if (editIndex > -1) { - val list: MutableList = mutableListOf() - if (editIndex == 0 || editIndex == mPathMakers.size - 1) { - list.add(mPathMakers[editIndex].geoPoint) - list.add( - GeoPoint( - mapPosition.latitude, mapPosition.longitude - ) - ) - } else { - list.add(mPathMakers[editIndex - 1].geoPoint) - list.add( - GeoPoint( - mapPosition.latitude, mapPosition.longitude - ) - ) - list.add(mPathMakers[editIndex + 1].geoPoint) - } - mPathLayerTemp.setPoints(list) -// crossText.setText("") - } else { - val list: MutableList = mutableListOf() - list.add(mPathLayer.points[mPathLayer.points.size - 1]) - list.add( - GeoPoint( - mapPosition.latitude, mapPosition.longitude - ) - ) - mPathLayerTemp.setPoints(list) - if (mPathLayer.points.size > 0) { - val listDis: MutableList = mutableListOf() - listDis.add( - GeoPoint( - mapPosition.latitude, mapPosition.longitude - ) - ) -// val distance: Double = -// GeometryTools.getDistance(listDis) -// if (distance < 1000) crossText.setText( -// distance as Int.toString() + "米" -// ) else { -// val d = distance / 1000.0 -// val bg = BigDecimal(d) -// val f1 = -// bg.setScale(1, BigDecimal.ROUND_HALF_UP).toDouble() -//// crossText.setText(f1.toString() + "公里") -// } - } else { -// crossText.setText("") - } - } - } - } - } - - fun clear() { - mPathLayer.clearPath() - mPathLayer.isEnabled = false - mPathLayerTemp.clearPath() - mPathLayerTemp.isEnabled = false - mEndpointLayer.removeAllItems() - mEndpointLayer.isEnabled = false - mPathMakers.clear() - editIndex = -1 - bDrawLine = false + /** + * 移除所有任务高亮线 + */ + fun removeAllTaskLine() { omdbTaskLinkLayer.removeAll() - linksLayer.clear() + omdbTaskMarkerLayer.removeAllItems() } + + /** + * 显示所有任务高亮线 + */ + fun showTaskLines(hadLinkDvoList: List) { + for (link in hadLinkDvoList) { + if (link.linkStatus == 3) { + val pointList = GeometryTools.getGeoPoints(link.geometry) + val geoPoint = if (pointList.size < 3) { + pointList[0] + } else { + pointList[1] + } + val marker = MarkerItem( + link.linkPid, + "", + geoPoint + ) + omdbTaskMarkerLayer.addItem(marker) + } + } + omdbTaskLinkLayer.addLineList(hadLinkDvoList) + } + + /** + * 增加一条任务高亮线 + */ + fun addTaskLink(linkBean: HadLinkDvoBean) { + if (linkBean.linkStatus == 3) { + val pointList = GeometryTools.getGeoPoints(linkBean.geometry) + val geoPoint = if (pointList.size < 3) { + pointList[0] + } else { + pointList[1] + } + val marker = MarkerItem( + linkBean.linkPid, + "", + geoPoint + ) + omdbTaskMarkerLayer.addItem(marker) + } + omdbTaskLinkLayer.addLine(linkBean) + } + + /** + * 增加一条任务高亮线 + */ + fun removeTaskLink(linkBeanId: String) { + for (marker in omdbTaskMarkerLayer.itemList) { + if ((marker as MarkerItem).title == linkBeanId) { + omdbTaskMarkerLayer.removeItem(marker) + break + } + } + omdbTaskLinkLayer.removeLine(linkBeanId) + } +} + +interface OnTaskLinkItemClickListener { + fun onTaskLink(taskLinkId: String) } \ No newline at end of file diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MeasureLayerHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MeasureLayerHandler.kt index b8966a5f..237afa13 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MeasureLayerHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MeasureLayerHandler.kt @@ -34,7 +34,6 @@ import java.math.BigDecimal import kotlin.math.abs import kotlin.math.ceil -@RequiresApi(Build.VERSION_CODES.M) open class MeasureLayerHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler(context, mapView), Map.UpdateListener { @@ -51,7 +50,7 @@ open class MeasureLayerHandler(context: AppCompatActivity, mapView: NIMapView) : /** * 实际绘制的总长度 */ - val lineLenghtLiveData = MutableLiveData(0.000) + val lineLengthLiveData = MutableLiveData(0.000) private val markerLayer: ItemizedLayer by lazy { @@ -76,27 +75,27 @@ open class MeasureLayerHandler(context: AppCompatActivity, mapView: NIMapView) : private val lineStyle: Style by lazy { //新增线数据图层和线样式 Style.builder().scaleZoomLevel(20).buffer(1.0) - .stippleColor(context.resources.getColor(R.color.draw_line_blue1_color, null)) + .stippleColor(context.resources.getColor(R.color.draw_line_blue1_color)) .strokeWidth(4f) - .fillColor(context.resources.getColor(R.color.draw_line_blue2_color, null)) + .fillColor(context.resources.getColor(R.color.draw_line_blue2_color)) .fillAlpha(0.5f) - .strokeColor(context.resources.getColor(R.color.draw_line_blue2_color, null)) - .fillColor(context.resources.getColor(R.color.draw_line_red_color, null)) + .strokeColor(context.resources.getColor(R.color.draw_line_blue2_color)) + .fillColor(context.resources.getColor(R.color.draw_line_red_color)) .stippleWidth(4f).fixed(true).build() } private val newTempStyle: Style by lazy { - Style.builder().stippleColor(context.resources.getColor(R.color.transparent, null)) + Style.builder().stippleColor(context.resources.getColor(R.color.transparent)) .stipple(30).stippleWidth(30f).strokeWidth(4f) - .strokeColor(context.resources.getColor(R.color.draw_line_blue2_color, null)) + .strokeColor(context.resources.getColor(R.color.draw_line_blue2_color)) .fixed(true).randomOffset(false).build() } //线型编辑时的样式 private val editTempStyle: Style by lazy { - Style.builder().stippleColor(context.resources.getColor(R.color.transparent, null)) + Style.builder().stippleColor(context.resources.getColor(R.color.transparent)) .stipple(30).stippleWidth(30f).strokeWidth(8f) - .strokeColor(context.resources.getColor(R.color.draw_line_red_color, null)).fixed(true) + .strokeColor(context.resources.getColor(R.color.draw_line_red_color)).fixed(true) .randomOffset(false).build() } @@ -225,7 +224,9 @@ open class MeasureLayerHandler(context: AppCompatActivity, mapView: NIMapView) : val distance: Double = GeometryTools.getDistance(mPathLayer.points) val bg = BigDecimal(distance) val f1 = bg.setScale(3, BigDecimal.ROUND_HALF_UP).toDouble() - lineLenghtLiveData.value = f1 + lineLengthLiveData.value = f1 + } else { + lineLengthLiveData.value = 0.000 } } val markerItem = MarkerItem(createUUID(), "", "", geoPoint) @@ -235,14 +236,55 @@ open class MeasureLayerHandler(context: AppCompatActivity, mapView: NIMapView) : showAreaLayer() } + /** + * 绘制线回退点 + */ open fun drawLineBackspace() { -// if (mPathLayer != null && mPathLayer.getPoints().size > 0) { + if (mPathLayer.points.size > 0) { + val list: MutableList = java.util.ArrayList(mPathLayer.getPoints()) + val point = list[mPathLayer.points.size - 1] + list.remove(point) + mPathLayer.setPoints(list) + mMapView.vtmMap.animator().animateTo( + GeoPoint( + point.latitude, point.longitude + ) + ) + } + if (mPathMakers.size > 0) { + var item: MarkerItem? = mPathMakers[mPathMakers.size - 1] + markerLayer.removeItem(item) + mPathMakers.remove(item) + } + if (mPathMakers.size == 0 && mPathLayerTemp != null) { + mPathLayerTemp.clearPath() + } + editIndex = -1 + if (mPathLayerTemp != null) { + mPathLayerTemp.setStyle(newTempStyle) + } + if (mPathLayer.points.size > 1) { + val distance: Double = GeometryTools.getDistance(mPathLayer.points) + val bg = BigDecimal(distance) + val f1 = bg.setScale(3, BigDecimal.ROUND_HALF_UP).toDouble() + lineLengthLiveData.value = f1 + } else { + lineLengthLiveData.value = 0.000 + tempLineDistanceLiveData.value = "0米" + } + } + + /** + * 绘制面回退点 + */ + open fun drawPolygonBackspace() { +// if (mPathLayer.points.size > 0) { // val list: MutableList = java.util.ArrayList(mPathLayer.getPoints()) // val point = list[mPathLayer.getPoints().size - 1] // list.remove(point) // mPathLayer.setPoints(list) // mMapView.layerManager.jumpToPosition(point.longitude, point.latitude, 0) -// } else if (mPolygonLayer != null && mPolygonLayer.points.size > 0) { +// } else if (mPolygonLayer.points.size > 0) { // val list: MutableList = java.util.ArrayList(mPolygonLayer.points) // val point = list[mPolygonLayer.points.size - 1] // list.remove(point) @@ -321,7 +363,10 @@ open class MeasureLayerHandler(context: AppCompatActivity, mapView: NIMapView) : } } - open fun removeLine() { + /** + * 清除所有 + */ + fun clear() { bDrawLine = false editIndex = -1 markerLayer.removeAllItems() @@ -334,10 +379,8 @@ open class MeasureLayerHandler(context: AppCompatActivity, mapView: NIMapView) : mPathLayerTemp.isEnabled = false mPathLayerTemp.setStyle(newTempStyle) hideAreaLayer() - } - - fun clear() { - removeLine() + lineLengthLiveData.value = 0.000 + tempLineDistanceLiveData.value = "0米" mMapView.vtmMap.updateMap(true) } @@ -399,9 +442,11 @@ open class MeasureLayerHandler(context: AppCompatActivity, mapView: NIMapView) : bg.setScale(1, BigDecimal.ROUND_HALF_UP).toDouble() tempLineDistanceLiveData.value = "${f1}公里" } catch (e: Exception) { - Log.e("jingo",e.toString() + "$distance") + Log.e("jingo", e.toString() + "$distance") } } + } else { + tempLineDistanceLiveData.value = "0米" } } } diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/layers/OmdbTaskLinkLayer.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/layers/OmdbTaskLinkLayer.kt index 731a4570..0b82d09e 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/layers/OmdbTaskLinkLayer.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/layers/OmdbTaskLinkLayer.kt @@ -10,6 +10,7 @@ import org.locationtech.jts.geom.Geometry import org.oscim.layers.vector.VectorLayer import org.oscim.layers.vector.geometries.Drawable import org.oscim.layers.vector.geometries.LineDrawable +import org.oscim.layers.vector.geometries.PointDrawable import org.oscim.layers.vector.geometries.Style import org.oscim.map.Map @@ -86,4 +87,5 @@ class OmdbTaskLinkLayer(map: Map, private var style: Style) : VectorLayer(map) { clearSelectLine() update() } -} \ No newline at end of file +} + diff --git a/collect-library/src/main/res/raw/icon_task_link_marker.png b/collect-library/src/main/res/raw/icon_task_link_marker.png new file mode 100644 index 0000000000000000000000000000000000000000..d26f4dc3f58a8b2e637ad65cbced7446e1583a43 GIT binary patch literal 4735 zcmaJ_c{r5o-=D0RsW-w?-hLpiDgkg;RjGf9JQMRm+oh(_hL_&n@ zV+l!Q3E4t;$N8Pk@BQOF?{huRbKm#(`hGs&^}e3_dL9}ZUT0zCWdr~KEC^jK6lJtH zeg2@Mysy1br=kozL~V1T3ErOQjUiwG>UMY=ED+&>aloRm7&~A0ZmbdjKrQZQYECpq z8o+JwE?~^54%o-Vje-UMlvI7(Ft+!wM4%1U!O>M&c)hVj80cuHEPM-wltQ{`VsVbT zegv$EpP{L(-#uFeJ7HB7ppp-qLg0cWVt_s_&aNJCA7$acc;S@!sTd**{7Z#+Pg(ds zPMIT(ftq*%76=2&fo!FrGC+9+ury3T=9;V|P)15x4k9HBkyZdnL*bNLRtos{B}}nK zu(OAwv~>QqMOi5ebcu%6TFvZjVgy7=#53Q@m-)W*G4B~@vgGhs=PDA>wh(!MX zsxB`7XnPP**#G+be-e9``nq8uD69wGlVD3JoW01YDL1$#0gEBx38r|w^Y1JgNZ+A#UwSS`G*rwi7V_#12YU##rEVozJb#f@TF3rleH z!rJK&@Gii=LWev4yD!rJ%J(3RaCy(Rop7Xg5?D+n!hQ=f^|3|}`>Pxem53qn(2BIyWGa45rdb0N{3sdGZ&Ss@p! z0h~R9He-RKghG%$2=rb;@;P6zXqS)x=bMU1;DgO$~H@La507>x#1SlHS+WE~l> z^|eVJUnT`LxaEob+LY4U>u|7B9(c5J*NA)nk!0U{r&f8f5@mFvIR|RbM-t*~US6_{bRYp6bt+$r7Z+Rke$y`@m-L{=WVVa4Xg&m4 zZhbHqH5fhHfWIOco%+fdQCU*wGMx8t;6PgXyj6=zI24C2;@Pe#zV*#Xn>NX+;nMc! z{Vmhp$jLN$Ja1Em#;A757WYqb7T`nBob5?BJRD}>-;8#atT8gk^Ws-T70bDZ%80*L z49I<%(3hd0Szwr+mDm}31L0ozslBW+;QhfBYE^;wEFLMk^1!M->zdrLiW?%!>5sKC z8a#9JKctOybKdmZ6y{g{^J(mtuY*Z1W!ApwjqaCJ@%#)AqF8O`ys!ypHd7hP*Q8(m z*eG9Pq!XJ8Bo=`J=Bz?3R9^F}_iBEP$HvZK?aJm4to z-p1A7d*nu2`V9E@Sy*kQA$Ht1fId~IJ#w+D(zS{U^kSxIk5PZuAsD;Q z+>=mD{}$5#bKN7E5Y-}qsM&KR-Y3Vyxwjx}3A78j@$QrphqsVnC-l$Y7?`><3 zD-SLry;Z&#oj76(vV4^vETUtaX#YX<+yV;0;Bq`i4-Xs#FDtgfBQO_+6>t$#w}PEL zUVHC;(=4Q>qlxBBL+^brwfq)06ZmRNigDG-lP*<=wRKf5W8}?EWA<367hj3dgb1Uh-iL^+d5K=x4RD3n>nhC9OLxy*7~i22lqyV|PvVlO$eZS=~Eg!s-DE>JK54FXFGq2to*KuR?)w zFL#T}?Z!9Aj%M^-Qc>}2Z7w%+nd+iGa$KQly1at+>MOeW@}jz|Osn3K18lERH#|C+ zRfWv>#dGFQ&C_MRSa~}5dn7uN{>G?-JkCyGaeuIDar;+$T~fV zw^oe3y&0PsxC@W|S!P9|ZdxOm*U%8}I>LoX?N%&eE z&Q#b?^xnckO21oSS>KqA|L`Nw+feerBIhlV+hTh+%y7VCUA(z)G)c z%BRo4j~?1!wc@plIMCN55>y-$7XF|P@c%YdPh9x15Oj9Gl`i_cV}6ClclcviGtV;V zOJeDjhZR2X-G^6ktreJL0oE3hECiCJ9?HUvkkP~}4SQM(-7ML}VBap}k<7VSd^gmc zx}fho`S7XT)9v?}1o!j}W83SwpZShP#d;kOIF(F1zLupUOq=`!lm(+(_0WY6QQRsH ze^`hyJhfqZbg<)b*m1}zAjyTPQa!otO%|-&nT=+i*go28=oj4GXiuIRh*JXX$~ryV z(D;+pY%pQ`y!}3;{;|;QtAh{BS}q%n{Y+SIh4>vFcxLq=u3q`c*H5}yDu<6#> zeaL#`=<%b;-+zIHxcKJtM;@s24lm+YV5ib?otyNVE4=n8j3)GB!7`xDq}c>K1SzhR z)Tit>VB4>J-M`j3yV6K`VUV$RAL_toAN!FnVMkAYOL4%O&P#7vmp=R(FKFqZoD>3a zr@T>jbrkucm{61z6fn$OgtWCiVwZgyJl#AKkeE_dS%3C<5mZxovYQ1c^bz|cyP{?v z_qZ>TS;c8i2{fe9Rbx+<5r;@LuBnCca~CCE4=-ie#-(K<47QiTi;9YHBW>Yrf)Jk- zkhEC+v{t)YHM3v5-}##v&vg5KEXdWFAEOhJF0-#3OMdE0yvNO0JNMoz!gM6XpIs4e z^(uDPb<*CO8OE+!Vxe991k5@5Jr331o|1jX07T1CXw4jDcq5nfd|;zxW;AEy4w)RW zxJfIyztJ9KB#dU0qR|%%Gd#2OZ28gnL?W0WlDfs}H8-p>KTe{zzrg5gFIzF_4VX7s z`3xMas;spa$7B0# zuB(=$5U7%&NP^?k@0nkrBEIg-;;eW0qRYGAC6X*K8Q68sX{2^-jS4Q1H9zeCOmgK# z$o68Wk*W(k{CW<9!iqH)OV72S+R}FGs1$jcZyy&K9 zps6U&57Q_VZm>7S3o;&7P!OkbSfVe%o4R}$#8&b6F@NRt)| zFO0qQs>;dho_Vze&zW`c*xitxVU85XymD0(pFLVbubB(-Sw*|OZ_FRXu;Uk?s z`VD5ATrJ?#(CKHTi5jiwrNvD?3$cNO=-9G1q0l$k8@;^`RAc#7O8loLX}{jMCmPmx*~f^MjuNnw;aV>u?ug5K1>}@MCRfKVWF$ro$^?4*dNn zYf-f9`1d%io|heH^iuu^>m0YAdG(H4Fc;-;HZvZ=t>N#*A3q#SUFhHcEH-quBg!<# zBfMtB)OcFaui7|}UFtETqIYQJ!Oa|OiYUJ}t1vzYEPH0U(!;@$O5er!IcF2<&d94M zI}X-7?eK7~L(DI2Lo)vPWL_V$kb?cAkc&`GlYxx%pAO6+_nB*RJrRca`p#>aO?%Ib zMN|VMwA-bw(>0|y?aD{FTGTl!KiX2dQ79_!n)7s^rg+o)Z2)QQeNw|>MfS^IKd=@* zcPBsh1l=tExg=7#*?Cv1?)Aj@NkUsKUG?DHfSH8bu%?89`GB(fDWXQNb9mW(}M9&!S}{e|nZZbuQy}u;rS780)JgH__es94wFc__P(R zg1rr9{KVn$*RV!%onMW+Ty*wwlC1UDdgo6{sY>^_I+pDiI*}O`S4X4IY&;-6+$8L< z?sM4omo6Da9DGWorFCt2N~QzmR-83)8D8bVo|Cp#Ir`BPfw^e^=x%R@#I8((_*heQ z9l#!C)T9w!sEm7lYf*Sd<)E$pqH52R+IBUcPW}d-hUaK>{!Ihw2-XWLG2=Vfk&oaxD% zLMk@pP7uRAUs?TgM+MGju{IQ~Kd@T4ERei*QO>w8lG9M1A^t2f(4b}U4+0;D3>3L_ zzQds(g?23bUT3YnO%U~SSEYP(@0NR%-vBD4Iq~L1>U|95BAJ(wGOy9&D)p{bHdE85 z8d|))XnQMIITGM>$(=7Qj$8H49^a3vCUT%stIsNlqb_~@o6;EJ0 zDigYJrnFhASOK`5quhhlS&^Xv6aB=TJ^Cxim)q*vC_N`eKxVW}55rJCInoNu{bTOU7*XR^ILD zIS?H}iq}+PowDp3{k`#I4ceMQx{|l~Rj^E`-|MloTW92M>k81XceP^dt`j%fR>=|l z>KAC3(Yx@t>#Y~+2)+;Jj2Q8=eay$xukt| zoc`J8Jbv2d*J?r0lyfauT}2I*OBDyQs9ZMgF}VAx_p$Z;)K>9F{QE@=B{Yh|qvK;P zF|Z2FmP0Q<%O>vhypfpO?!fw5=M{eY=GE;ZJp+dCjC!D`jk Date: Fri, 14 Jul 2023 16:33:09 +0800 Subject: [PATCH 15/40] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- vtm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/vtm b/vtm index dd13e533..1ee201a4 160000 --- a/vtm +++ b/vtm @@ -1 +1 @@ -Subproject commit dd13e533c38b5738ab404c2737d7ccadeff01323 +Subproject commit 1ee201a41f78f169873848209a3f3bdac36f185a From 3883c934fcc65614f6420e1d5633ddf71e105993 Mon Sep 17 00:00:00 2001 From: qiji4215 Date: Fri, 14 Jul 2023 16:40:14 +0800 Subject: [PATCH 16/40] merge code --- .../omqs/ui/activity/map/MainViewModel.kt | 15 +++++++-------- .../{mipmap-xxhdpi => mipmap-hdpi}/icon_gps.png | Bin .../icon_gps_1.png | Bin .../icon_nilocation.png | Bin .../icon_nilocation_1.png | Bin 5 files changed, 7 insertions(+), 8 deletions(-) rename collect-library/src/main/res/{mipmap-xxhdpi => mipmap-hdpi}/icon_gps.png (100%) rename collect-library/src/main/res/{mipmap-xxhdpi => mipmap-hdpi}/icon_gps_1.png (100%) rename collect-library/src/main/res/{mipmap-xxhdpi => mipmap-hdpi}/icon_nilocation.png (100%) rename collect-library/src/main/res/{mipmap-xxhdpi => mipmap-hdpi}/icon_nilocation_1.png (100%) 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 427a2321..47c105fc 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 @@ -266,23 +266,22 @@ class MainViewModel @Inject constructor( location.taskId = id.toString() //增加间距判断 if (lastNiLocaion != null) { - val disance = GeometryTools.distanceToDouble( - GeoPoint(location.latitude, location.longitude), GeoPoint( - lastNiLocaion!!.latitude, lastNiLocaion!!.longitude - ) - ) - //相距差距大于0.5米以上进行存储 - if (disance > 0.5) { + val disance = GeometryTools.getDistance( + location.latitude, location.longitude, + lastNiLocaion!!.latitude, lastNiLocaion!!.longitude) + //相距差距大于2.5米以上进行存储 + if (disance > 2.5) { traceDataBase.niLocationDao.insert(location) mapController.markerHandle.addNiLocationMarkerItem(location) + mapController.mMapView.vtmMap.updateMap(true) } } else { traceDataBase.niLocationDao.insert(location) mapController.markerHandle.addNiLocationMarkerItem(location) + mapController.mMapView.vtmMap.updateMap(true) } lastNiLocaion = location - //mapController.mMapView.vtmMap.updateMap(true) } } //用于定位点捕捉道路 diff --git a/collect-library/src/main/res/mipmap-xxhdpi/icon_gps.png b/collect-library/src/main/res/mipmap-hdpi/icon_gps.png similarity index 100% rename from collect-library/src/main/res/mipmap-xxhdpi/icon_gps.png rename to collect-library/src/main/res/mipmap-hdpi/icon_gps.png diff --git a/collect-library/src/main/res/mipmap-xxhdpi/icon_gps_1.png b/collect-library/src/main/res/mipmap-hdpi/icon_gps_1.png similarity index 100% rename from collect-library/src/main/res/mipmap-xxhdpi/icon_gps_1.png rename to collect-library/src/main/res/mipmap-hdpi/icon_gps_1.png diff --git a/collect-library/src/main/res/mipmap-xxhdpi/icon_nilocation.png b/collect-library/src/main/res/mipmap-hdpi/icon_nilocation.png similarity index 100% rename from collect-library/src/main/res/mipmap-xxhdpi/icon_nilocation.png rename to collect-library/src/main/res/mipmap-hdpi/icon_nilocation.png diff --git a/collect-library/src/main/res/mipmap-xxhdpi/icon_nilocation_1.png b/collect-library/src/main/res/mipmap-hdpi/icon_nilocation_1.png similarity index 100% rename from collect-library/src/main/res/mipmap-xxhdpi/icon_nilocation_1.png rename to collect-library/src/main/res/mipmap-hdpi/icon_nilocation_1.png From eea7cb6fdf9d80d90a8809da441afed2cfb40e37 Mon Sep 17 00:00:00 2001 From: squallzhjch Date: Fri, 14 Jul 2023 16:41:39 +0800 Subject: [PATCH 17/40] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../omqs/http/taskupload/TaskUploadScope.kt | 35 ++++++------ .../EvaluationResultViewModel.kt | 57 +++++++++---------- .../library/data/entity/HadLinkDvoBean.kt | 6 +- .../library/data/entity/LinkInfoBean.kt | 5 +- 4 files changed, 51 insertions(+), 52 deletions(-) diff --git a/app/src/main/java/com/navinfo/omqs/http/taskupload/TaskUploadScope.kt b/app/src/main/java/com/navinfo/omqs/http/taskupload/TaskUploadScope.kt index 2da98af0..2de99031 100644 --- a/app/src/main/java/com/navinfo/omqs/http/taskupload/TaskUploadScope.kt +++ b/app/src/main/java/com/navinfo/omqs/http/taskupload/TaskUploadScope.kt @@ -77,7 +77,7 @@ class TaskUploadScope( taskBean.operationTime = DateTimeUtil.getNowDate().time uploadData.postValue(taskBean) //同步中不进行状态记录,只做界面变更显示 - if(status!=FileUploadStatus.UPLOADING){ + if (status != FileUploadStatus.UPLOADING) { launch { val realm = Realm.getDefaultInstance() realm.executeTransaction { @@ -118,7 +118,7 @@ class TaskUploadScope( val bodyList: MutableList = ArrayList() - if (taskBean.syncStatus == FileUploadStatus.WAITING){ + if (taskBean.syncStatus == FileUploadStatus.WAITING) { change(FileUploadStatus.UPLOADING) } @@ -126,7 +126,7 @@ class TaskUploadScope( val linkStatus = 1 //存在原因标记未测评 - if(hadLinkDvoBean.reason.isNotEmpty()){ + if (hadLinkDvoBean.reason.isNotEmpty()) { //未测评 val linkStatus = 0 @@ -156,23 +156,24 @@ class TaskUploadScope( bodyList.add(evaluationInfo) - }else{ + } else { val linkStatus = hadLinkDvoBean.linkStatus - var s: String = "%.3f".format(hadLinkDvoBean.linkLength)//保留一位小数(且支持四舍五入) + var s: String = "%.3f".format(hadLinkDvoBean.length)//保留一位小数(且支持四舍五入) - val objects = realm.where(QsRecordBean::class.java).equalTo("linkId", /*"84207223282277331"*/hadLinkDvoBean.linkPid).findAll() + val objects = realm.where(QsRecordBean::class.java) + .equalTo("linkId", /*"84207223282277331"*/hadLinkDvoBean.linkPid).findAll() - if (objects != null&&objects.size>0) { + if (objects != null && objects.size > 0) { val copyList = realm.copyFromRealm(objects) copyList.forEach { var problemType = 0 - if(it.problemType=="错误"){ + if (it.problemType == "错误") { problemType = 0 - }else if(it.problemType=="多余"){ + } else if (it.problemType == "多余") { problemType = 1 - }else if(it.problemType=="遗漏"){ + } else if (it.problemType == "遗漏") { problemType = 2 } var evaluationWay = 2 @@ -207,16 +208,16 @@ class TaskUploadScope( } - if(bodyList.size>0){ + if (bodyList.size > 0) { val result = uploadManager.netApi.postRequest(bodyList)// .enqueue(object : // Callback { if (result.isSuccessful) { - if (result.code() == 200&&result.body()!=null) { + if (result.code() == 200 && result.body() != null) { val defaultUserResponse = result.body() as DefaultResponse<*> - if(defaultUserResponse.success){ - change(FileUploadStatus.DONE,"上传成功") - }else{ - change(FileUploadStatus.ERROR,"${defaultUserResponse.msg}") + if (defaultUserResponse.success) { + change(FileUploadStatus.DONE, "上传成功") + } else { + change(FileUploadStatus.ERROR, "${defaultUserResponse.msg}") } } else { // handle the failure @@ -225,7 +226,7 @@ class TaskUploadScope( } else { change(FileUploadStatus.ERROR) } - }else{ + } else { change(FileUploadStatus.NONE) } } catch (e: Throwable) { diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt index 0532446b..0f3fc0ae 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt @@ -364,41 +364,39 @@ class EvaluationResultViewModel @Inject constructor( */ fun initData(id: String) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - viewModelScope.launch(Dispatchers.IO) { + viewModelScope.launch(Dispatchers.IO) { - Realm.getDefaultInstance().use { realm -> - realm.executeTransactionAsync { bgRealm -> - // find the item - val objects = - bgRealm.where(QsRecordBean::class.java).equalTo("id", id).findFirst() - if (objects != null) { - oldBean = bgRealm.copyFromRealm(objects) - oldBean?.let { - liveDataQsRecordBean.postValue(it.copy()) - val p = GeometryTools.createGeoPoint(it.geometry) - mapController.markerHandle.addMarker( - GeoPoint( - p.latitude, - p.longitude - ), markerTitle - ) + Realm.getDefaultInstance().use { realm -> + realm.executeTransactionAsync { bgRealm -> + // find the item + val objects = + bgRealm.where(QsRecordBean::class.java).equalTo("id", id).findFirst() + if (objects != null) { + oldBean = bgRealm.copyFromRealm(objects) + oldBean?.let { + liveDataQsRecordBean.postValue(it.copy()) + val p = GeometryTools.createGeoPoint(it.geometry) + mapController.markerHandle.addMarker( + GeoPoint( + p.latitude, + p.longitude + ), markerTitle + ) - //获取linkid - if (it.linkId.isNotEmpty()) { - viewModelScope.launch(Dispatchers.IO) { - val link = realmOperateHelper.queryLink(it.linkId) - link?.let { l -> - mapController.lineHandler.showLine(l.geometry) - } + //获取linkid + if (it.linkId.isNotEmpty()) { + viewModelScope.launch(Dispatchers.IO) { + val link = realmOperateHelper.queryLink(it.linkId) + link?.let { l -> + mapController.lineHandler.showLine(l.geometry) } } - liveDataQsRecordBean.value?.attachmentBeanList = - it.attachmentBeanList - // 显示语音数据到界面 - getChatMsgEntityList() } + liveDataQsRecordBean.value?.attachmentBeanList = + it.attachmentBeanList + // 显示语音数据到界面 + getChatMsgEntityList() } } } @@ -409,7 +407,6 @@ class EvaluationResultViewModel @Inject constructor( /** * 查询问题类型列表 */ - @RequiresApi(Build.VERSION_CODES.N) fun getChatMsgEntityList() { val chatMsgEntityList: MutableList = ArrayList() liveDataQsRecordBean.value?.attachmentBeanList?.forEach { diff --git a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/HadLinkDvoBean.kt b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/HadLinkDvoBean.kt index 06c7cdb8..3bfef3e0 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/HadLinkDvoBean.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/HadLinkDvoBean.kt @@ -32,5 +32,9 @@ open class HadLinkDvoBean @JvmOverloads constructor( /** * 详细属性 */ - var linkInfo: LinkInfoBean? = null + var linkInfo: LinkInfoBean? = null, + /** + * 长度(米) + */ + var length: Double = 0.000, ) : RealmObject() \ No newline at end of file diff --git a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/LinkInfoBean.kt b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/LinkInfoBean.kt index ab5b6f5e..7ad27675 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/LinkInfoBean.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/LinkInfoBean.kt @@ -18,10 +18,7 @@ open class LinkInfoBean @JvmOverloads constructor( * 数据的等级 */ var dataLevel: Int = 0, - /** - * 长度(米) - */ - var length: Double = 0.000, + /** * 备注信息 */ From e3695fb6cb0b98776c5d8163b2ebfff2f19945e6 Mon Sep 17 00:00:00 2001 From: squallzhjch Date: Fri, 14 Jul 2023 16:45:31 +0800 Subject: [PATCH 18/40] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt index 17cfbf74..87b32795 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt @@ -188,12 +188,12 @@ class TaskLinkViewModel @Inject constructor( // taskId = liveDataTaskBean.value!!.id, linkPid = UUID.randomUUID().toString(), linkStatus = 3, + length = mapController.measureLayerHandler.lineLengthLiveData.value!!, geometry = GeometryTools.getLineString(mapController.measureLayerHandler.mPathLayer.points), linkInfo = LinkInfoBean( kind = liveDataSelectKind.value!!.type, functionLevel = liveDataSelectFunctionLevel.value!!.type, dataLevel = liveDataSelectDataLevel.value!!.type, - length = mapController.measureLayerHandler.lineLengthLiveData.value!!, ) ) val task: TaskBean = liveDataTaskBean.value!! From 6210f41b691a06aba981972565f1a0b4e138d36e Mon Sep 17 00:00:00 2001 From: qiji4215 Date: Mon, 17 Jul 2023 14:49:21 +0800 Subject: [PATCH 19/40] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AE=A4=E5=86=85?= =?UTF-8?q?=E6=95=B4=E7=90=86=E5=B7=A5=E5=85=B7=E6=9B=B4=E6=96=B0=E4=BF=A1?= =?UTF-8?q?=E6=81=AF=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/navinfo/omqs/bean/QRCodeBean.kt | 2 +- .../navinfo/omqs/http/NetworkServiceImpl.kt | 11 +- .../omqs/http/RetrofitNetworkServiceAPI.kt | 4 +- .../omqs/http/taskupload/TaskUploadScope.kt | 19 ++- .../omqs/ui/activity/map/MainActivity.kt | 7 + .../omqs/ui/activity/scan/QRCodeViewModel.kt | 32 +++-- .../ui/fragment/console/ConsoleFragment.kt | 19 ++- .../personalcenter/PersonalCenterFragment.kt | 8 +- .../ui/fragment/tasklink/TaskLinkViewModel.kt | 4 +- .../ui/fragment/tasklist/TaskListAdapter.kt | 3 +- app/src/main/res/layout/activity_main.xml | 128 +++++++++--------- .../main/res/layout/connect_out_camera.xml | 1 + app/src/main/res/layout/console_off.xml | 2 +- .../main/res/menu/personal_center_menu.xml | 12 +- vtm | 2 +- 15 files changed, 155 insertions(+), 99 deletions(-) diff --git a/app/src/main/java/com/navinfo/omqs/bean/QRCodeBean.kt b/app/src/main/java/com/navinfo/omqs/bean/QRCodeBean.kt index 4790dd17..2438f705 100644 --- a/app/src/main/java/com/navinfo/omqs/bean/QRCodeBean.kt +++ b/app/src/main/java/com/navinfo/omqs/bean/QRCodeBean.kt @@ -2,5 +2,5 @@ package com.navinfo.omqs.bean data class QRCodeBean( var errcode: Int = -1, - var msg: String = "" + var errmsg: String = "" ) \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/http/NetworkServiceImpl.kt b/app/src/main/java/com/navinfo/omqs/http/NetworkServiceImpl.kt index 5bcd2782..e2ce3a7e 100644 --- a/app/src/main/java/com/navinfo/omqs/http/NetworkServiceImpl.kt +++ b/app/src/main/java/com/navinfo/omqs/http/NetworkServiceImpl.kt @@ -101,7 +101,16 @@ class NetworkServiceImpl @Inject constructor( //在IO线程中运行 withContext(Dispatchers.IO) { return@withContext try { - val result = netApi.retrofitUpdateServerInfo(url,indoorConnectionInfoBean) + val map: MutableMap = HashMap() + map["username"] = indoorConnectionInfoBean.username + map["uname"] = indoorConnectionInfoBean.uname + map["userid"] = indoorConnectionInfoBean.userid + map["plate"] = indoorConnectionInfoBean.plate + map["token"] = indoorConnectionInfoBean.token + map["baseurl"] = indoorConnectionInfoBean.baseurl + map["platform"] = indoorConnectionInfoBean.platform + + val result = netApi.retrofitUpdateServerInfo(url,map) if (result.isSuccessful) { if (result.code() == 200) { NetResult.Success(result.body()) diff --git a/app/src/main/java/com/navinfo/omqs/http/RetrofitNetworkServiceAPI.kt b/app/src/main/java/com/navinfo/omqs/http/RetrofitNetworkServiceAPI.kt index 2f56bbab..640c0e21 100644 --- a/app/src/main/java/com/navinfo/omqs/http/RetrofitNetworkServiceAPI.kt +++ b/app/src/main/java/com/navinfo/omqs/http/RetrofitNetworkServiceAPI.kt @@ -78,9 +78,9 @@ interface RetrofitNetworkServiceAPI { /** * 登录接口 */ - @Headers("Content-Type: application/json") + @FormUrlEncoded @POST - suspend fun retrofitUpdateServerInfo(@Url url: String,@Body indoorConnectionInfoBean: IndoorConnectionInfoBean): Response + suspend fun retrofitUpdateServerInfo(@Url url: String,@FieldMap map: Map): Response @Headers("Content-Type: application/json") @POST("/devcp/uploadSceneProblem") diff --git a/app/src/main/java/com/navinfo/omqs/http/taskupload/TaskUploadScope.kt b/app/src/main/java/com/navinfo/omqs/http/taskupload/TaskUploadScope.kt index 2de99031..19e28738 100644 --- a/app/src/main/java/com/navinfo/omqs/http/taskupload/TaskUploadScope.kt +++ b/app/src/main/java/com/navinfo/omqs/http/taskupload/TaskUploadScope.kt @@ -176,6 +176,19 @@ class TaskUploadScope( } else if (it.problemType == "遗漏") { problemType = 2 } + + var roadClassfcation = 0 + + var roadFunctionGrade = 0 + + var dataLevel = 0 + + if(hadLinkDvoBean.linkInfo!=null){ + roadClassfcation = hadLinkDvoBean.linkInfo!!.kind + roadFunctionGrade = hadLinkDvoBean.linkInfo!!.functionLevel + dataLevel = hadLinkDvoBean.linkInfo!!.dataLevel + } + var evaluationWay = 2 val evaluationInfo = EvaluationInfo( evaluationTaskId = taskBean.id.toString(), @@ -193,11 +206,11 @@ class TaskUploadScope( evaluatorName = it.checkUserId, evaluationDate = it.checkTime, evaluationWay = evaluationWay, - roadClassfcation = 1, - roadFunctionGrade = 3, + roadClassfcation = roadClassfcation, + roadFunctionGrade = roadFunctionGrade, noEvaluationreason = "", linkLength = s.toDouble(), - dataLevel = 3, + dataLevel = dataLevel, linstringLength = 0.0, ) 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 b84b5b45..9602f8d2 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 @@ -601,6 +601,13 @@ class MainActivity : BaseActivity() { } } + /** + * 显示轨迹回放布局 + */ + fun showIndoorDataLayout() { + binding.mainActivityMenuIndoorGroup.visibility = View.VISIBLE + } + /** * 路径规划 */ diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QRCodeViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QRCodeViewModel.kt index 36921971..1e82d3c7 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QRCodeViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QRCodeViewModel.kt @@ -9,14 +9,10 @@ import androidx.lifecycle.viewModelScope import com.navinfo.omqs.Constant import com.navinfo.omqs.bean.IndoorConnectionInfoBean import com.navinfo.omqs.bean.QRCodeBean -import com.navinfo.omqs.bean.SysUserBean -import com.navinfo.omqs.http.DefaultResponse import com.navinfo.omqs.http.NetResult import com.navinfo.omqs.http.NetworkService -import com.navinfo.omqs.ui.activity.login.LoginStatus import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.Job import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import java.io.IOException @@ -99,11 +95,14 @@ class QrCodeViewModel @Inject constructor( Toast.LENGTH_LONG ).show() } + + updateServerInfo(context) + } else { withContext(Dispatchers.Main) { Toast.makeText( context, - "${defaultUserResponse.msg}", + "${defaultUserResponse.errmsg}", Toast.LENGTH_SHORT ) .show() @@ -165,17 +164,20 @@ class QrCodeViewModel @Inject constructor( viewModelScope.launch(Dispatchers.Default) { val url = "http://${Constant.INDOOR_IP}:8080/sensor/service/connection" + + + val indoorConnectionInfoBean = IndoorConnectionInfoBean( + Constant.USER_ID, + Constant.USER_ID, + Constant.USER_ID, + "eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE2ODk2MjI5MjQsInVzZXJJZCI6IjEwNCIsImlhdCI6MTY4OTU3MjUyNCwidXNlcm5hbWUiOiJ3ZWl3ZWlsaW4wMDEwNCJ9.9WUqOhme8Yi_2xRBKMMe0ihb_yR1uwTqWTdZfZ7dMtE", + "http://fastmap.navinfo.com/onemap", + Constant.USER_ID, + "Android" + ) when (val result = networkService.updateServerInfo( url = url, - indoorConnectionInfoBean = IndoorConnectionInfoBean( - Constant.USER_ID, - Constant.USER_ID, - Constant.USER_ID, - Constant.USER_ID, - com.navinfo.collect.library.system.Constant.SERVER_ADDRESS, - Constant.USER_ID, - "Android" - ) + indoorConnectionInfoBean = indoorConnectionInfoBean )) { is NetResult.Success<*> -> { @@ -198,7 +200,7 @@ class QrCodeViewModel @Inject constructor( withContext(Dispatchers.Main) { Toast.makeText( context, - "${defaultUserResponse.msg}", + "${defaultUserResponse.errmsg}", Toast.LENGTH_SHORT ) .show() diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/console/ConsoleFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/console/ConsoleFragment.kt index 3318c4c6..3cb56387 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/console/ConsoleFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/console/ConsoleFragment.kt @@ -193,14 +193,29 @@ class ConsoleFragment : BaseFragment(), OnClickListener { R.id.console_personal_center_bg, R.id.console_personal_center_icon_bg -> { if (sceneFlag) { mFragment = PersonalCenterFragment { - TransitionManager.go(aScene, aTransition) + if(it){ + activity?.let { a -> + a.supportFragmentManager.beginTransaction().remove(this).commit() + (a as MainActivity).showIndoorDataLayout() + } + }else{ + TransitionManager.go(aScene, aTransition) + } + } sceneFlag = false TransitionManager.go(bScene, bTransition) } else { if (mFragment !is PersonalCenterFragment) { mFragment = PersonalCenterFragment { - TransitionManager.go(aScene, aTransition) + if(it){ + activity?.let { a -> + a.supportFragmentManager.beginTransaction().remove(this).commit() + (a as MainActivity).showIndoorDataLayout() + } + }else{ + TransitionManager.go(aScene, aTransition) + } } childFragmentManager.beginTransaction().replace(fragmentId, mFragment!!) .commit() 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 8ca20c4a..81eef41b 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 @@ -15,14 +15,17 @@ import com.blankj.utilcode.util.UriUtils import com.github.k1rakishou.fsaf.FileChooser import com.github.k1rakishou.fsaf.callback.FSAFActivityCallbacks import com.github.k1rakishou.fsaf.callback.FileChooserCallback +import com.navinfo.collect.library.data.entity.TaskBean import com.navinfo.collect.library.map.NIMapController import com.navinfo.omqs.R 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.activity.map.MainActivity import com.navinfo.omqs.ui.fragment.BaseFragment import com.navinfo.omqs.ui.activity.scan.QrCodeActivity +import com.navinfo.omqs.ui.fragment.console.ConsoleFragment import com.permissionx.guolindev.PermissionX import dagger.hilt.android.AndroidEntryPoint import org.oscim.core.GeoPoint @@ -32,7 +35,7 @@ import javax.inject.Inject * 个人中心 */ @AndroidEntryPoint -class PersonalCenterFragment(private var backListener: (() -> Unit?)? = null) : BaseFragment(), +class PersonalCenterFragment(private var indoorDataListener: ((Boolean) -> Unit?)? = null) : BaseFragment(), FSAFActivityCallbacks { private var _binding: FragmentPersonalCenterBinding? = null @@ -137,6 +140,9 @@ class PersonalCenterFragment(private var backListener: (() -> Unit?)? = null) : //跳转二维码扫描界面 checkPermission() } + R.id.personal_center_menu_scan_indoor_data -> { + indoorDataListener?.invoke(true) + } } true } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt index 17cfbf74..7eeb625a 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt @@ -193,8 +193,8 @@ class TaskLinkViewModel @Inject constructor( kind = liveDataSelectKind.value!!.type, functionLevel = liveDataSelectFunctionLevel.value!!.type, dataLevel = liveDataSelectDataLevel.value!!.type, - length = mapController.measureLayerHandler.lineLengthLiveData.value!!, - ) + ), + length = mapController.measureLayerHandler.lineLengthLiveData.value!!, ) val task: TaskBean = liveDataTaskBean.value!! task.hadLinkDvoList.add(linkBean) diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt index ab16a1cc..f7f7e3a8 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt @@ -241,8 +241,9 @@ class TaskListAdapter( FileUploadStatus.DONE -> { binding.taskUploadBtn.stopAnimator() binding.taskUploadBtn.setText("已上传") + binding.taskUploadBtn.isEnabled = false binding.taskUploadBtn.setProgress(0) - binding.taskUploadBtn.setBackgroundColor(binding.root.resources.getColor(R.color.ripple_end_color)) + binding.taskUploadBtn.setBackgroundColor(binding.root.resources.getColor(R.color.gray_121)) } FileUploadStatus.ERROR -> { diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index d6c4333f..a0c3c0ee 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -165,72 +165,6 @@ android:onClick="@{()->mainActivity.onClickMenu()}" /> - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + android:title="扫码连电脑" /> + + android:title="版本:ONE_QE_V1.2.0_20230707_A" /> diff --git a/vtm b/vtm index 1ee201a4..dd13e533 160000 --- a/vtm +++ b/vtm @@ -1 +1 @@ -Subproject commit 1ee201a41f78f169873848209a3f3bdac36f185a +Subproject commit dd13e533c38b5738ab404c2737d7ccadeff01323 From 694ad106d7f8e1e18afcd377a889681210cf4196 Mon Sep 17 00:00:00 2001 From: qiji4215 Date: Tue, 18 Jul 2023 10:11:34 +0800 Subject: [PATCH 20/40] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=9C=B0=E5=9B=BE?= =?UTF-8?q?=E5=8D=A1=E9=A1=BF=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/navinfo/omqs/Constant.kt | 2 +- .../omqs/ui/activity/map/MainActivity.kt | 104 +++++- .../omqs/ui/activity/map/MainViewModel.kt | 341 +++++++++++------- app/src/main/res/layout/activity_main.xml | 17 +- .../collect/library/utils/GeometryTools.java | 4 +- 5 files changed, 313 insertions(+), 155 deletions(-) diff --git a/app/src/main/java/com/navinfo/omqs/Constant.kt b/app/src/main/java/com/navinfo/omqs/Constant.kt index 27fb6278..f67ca0a6 100644 --- a/app/src/main/java/com/navinfo/omqs/Constant.kt +++ b/app/src/main/java/com/navinfo/omqs/Constant.kt @@ -55,7 +55,7 @@ class Constant { /** * 室内整理工具IP */ - lateinit var INDOOR_IP: String + var INDOOR_IP: String = "" const val DEBUG = true 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 9602f8d2..f2e296c2 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 @@ -106,6 +106,7 @@ class MainActivity : BaseActivity() { } //点击详细信息 + @RequiresApi(Build.VERSION_CODES.N) override fun onMoreInfoClick(selectTag: String, tag: String, signBean: SignBean) { viewModel.showSignMoreInfo(signBean.renderEntity) val fragment = @@ -146,7 +147,7 @@ class MainActivity : BaseActivity() { } - @RequiresApi(Build.VERSION_CODES.M) + @RequiresApi(Build.VERSION_CODES.N) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -175,7 +176,7 @@ class MainActivity : BaseActivity() { //给xml传递viewModel对象 binding.viewModel = viewModel - binding.mainActivityVoice.setOnTouchListener { v, event -> + binding.mainActivityVoice.setOnTouchListener { v, event -> when (event?.action) { MotionEvent.ACTION_DOWN -> { voiceOnTouchStart()//Do Something @@ -225,7 +226,9 @@ class MainActivity : BaseActivity() { //捕捉列表变化回调 viewModel.liveDataNILocationList.observe(this) { - Toast.makeText(this,"轨迹被点击了",Toast.LENGTH_LONG).show() + if(viewModel.isSelectTrace()){ + Toast.makeText(this,"轨迹被点击了",Toast.LENGTH_LONG).show() + } } //右上角菜单是否被点击 @@ -372,7 +375,7 @@ class MainActivity : BaseActivity() { mapController.mMapView.onPause() } - @RequiresApi(Build.VERSION_CODES.M) + @RequiresApi(Build.VERSION_CODES.N) override fun onDestroy() { super.onDestroy() viewModel.speakMode?.shutdown() @@ -403,7 +406,7 @@ class MainActivity : BaseActivity() { /** * 打开相机预览 */ - @RequiresApi(Build.VERSION_CODES.M) + @RequiresApi(Build.VERSION_CODES.N) fun openCamera() { //显示轨迹图层 viewModel.onClickCameraButton(this) @@ -412,7 +415,7 @@ class MainActivity : BaseActivity() { /** * 开关菜单 */ - @RequiresApi(Build.VERSION_CODES.M) + @RequiresApi(Build.VERSION_CODES.N) fun onClickMenu() { //显示菜单图层 viewModel.onClickMenu() @@ -520,11 +523,82 @@ class MainActivity : BaseActivity() { /** * 点击线选择 */ + @RequiresApi(Build.VERSION_CODES.N) fun selectLineOnclick() { viewModel.setSelectRoad(!viewModel.isSelectRoad()) binding.mainActivitySelectLine.isSelected = viewModel.isSelectRoad() } + /** + * 点击线选择 + */ + @RequiresApi(Build.VERSION_CODES.N) + fun tracePointsOnclick() { + viewModel.setSelectTrace(!viewModel.isSelectTrace()) + if(viewModel.isSelectTrace()){ + Toast.makeText(this,"请选择轨迹点!",Toast.LENGTH_LONG).show() + } + binding.mainActivityTraceSnapshotPoints.isSelected = viewModel.isSelectTrace() + } + + /** + * 点击结束轨迹操作 + */ + @RequiresApi(Build.VERSION_CODES.N) + fun finishTraceOnclick() { + setIndoorGroupEnable(false) + viewModel.setSelectTrace(false) + viewModel.setMediaFlag(false) + viewModel.setSelectPauseTrace(false) + binding.mainActivityTraceSnapshotPoints.isSelected = viewModel.isSelectTrace() + binding.mainActivitySnapshotMediaFlag.isSelected = viewModel.isMediaFlag() + binding.mainActivitySnapshotPause.isSelected = viewModel.isSelectPauseTrace() + } + + /** + * 点击结束轨迹操作 + */ + @RequiresApi(Build.VERSION_CODES.N) + fun mediaFlagOnclick() { + viewModel.setMediaFlag(!viewModel.isMediaFlag()) + binding.mainActivitySnapshotMediaFlag.isSelected = viewModel.isMediaFlag() + } + + /** + * 点击上一个轨迹点播放操作 + */ + @RequiresApi(Build.VERSION_CODES.N) + fun rewindTraceOnclick() { + pasePlayTrace() + } + + /** + * 点击暂停播放轨迹操作 + */ + @RequiresApi(Build.VERSION_CODES.N) + fun pauseTraceOnclick() { + viewModel.setSelectPauseTrace(!viewModel.isSelectPauseTrace()) + binding.mainActivitySnapshotPause.isSelected = viewModel.isSelectPauseTrace() + viewModel.setSelectTrace(false) + binding.mainActivityTraceSnapshotPoints.isSelected = viewModel.isSelectTrace() + } + + /** + * 点击下一个轨迹点 + */ + @RequiresApi(Build.VERSION_CODES.N) + fun nextTraceOnclick() { + pasePlayTrace() + } + + @RequiresApi(Build.VERSION_CODES.N) + fun pasePlayTrace() { + viewModel.setSelectTrace(false) + binding.mainActivityTraceSnapshotPoints.isSelected = viewModel.isSelectTrace() + viewModel.setSelectPauseTrace(false) + binding.mainActivitySnapshotPause.isSelected = viewModel.isSelectPauseTrace() + } + /** * 打开或关闭底部导航栏 @@ -548,7 +622,7 @@ class MainActivity : BaseActivity() { .animateTo(GeoPoint( mapController.mMapView.vtmMap.mapPosition.geoPoint.latitude,mapController.mMapView.vtmMap.mapPosition.geoPoint.longitude)) } - @RequiresApi(Build.VERSION_CODES.M) + @RequiresApi(Build.VERSION_CODES.N) private fun voiceOnTouchStart() { viewModel.startSoundMetter(this, binding.mainActivityVoice) } @@ -606,6 +680,20 @@ class MainActivity : BaseActivity() { */ fun showIndoorDataLayout() { binding.mainActivityMenuIndoorGroup.visibility = View.VISIBLE + if(Constant.INDOOR_IP.isNotEmpty()){ + setIndoorGroupEnable(true) + }else{ + setIndoorGroupEnable(false) + } + } + + private fun setIndoorGroupEnable(enable: Boolean){ + binding.mainActivitySnapshotFinish.isEnabled = enable + binding.mainActivityTraceSnapshotPoints.isEnabled = enable + binding.mainActivitySnapshotMediaFlag.isEnabled = enable + binding.mainActivitySnapshotRewind.isEnabled = enable + binding.mainActivitySnapshotPause.isEnabled = enable + binding.mainActivitySnapshotNext.isEnabled = enable } /** @@ -638,7 +726,7 @@ class MainActivity : BaseActivity() { /** * 打开道路名称属性看板,选择的道路在viewmodel里记录,不用 */ - @RequiresApi(Build.VERSION_CODES.M) + @RequiresApi(Build.VERSION_CODES.N) fun openRoadNameFragment() { if (viewModel.liveDataRoadName.value != null) { viewModel.showSignMoreInfo(viewModel.liveDataRoadName.value!!) 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 7ceac270..39421580 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 @@ -63,6 +63,7 @@ import javax.inject.Inject * 创建Activity全局viewmode */ +@RequiresApi(Build.VERSION_CODES.N) @HiltViewModel class MainViewModel @Inject constructor( private val mapController: NIMapController, @@ -113,6 +114,7 @@ class MainViewModel @Inject constructor( var menuState: Boolean = false + var captureLinkState: Boolean = false val liveDataMenuState = MutableLiveData() @@ -123,6 +125,21 @@ class MainViewModel @Inject constructor( */ private var bSelectRoad = false + /** + * 是不是选择轨迹点 + */ + private var bSelectTrace = false + + /** + * 是不是选择标题标识 + */ + private var isMediaFlag = false + + /** + * 是不是暂停 + */ + private var bSelectPauseTrace = false + private var linkIdCache = "" private var lastNiLocaion: NiLocation? = null @@ -158,11 +175,11 @@ class MainViewModel @Inject constructor( mapController.onMapClickFlow.collectLatest { // testPoint = it //线选择状态 - if (bSelectRoad) { +/* if (bSelectRoad) { captureLink(it) } else { captureItem(it) - } + }*/ } } viewModelScope.launch(Dispatchers.IO) { @@ -235,59 +252,64 @@ class MainViewModel @Inject constructor( /** * 初始化定位信息 */ + @RequiresApi(Build.VERSION_CODES.N) private fun initLocation() { //用于定位点存储到数据库 viewModelScope.launch(Dispatchers.Default) { mapController.locationLayerHandler.niLocationFlow.collect { location -> - val geometry = GeometryTools.createGeometry( - GeoPoint( - location.latitude, location.longitude + + //过滤掉无效点 + if(!GeometryTools.isCheckError(location.longitude,location.latitude)){ + val geometry = GeometryTools.createGeometry( + GeoPoint( + location.latitude, location.longitude + ) ) - ) - val tileX = RealmSet() - GeometryToolsKt.getTileXByGeometry(geometry.toString(), tileX) - val tileY = RealmSet() - GeometryToolsKt.getTileYByGeometry(geometry.toString(), tileY) + val tileX = RealmSet() + GeometryToolsKt.getTileXByGeometry(geometry.toString(), tileX) + val tileY = RealmSet() + GeometryToolsKt.getTileYByGeometry(geometry.toString(), tileY) - //遍历存储tile对应的x与y的值 - tileX.forEach { x -> - tileY.forEach { y -> - location.tilex = x - location.tiley = y + //遍历存储tile对应的x与y的值 + tileX.forEach { x -> + tileY.forEach { y -> + location.tilex = x + location.tiley = y + } } - } - location.groupId = uuid - try { - location.timeStamp = DateTimeUtil.getTime(location.time).toString() - } catch (e: Exception) { + location.groupId = uuid + try { + location.timeStamp = DateTimeUtil.getTime(location.time).toString() + } catch (e: Exception) { - } - val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) - location.taskId = id.toString() - //增加间距判断 - if (lastNiLocaion != null) { - val disance = GeometryTools.getDistance( - location.latitude, location.longitude, - lastNiLocaion!!.latitude, lastNiLocaion!!.longitude) - //相距差距大于2.5米以上进行存储 - if (disance > 2.5) { + } + val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) + location.taskId = id.toString() + //增加间距判断 + if (lastNiLocaion != null) { + val disance = GeometryTools.getDistance( + location.latitude, location.longitude, + lastNiLocaion!!.latitude, lastNiLocaion!!.longitude) + //相距差距大于2.5米以上进行存储 + if (disance > 2.5) { + traceDataBase.niLocationDao.insert(location) +/* mapController.markerHandle.addNiLocationMarkerItem(location) + mapController.mMapView.vtmMap.updateMap(true)*/ + lastNiLocaion = location + } + } else { traceDataBase.niLocationDao.insert(location) - mapController.markerHandle.addNiLocationMarkerItem(location) - mapController.mMapView.vtmMap.updateMap(true) +/* mapController.markerHandle.addNiLocationMarkerItem(location) + mapController.mMapView.vtmMap.updateMap(true)*/ + lastNiLocaion = location } - } else { - traceDataBase.niLocationDao.insert(location) - mapController.markerHandle.addNiLocationMarkerItem(location) - mapController.mMapView.vtmMap.updateMap(true) } - - lastNiLocaion = location } } //用于定位点捕捉道路 viewModelScope.launch(Dispatchers.Default) { mapController.locationLayerHandler.niLocationFlow.collectLatest { location -> - if (!isSelectRoad()) captureLink( + if (!isSelectRoad()&&!GeometryTools.isCheckError(location.longitude,location.latitude)) captureLink( GeoPoint( location.latitude, location.longitude @@ -311,101 +333,114 @@ class MainViewModel @Inject constructor( /** * 捕获道路和面板 */ + @RequiresApi(Build.VERSION_CODES.N) private suspend fun captureLink(point: GeoPoint) { - - val linkList = realmOperateHelper.queryLink( - point = point, - ) - var hisRoadName = false - if (linkList.isNotEmpty()) { - //看板数据 - val signList = mutableListOf() - val topSignList = mutableListOf() - mapController.lineHandler.linksLayer.clear() - - val link = linkList[0] - - val linkId = link.properties[RenderEntity.Companion.LinkTable.linkPid] - - if (linkIdCache != linkId) { - - mapController.lineHandler.showLine(link.geometry) - linkId?.let { - var elementList = realmOperateHelper.queryLinkByLinkPid(it) - for (element in elementList) { - - if (element.code == 2011) { - hisRoadName = true - liveDataRoadName.postValue(element) - continue - } - - val distance = GeometryTools.distanceToDouble( - point, GeometryTools.createGeoPoint(element.geometry) - ) - - val signBean = SignBean( - iconId = SignUtil.getSignIcon(element), - iconText = SignUtil.getSignIconText(element), - distance = distance.toInt(), - linkId = linkId, - name = SignUtil.getSignNameText(element), - bottomRightText = SignUtil.getSignBottomRightText(element), - renderEntity = element, - isMoreInfo = SignUtil.isMoreInfo(element), - index = SignUtil.getRoadInfoIndex(element) - ) - Log.e("jingo", "捕捉到的数据code ${element.code}") - when (element.code) { - //车道数,种别,功能等级,线限速,道路方向 - 2041, 2008, 2002, 2019, 2010 -> topSignList.add( - signBean - ) - - 4002, 4003, 4004, 4010, 4022, 4601 -> signList.add( - signBean - ) - } - - } - - val realm = Realm.getDefaultInstance() - val entity = realm.where(RenderEntity::class.java) - .equalTo("table", "OMDB_RESTRICTION").and().equalTo( - "properties['linkIn']", it - ).findFirst() - if (entity != null) { - val outLink = entity.properties["linkOut"] - val linkOutEntity = realm.where(RenderEntity::class.java) - .equalTo("table", "OMDB_RD_LINK").and().equalTo( - "properties['${RenderEntity.Companion.LinkTable.linkPid}']", - outLink - ).findFirst() - if (linkOutEntity != null) { - mapController.lineHandler.linksLayer.addLine( - linkOutEntity.geometry, 0x7DFF0000 - ) - } - } - } - - liveDataTopSignList.postValue(topSignList.distinctBy { it.name } - .sortedBy { it.index }) - - liveDataSignList.postValue(signList.sortedBy { it.distance }) - val speechText = SignUtil.getRoadSpeechText(topSignList) - withContext(Dispatchers.Main) { - speakMode?.speakText(speechText) - } - linkIdCache = linkId ?: "" - } - } else { - mapController.lineHandler.removeLine() - linkIdCache = "" + if(captureLinkState){ + return } - //如果没有捕捉到道路名 - if (!hisRoadName) { - liveDataRoadName.postValue(null) + + try{ + captureLinkState = true + + val linkList = realmOperateHelper.queryLink( + point = point, + ) + var hisRoadName = false + if (linkList.isNotEmpty()) { + //看板数据 + val signList = mutableListOf() + val topSignList = mutableListOf() + mapController.lineHandler.linksLayer.clear() + + val link = linkList[0] + + val linkId = link.properties[RenderEntity.Companion.LinkTable.linkPid] + + if (linkIdCache != linkId) { + + mapController.lineHandler.showLine(link.geometry) + linkId?.let { + var elementList = realmOperateHelper.queryLinkByLinkPid(it) + for (element in elementList) { + + if (element.code == 2011) { + hisRoadName = true + liveDataRoadName.postValue(element) + continue + } + + val distance = GeometryTools.distanceToDouble( + point, GeometryTools.createGeoPoint(element.geometry) + ) + + val signBean = SignBean( + iconId = SignUtil.getSignIcon(element), + iconText = SignUtil.getSignIconText(element), + distance = distance.toInt(), + linkId = linkId, + name = SignUtil.getSignNameText(element), + bottomRightText = SignUtil.getSignBottomRightText(element), + renderEntity = element, + isMoreInfo = SignUtil.isMoreInfo(element), + index = SignUtil.getRoadInfoIndex(element) + ) + Log.e("jingo", "捕捉到的数据code ${element.code}") + when (element.code) { + //车道数,种别,功能等级,线限速,道路方向 + 2041, 2008, 2002, 2019, 2010 -> topSignList.add( + signBean + ) + + 4002, 4003, 4004, 4010, 4022, 4601 -> signList.add( + signBean + ) + } + + } + + val realm = Realm.getDefaultInstance() + val entity = realm.where(RenderEntity::class.java) + .equalTo("table", "OMDB_RESTRICTION").and().equalTo( + "properties['linkIn']", it + ).findFirst() + if (entity != null) { + val outLink = entity.properties["linkOut"] + val linkOutEntity = realm.where(RenderEntity::class.java) + .equalTo("table", "OMDB_RD_LINK").and().equalTo( + "properties['${RenderEntity.Companion.LinkTable.linkPid}']", + outLink + ).findFirst() + if (linkOutEntity != null) { + mapController.lineHandler.linksLayer.addLine( + linkOutEntity.geometry, 0x7DFF0000 + ) + } + } + } + + liveDataTopSignList.postValue(topSignList.distinctBy { it.name } + .sortedBy { it.index }) + + liveDataSignList.postValue(signList.sortedBy { it.distance }) + val speechText = SignUtil.getRoadSpeechText(topSignList) + withContext(Dispatchers.Main) { + speakMode?.speakText(speechText) + } + linkIdCache = linkId ?: "" + } + } else { + mapController.lineHandler.removeLine() + linkIdCache = "" + } + //如果没有捕捉到道路名 + if (!hisRoadName) { + liveDataRoadName.postValue(null) + } + + }catch (e:Exception){ + + }finally { + captureLinkState = false } } @@ -588,6 +623,48 @@ class MainViewModel @Inject constructor( return bSelectRoad } + /** + * 开启轨迹选择 + */ + fun setSelectTrace(select: Boolean) { + bSelectTrace = select + } + + /** + * 是否开启了轨迹选择 + */ + fun isSelectTrace(): Boolean { + return bSelectTrace + } + + /** + * 开启媒体标识 + */ + fun setMediaFlag(select: Boolean) { + isMediaFlag = select + } + + /** + * 是否开启了媒体标识 + */ + fun isMediaFlag(): Boolean { + return isMediaFlag + } + + /** + * 开启轨迹选择 + */ + fun setSelectPauseTrace(select: Boolean) { + bSelectPauseTrace = select + } + + /** + * 是否开启了轨迹选择 + */ + fun isSelectPauseTrace(): Boolean { + return bSelectPauseTrace + } + /** * 要展示的要素详细信息 */ diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index a0c3c0ee..cdc5c529 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -350,43 +350,36 @@ 180 || lon < -180 || lat > 90 || lat < -90) { return true; From dfbea188eab834fdd6c81d1f267b7e405ae3bb3c Mon Sep 17 00:00:00 2001 From: qiji4215 Date: Tue, 18 Jul 2023 10:43:41 +0800 Subject: [PATCH 21/40] merge code --- .../omqs/ui/activity/map/MainViewModel.kt | 10 +++--- .../library/map/handler/MarkHandler.kt | 35 ++++++------------- 2 files changed, 15 insertions(+), 30 deletions(-) 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 39421580..6a0b84ab 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 @@ -81,7 +81,7 @@ class MainViewModel @Inject constructor( val liveDataNoteIdList = MutableLiveData>() //地图点击捕捉到的轨迹列表 - val liveDataNILocationList = MutableLiveData>() + val liveDataNILocationList = MutableLiveData() //左侧看板数据 val liveDataSignList = MutableLiveData>() @@ -163,8 +163,8 @@ class MainViewModel @Inject constructor( liveDataNoteIdList.value = list } - override fun onNiLocationList(list: MutableList) { - liveDataNILocationList.value = list + override fun onNiLocation(item: NiLocation) { + liveDataNILocationList.value = item } }) @@ -293,8 +293,8 @@ class MainViewModel @Inject constructor( //相距差距大于2.5米以上进行存储 if (disance > 2.5) { traceDataBase.niLocationDao.insert(location) -/* mapController.markerHandle.addNiLocationMarkerItem(location) - mapController.mMapView.vtmMap.updateMap(true)*/ + mapController.markerHandle.addNiLocationMarkerItem(location) + mapController.mMapView.vtmMap.updateMap(true) lastNiLocaion = location } } else { diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt index 26c97517..d82d9b52 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt @@ -157,7 +157,7 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : /** * 评测数据marker 图层 */ - private val niLocationItemizedLayer: MyItemizedLayer by lazy { + private val niLocationItemizedLayer: ItemizedLayer by lazy { niLocationBitmap = AndroidBitmap(BitmapFactory.decodeResource(context.resources, R.mipmap.icon_gps)) @@ -172,39 +172,24 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : ) ) - val layer = MyItemizedLayer( - mMapView.vtmMap, + val layer = ItemizedLayer( + mapView.vtmMap, mutableListOf(), markerRendererFactory, - object : MyItemizedLayer.OnItemGestureListener { - override fun onItemSingleTapUp( - list: MutableList, - nearest: Int - ): Boolean { + object : OnItemGestureListener { + override fun onItemSingleTapUp(index: Int, item: MarkerInterface?): Boolean { itemListener?.let { - val idList = mutableListOf() - if (list.size == 0) { - } else { - for (i in list) { - val markerInterface: MarkerInterface = - niLocationItemizedLayer.itemList[i] - if (markerInterface is MarkerItem) { - idList.add(markerInterface.uid as NiLocation) - } - } - it.onNiLocationList(idList.distinct().toMutableList()) - } + it.onNiLocation((niLocationItemizedLayer.itemList[index] as MarkerItem).uid as NiLocation) } return true } - override fun onItemLongPress( - list: MutableList?, - nearest: Int - ): Boolean { + override fun onItemLongPress(index: Int, item: MarkerInterface?): Boolean { return true } + }) + addLayer(layer, NIMapView.LAYER_GROUPS.OPERATE_MARKER) layer } @@ -814,5 +799,5 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : interface OnQsRecordItemClickListener { fun onQsRecordList(list: MutableList) fun onNoteList(list: MutableList) - fun onNiLocationList(list: MutableList) + fun onNiLocation(it: NiLocation) } From 45e3e3ca0ddf2b0202a1ca305dbf8d8c15f6fc15 Mon Sep 17 00:00:00 2001 From: squallzhjch Date: Tue, 18 Jul 2023 10:49:56 +0800 Subject: [PATCH 22/40] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=9C=B0=E5=9B=BE?= =?UTF-8?q?=E5=8D=A1=E9=A1=BF=20=E4=BF=AE=E6=94=B9=E6=96=B0=E5=A2=9Elink?= =?UTF-8?q?=E7=BA=BF=E5=9E=8B=E7=BC=96=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../omqs/ui/activity/map/MainActivity.kt | 18 ++- .../omqs/ui/activity/map/MainViewModel.kt | 51 ++++--- .../EvaluationResultViewModel.kt | 3 +- .../ui/fragment/tasklink/TaskLinkFragment.kt | 12 ++ .../ui/fragment/tasklink/TaskLinkViewModel.kt | 141 ++++++++++++++++-- .../src/main/assets/editormarker.xml | 2 +- .../library/data/entity/HadLinkDvoBean.kt | 10 +- .../collect/library/map/NIMapController.kt | 1 - .../library/map/handler/BaseHandler.kt | 5 +- .../library/map/handler/LineHandler.kt | 12 ++ .../map/handler/LocationLayerHandler.kt | 11 +- .../library/map/handler/MarkHandler.kt | 96 ++++++------ .../map/handler/MeasureLayerHandler.kt | 28 +++- .../library/map/layers/OmdbTaskLinkLayer.kt | 3 +- 14 files changed, 298 insertions(+), 95 deletions(-) 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 b84b5b45..e72e6c4f 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 @@ -223,9 +223,18 @@ class MainActivity : BaseActivity() { } } + viewModel.liveDataTaskLink.observe(this) { + val bundle = Bundle() + bundle.putString("TaskLinkId", it) + findNavController(R.id.main_activity_right_fragment).navigate( + R.id.TaskLinkFragment, + bundle + ) + } + //捕捉列表变化回调 viewModel.liveDataNILocationList.observe(this) { - Toast.makeText(this,"轨迹被点击了",Toast.LENGTH_LONG).show() + Toast.makeText(this, "轨迹被点击了", Toast.LENGTH_LONG).show() } //右上角菜单是否被点击 @@ -545,7 +554,12 @@ class MainActivity : BaseActivity() { mapController.mMapView.setScaleBarLayer(GLViewport.Position.BOTTOM_CENTER, 128, 65) } mapController.mMapView.vtmMap.animator() - .animateTo(GeoPoint( mapController.mMapView.vtmMap.mapPosition.geoPoint.latitude,mapController.mMapView.vtmMap.mapPosition.geoPoint.longitude)) + .animateTo( + GeoPoint( + mapController.mMapView.vtmMap.mapPosition.geoPoint.latitude, + mapController.mMapView.vtmMap.mapPosition.geoPoint.longitude + ) + ) } @RequiresApi(Build.VERSION_CODES.M) 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 d650fdf5..8a8f3f70 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 @@ -23,13 +23,10 @@ import androidx.lifecycle.viewModelScope import androidx.navigation.findNavController import com.blankj.utilcode.util.ToastUtils import com.navinfo.collect.library.data.dao.impl.TraceDataBase -import com.navinfo.collect.library.data.entity.NiLocation -import com.navinfo.collect.library.data.entity.NoteBean -import com.navinfo.collect.library.data.entity.QsRecordBean -import com.navinfo.collect.library.data.entity.RenderEntity -import com.navinfo.collect.library.data.entity.TaskBean +import com.navinfo.collect.library.data.entity.* import com.navinfo.collect.library.map.NIMapController import com.navinfo.collect.library.map.handler.OnQsRecordItemClickListener +import com.navinfo.collect.library.map.handler.OnTaskLinkItemClickListener import com.navinfo.collect.library.utils.GeometryTools import com.navinfo.collect.library.utils.GeometryToolsKt import com.navinfo.omqs.Constant @@ -91,6 +88,9 @@ class MainViewModel @Inject constructor( //道路名 val liveDataRoadName = MutableLiveData() + //捕捉到新增的link + val liveDataTaskLink = MutableLiveData() + /** * 当前选中的要展示的详细信息的要素 */ @@ -150,6 +150,12 @@ class MainViewModel @Inject constructor( liveDataNILocationList.value = list } }) + mapController.lineHandler.setOnTaskLinkItemClickListener(object : + OnTaskLinkItemClickListener { + override fun onTaskLink(taskLinkId: String) { + liveDataTaskLink.value = taskLinkId + } + }) initLocation() @@ -159,7 +165,9 @@ class MainViewModel @Inject constructor( // testPoint = it //线选择状态 if (bSelectRoad) { - captureLink(it) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + captureLink(it) + } } else { captureItem(it) } @@ -169,7 +177,7 @@ class MainViewModel @Inject constructor( initTaskData() initQsRecordData() initNoteData() - initNILocationData() +// initNILocationData() } } @@ -227,8 +235,10 @@ class MainViewModel @Inject constructor( mapController.mMapView.context, Constant.USER_DATA_PATH ).niLocationDao.findToTaskIdAll(id.toString()) - list!!.forEach { - mapController.markerHandle.addNiLocationMarkerItem(it) + if (list != null) { + for (location in list) { + mapController.markerHandle.addNiLocationMarkerItem(location) + } } } @@ -238,6 +248,17 @@ class MainViewModel @Inject constructor( private fun initLocation() { //用于定位点存储到数据库 viewModelScope.launch(Dispatchers.Default) { + //用于定位点捕捉道路 + mapController.locationLayerHandler.niLocationFlow.collectLatest { location -> + if (!isSelectRoad()) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + captureLink( + GeoPoint( + location.latitude, + location.longitude + ) + ) + } + } mapController.locationLayerHandler.niLocationFlow.collect { location -> val geometry = GeometryTools.createGeometry( GeoPoint( @@ -285,17 +306,6 @@ class MainViewModel @Inject constructor( //mapController.mMapView.vtmMap.updateMap(true) } } - //用于定位点捕捉道路 - viewModelScope.launch(Dispatchers.Default) { - mapController.locationLayerHandler.niLocationFlow.collectLatest { location -> - if (!isSelectRoad()) captureLink( - GeoPoint( - location.latitude, - location.longitude - ) - ) - } - } //显示轨迹图层 mapController.layerManagerHandler.showNiLocationLayer() @@ -312,6 +322,7 @@ class MainViewModel @Inject constructor( /** * 捕获道路和面板 */ + @RequiresApi(Build.VERSION_CODES.N) private suspend fun captureLink(point: GeoPoint) { val linkList = realmOperateHelper.queryLink( diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt index 0f3fc0ae..468d56d6 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt @@ -39,6 +39,7 @@ import dagger.hilt.android.lifecycle.HiltViewModel import io.realm.Realm import io.realm.RealmList import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import org.oscim.core.GeoPoint import java.io.File @@ -109,7 +110,7 @@ class EvaluationResultViewModel @Inject constructor( init { liveDataQsRecordBean.value = QsRecordBean(id = UUID.randomUUID().toString()) viewModelScope.launch { - mapController.onMapClickFlow.collect { + mapController.onMapClickFlow.collectLatest { liveDataQsRecordBean.value!!.geometry = GeometryTools.createGeometry(it).toText() mapController.markerHandle.addMarker(it, markerTitle) viewModelScope.launch { diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkFragment.kt index 571a1d23..579382bb 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkFragment.kt @@ -36,6 +36,13 @@ class TaskLinkFragment : BaseFragment(), View.OnClickListener { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + arguments?.let { + val id = it.getString("TaskLinkId") + if (id != null && id.isNotEmpty()){ + viewModel.initData(id) + } + } + binding.taskLinkAddPoint.setOnClickListener(this) binding.taskLinkKind.setOnClickListener(this) binding.taskLinkFunctionalLevel.setOnClickListener(this) @@ -44,6 +51,8 @@ class TaskLinkFragment : BaseFragment(), View.OnClickListener { binding.taskLinkBarSave.setOnClickListener(this) binding.taskLinkBack.setOnClickListener(this) binding.taskLinkClear.setOnClickListener(this) + binding.taskLinkBarDelete.setOnClickListener(this) + /** * 数据操作结束 */ @@ -150,6 +159,9 @@ class TaskLinkFragment : BaseFragment(), View.OnClickListener { binding.taskLinkClear -> { viewModel.clearLink() } + binding.taskLinkBarDelete ->{ + viewModel.deleteData(requireContext()) + } } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt index 87b32795..6945c9a9 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt @@ -1,5 +1,7 @@ package com.navinfo.omqs.ui.fragment.tasklink +import android.app.Dialog +import android.content.Context import android.content.SharedPreferences import android.os.Build import androidx.annotation.RequiresApi @@ -8,15 +10,18 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.navinfo.collect.library.data.entity.HadLinkDvoBean import com.navinfo.collect.library.data.entity.LinkInfoBean +import com.navinfo.collect.library.data.entity.QsRecordBean import com.navinfo.collect.library.data.entity.TaskBean import com.navinfo.collect.library.map.NIMapController import com.navinfo.collect.library.utils.GeometryTools import com.navinfo.omqs.Constant +import com.navinfo.omqs.ui.dialog.FirstDialog import dagger.hilt.android.lifecycle.HiltViewModel import io.realm.Realm import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import org.bson.codecs.UuidCodec import org.bson.internal.UuidHelper import org.oscim.core.GeoPoint @@ -102,6 +107,11 @@ class TaskLinkViewModel @Inject constructor( */ val liveDataTaskBean = MutableLiveData() + /** + * 当前正在编辑的线 + */ + private var hadLinkDvoBean: HadLinkDvoBean? = null + /** * 当前正在选择哪个数据 1:种别 2:功能等级 3:数据等级 */ @@ -184,26 +194,50 @@ class TaskLinkViewModel @Inject constructor( liveDataToastMessage.postValue("请选择数据等级!") return@launch } - val linkBean = HadLinkDvoBean( -// taskId = liveDataTaskBean.value!!.id, - linkPid = UUID.randomUUID().toString(), - linkStatus = 3, - length = mapController.measureLayerHandler.lineLengthLiveData.value!!, - geometry = GeometryTools.getLineString(mapController.measureLayerHandler.mPathLayer.points), - linkInfo = LinkInfoBean( + val task: TaskBean = liveDataTaskBean.value!! + if (hadLinkDvoBean != null) { + hadLinkDvoBean!!.taskId = liveDataTaskBean.value!!.id + hadLinkDvoBean!!.length = + mapController.measureLayerHandler.lineLengthLiveData.value!! + hadLinkDvoBean!!.geometry = + GeometryTools.getLineString(mapController.measureLayerHandler.mPathLayer.points) + hadLinkDvoBean!!.linkInfo = LinkInfoBean( kind = liveDataSelectKind.value!!.type, functionLevel = liveDataSelectFunctionLevel.value!!.type, dataLevel = liveDataSelectDataLevel.value!!.type, ) - ) - val task: TaskBean = liveDataTaskBean.value!! - task.hadLinkDvoList.add(linkBean) + for (l in task.hadLinkDvoList) { + if (l.linkPid == hadLinkDvoBean!!.linkPid) { + task.hadLinkDvoList.remove(l) + task.hadLinkDvoList.add(hadLinkDvoBean) + break + } + } + } else { + hadLinkDvoBean = HadLinkDvoBean( + taskId = liveDataTaskBean.value!!.id, + linkPid = UUID.randomUUID().toString(), + linkStatus = 3, + length = mapController.measureLayerHandler.lineLengthLiveData.value!!, + geometry = GeometryTools.getLineString(mapController.measureLayerHandler.mPathLayer.points), + linkInfo = LinkInfoBean( + kind = liveDataSelectKind.value!!.type, + functionLevel = liveDataSelectFunctionLevel.value!!.type, + dataLevel = liveDataSelectDataLevel.value!!.type, + ) + ) + task.hadLinkDvoList.add(hadLinkDvoBean) + } + + val realm = Realm.getDefaultInstance() realm.executeTransaction { + it.copyToRealmOrUpdate(hadLinkDvoBean) it.copyToRealmOrUpdate(task) } - mapController.lineHandler.addTaskLink(linkBean) - sharedPreferences.edit().putString(Constant.SHARED_SYNC_TASK_LINK_ID, linkBean.linkPid) + mapController.lineHandler.addTaskLink(hadLinkDvoBean!!) + sharedPreferences.edit() + .putString(Constant.SHARED_SYNC_TASK_LINK_ID, hadLinkDvoBean!!.linkPid) .apply() liveDataFinish.postValue(true) } @@ -231,4 +265,87 @@ class TaskLinkViewModel @Inject constructor( fun clearLink() { mapController.measureLayerHandler.clear() } + + /** + * 初始化数据 + */ + fun initData(id: String) { + viewModelScope.launch(Dispatchers.IO) { + val realm = Realm.getDefaultInstance() + val objects = + realm.where(HadLinkDvoBean::class.java).equalTo("linkPid", id) + .findFirst() + objects?.linkInfo?.let { + for (kind in kindList) { + if (kind.type == it.kind) { + liveDataSelectKind.postValue(kind) + break + } + } + for (function in functionLevelList) { + if (function.type == it.functionLevel) { + liveDataSelectFunctionLevel.postValue(function) + break + } + } + for (data in dataLevelList) { + if (data.type == it.dataLevel) { + liveDataSelectDataLevel.postValue(data) + break + } + } + } + val task = + realm.where(TaskBean::class.java).equalTo("id", objects?.taskId) + .findFirst() + + if (task != null) { + liveDataTaskBean.postValue(realm.copyFromRealm(task)) + } + hadLinkDvoBean = realm.copyFromRealm(objects) + withContext(Dispatchers.Main) { + mapController.measureLayerHandler.initPathLine(hadLinkDvoBean?.geometry!!) + } + } + } + + /** + * 删除数据 + */ + fun deleteData(context: Context) { + if(hadLinkDvoBean == null){ + liveDataFinish.value = true + return + } + val mDialog = FirstDialog(context) + mDialog.setTitle("提示?") + mDialog.setMessage("是否删除Mark,请确认!") + mDialog.setPositiveButton("确定" + ) { _, _ -> + mDialog.dismiss() + viewModelScope.launch(Dispatchers.IO) { + val realm = Realm.getDefaultInstance() + realm.executeTransaction { + val task = it.where(TaskBean::class.java).equalTo("id",hadLinkDvoBean!!.taskId).findFirst() + if(task != null) { + for (h in task.hadLinkDvoList) { + if(h.linkPid == hadLinkDvoBean!!.linkPid) + task.hadLinkDvoList.remove(h) + break + } + realm.copyToRealmOrUpdate(task) + } + +// val objects = it.where(HadLinkDvoBean::class.java) +// .equalTo("linkPid", hadLinkDvoBean!!.linkPid).findFirst() +// objects?.deleteFromRealm() + } + mapController.lineHandler.removeTaskLink(hadLinkDvoBean!!.linkPid) + mapController.mMapView.vtmMap.updateMap(true) + liveDataFinish.postValue(true) + } + } + mDialog.setNegativeButton("取消", null) + mDialog.show() + } } \ No newline at end of file diff --git a/collect-library/src/main/assets/editormarker.xml b/collect-library/src/main/assets/editormarker.xml index 06448ea1..0b7a0264 100644 --- a/collect-library/src/main/assets/editormarker.xml +++ b/collect-library/src/main/assets/editormarker.xml @@ -1690,7 +1690,7 @@ - diff --git a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/HadLinkDvoBean.kt b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/HadLinkDvoBean.kt index 3bfef3e0..8b486d45 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/HadLinkDvoBean.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/HadLinkDvoBean.kt @@ -1,12 +1,13 @@ package com.navinfo.collect.library.data.entity import io.realm.RealmObject +import io.realm.annotations.PrimaryKey open class HadLinkDvoBean @JvmOverloads constructor( -// /** -// * 任务id,方便捕捉查询 -// */ -// var taskId: Int = 0, + /** + * 任务id,方便捕捉查询 + */ + var taskId: Int = 0, /** * 图幅号 */ @@ -14,6 +15,7 @@ open class HadLinkDvoBean @JvmOverloads constructor( /** * linkPid */ + @PrimaryKey var linkPid: String = "", /** * (几何)加偏后 diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapController.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapController.kt index d449d4a2..89004106 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapController.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapController.kt @@ -1,6 +1,5 @@ package com.navinfo.collect.library.map -import android.os.Build import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.lifecycleScope import com.navinfo.collect.library.map.handler.* diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/BaseHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/BaseHandler.kt index 6e3240a0..1efce364 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/BaseHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/BaseHandler.kt @@ -1,6 +1,6 @@ package com.navinfo.collect.library.map.handler -import android.content.Context +import android.util.Log import androidx.appcompat.app.AppCompatActivity import com.navinfo.collect.library.map.NIMapView import org.oscim.layers.Layer @@ -10,6 +10,7 @@ abstract class BaseHandler(context: AppCompatActivity, mapView: NIMapView) { protected val mMapView: NIMapView = mapView fun addLayer(layer: Layer, groupType: NIMapView.LAYER_GROUPS) { + Log.e("jingo", "增加了图层 ${layer.toString()}") mMapView.vtmMap.layers().add( layer, groupType.groupIndex @@ -17,11 +18,11 @@ abstract class BaseHandler(context: AppCompatActivity, mapView: NIMapView) { } fun removeLayer(layer: Layer) { + Log.e("jingo", "移除了图层 ${layer.toString()}") mMapView.vtmMap.layers().remove(layer) } - // fun setOnMapClickListener(listener: NIMapView.OnMapClickListener) { // mMapView.setOnMapClickListener(listener) // } diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt index 0cdee3b3..c52bbd7e 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt @@ -36,6 +36,7 @@ class LineHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler( onTaskLinkItemClickListener = listener } + /** * 路口高亮 */ @@ -183,6 +184,12 @@ class LineHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler( * 增加一条任务高亮线 */ fun addTaskLink(linkBean: HadLinkDvoBean) { + for (marker in omdbTaskMarkerLayer.itemList) { + if ((marker as MarkerItem).title == linkBean.linkPid) { + omdbTaskMarkerLayer.removeItem(marker) + break + } + } if (linkBean.linkStatus == 3) { val pointList = GeometryTools.getGeoPoints(linkBean.geometry) val geoPoint = if (pointList.size < 3) { @@ -197,7 +204,10 @@ class LineHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler( ) omdbTaskMarkerLayer.addItem(marker) } + omdbTaskLinkLayer.removeLine(linkBean.linkPid) omdbTaskLinkLayer.addLine(linkBean) + omdbTaskLinkLayer.update() + mMapView.vtmMap.updateMap(true) } /** @@ -211,6 +221,8 @@ class LineHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler( } } omdbTaskLinkLayer.removeLine(linkBeanId) + omdbTaskLinkLayer.update() + mMapView.vtmMap.updateMap(true) } } diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LocationLayerHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LocationLayerHandler.kt index 851d095c..0743a60d 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LocationLayerHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LocationLayerHandler.kt @@ -12,6 +12,7 @@ import com.baidu.location.LocationClientOption.LocationMode import com.navinfo.collect.library.data.entity.NiLocation import com.navinfo.collect.library.map.NIMapView import com.navinfo.collect.library.utils.DateUtils +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.MutableSharedFlow import kotlinx.coroutines.launch import org.oscim.core.GeoPoint @@ -29,7 +30,7 @@ class LocationLayerHandler(context: AppCompatActivity, mapView: NIMapView) : // // } - val niLocationFlow = MutableSharedFlow(5) + val niLocationFlow = MutableSharedFlow(3) init { ///添加定位图层到地图,[NIMapView.LAYER_GROUPS.NAVIGATION] 是最上层layer组 @@ -72,10 +73,10 @@ class LocationLayerHandler(context: AppCompatActivity, mapView: NIMapView) : // ) // if (niLocationListener != null) { - getCurrentNiLocation()?.let { it1 -> - mContext.lifecycleScope.launch { - niLocationFlow.emit(it1) - } + getCurrentNiLocation()?.let { it1 -> + mContext.lifecycleScope.launch(Dispatchers.Default) { + niLocationFlow.emit(it1) + } // }// niLocationListener.call(it1) } } diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt index 26c97517..13030488 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt @@ -5,6 +5,7 @@ import android.content.SharedPreferences import android.graphics.BitmapFactory import android.graphics.Canvas import android.graphics.Color +import android.util.Log import androidx.appcompat.app.AppCompatActivity import androidx.core.content.res.ResourcesCompat import androidx.lifecycle.lifecycleScope @@ -536,58 +537,67 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : * 添加质检数据marker */ public suspend fun addNiLocationMarkerItem(niLocation: NiLocation) { + synchronized(this) { + Log.e("jingo", "插入定位点0 ") - var itemizedLayer: ItemizedLayer? = null + var itemizedLayer: ItemizedLayer? = null - val direction: Double = niLocation.direction + val direction: Double = niLocation.direction - val geoMarkerItem: MarkerItem = ClusterMarkerItem( - niLocation, - niLocation.id, - niLocation.time, - GeoPoint(niLocation.latitude, niLocation.longitude) - ) + val geoMarkerItem: MarkerItem = ClusterMarkerItem( + niLocation, + niLocation.id, + niLocation.time, + GeoPoint(niLocation.latitude, niLocation.longitude) + ) - //角度 - when (niLocation.media) { - 0 -> { - //角度不为0时需要预先设置marker样式并进行角度设置,否则使用图层默认的sym即可 - //角度不为0时需要预先设置marker样式并进行角度设置,否则使用图层默认的sym即可 - if (direction != 0.0) { - val symbolGpsTemp = - MarkerSymbol(niLocationBitmap, MarkerSymbol.HotspotPlace.CENTER, false) - geoMarkerItem.marker = symbolGpsTemp - geoMarkerItem.setRotation(direction.toFloat()) - } else { - val symbolGpsTemp = - MarkerSymbol(niLocationBitmap2, MarkerSymbol.HotspotPlace.CENTER, false) - geoMarkerItem.marker = symbolGpsTemp + //角度 + when (niLocation.media) { + 0 -> { + //角度不为0时需要预先设置marker样式并进行角度设置,否则使用图层默认的sym即可 + //角度不为0时需要预先设置marker样式并进行角度设置,否则使用图层默认的sym即可 + if (direction != 0.0) { + val symbolGpsTemp = + MarkerSymbol(niLocationBitmap, MarkerSymbol.HotspotPlace.CENTER, false) + geoMarkerItem.marker = symbolGpsTemp + geoMarkerItem.setRotation(direction.toFloat()) + } else { + val symbolGpsTemp = + MarkerSymbol(niLocationBitmap2, MarkerSymbol.HotspotPlace.CENTER, false) + geoMarkerItem.marker = symbolGpsTemp + } + Log.e( + "jingo", + "插入定位点1 ${geoMarkerItem.geoPoint.longitude} ${geoMarkerItem.geoPoint.latitude}" + ) + niLocationItemizedLayer.addItem(geoMarkerItem) + itemizedLayer = niLocationItemizedLayer } - niLocationItemizedLayer.addItem(geoMarkerItem) - itemizedLayer = niLocationItemizedLayer - } - 1 -> { - //角度不为0时需要预先设置marker样式并进行角度设置,否则使用图层默认的sym即可 - //角度不为0时需要预先设置marker样式并进行角度设置,否则使用图层默认的sym即可 - if (direction != 0.0) { - val symbolLidarTemp = - MarkerSymbol(niLocationBitmap1, MarkerSymbol.HotspotPlace.CENTER, false) - geoMarkerItem.marker = symbolLidarTemp - geoMarkerItem.setRotation(direction.toFloat()) - } else { - val symbolGpsTemp = - MarkerSymbol(niLocationBitmap3, MarkerSymbol.HotspotPlace.CENTER, false) - geoMarkerItem.marker = symbolGpsTemp + 1 -> { + //角度不为0时需要预先设置marker样式并进行角度设置,否则使用图层默认的sym即可 + //角度不为0时需要预先设置marker样式并进行角度设置,否则使用图层默认的sym即可 + if (direction != 0.0) { + val symbolLidarTemp = + MarkerSymbol(niLocationBitmap1, MarkerSymbol.HotspotPlace.CENTER, false) + geoMarkerItem.marker = symbolLidarTemp + geoMarkerItem.setRotation(direction.toFloat()) + } else { + val symbolGpsTemp = + MarkerSymbol(niLocationBitmap3, MarkerSymbol.HotspotPlace.CENTER, false) + geoMarkerItem.marker = symbolGpsTemp + } + Log.e( + "jingo", + "插入定位点2 ${geoMarkerItem.geoPoint.longitude} ${geoMarkerItem.geoPoint.latitude}" + ) + niLocationItemizedLayer.addItem(geoMarkerItem) + itemizedLayer = niLocationItemizedLayer } - niLocationItemizedLayer.addItem(geoMarkerItem) - itemizedLayer = niLocationItemizedLayer - } + } + itemizedLayer?.update() } - - itemizedLayer!!.update() - } diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MeasureLayerHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MeasureLayerHandler.kt index 237afa13..289e58b5 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MeasureLayerHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MeasureLayerHandler.kt @@ -3,11 +3,9 @@ package com.navinfo.collect.library.map.handler import android.graphics.BitmapFactory import android.graphics.Canvas import android.graphics.Color -import android.os.Build import android.text.TextPaint import android.util.Log import android.widget.Toast -import androidx.annotation.RequiresApi import androidx.appcompat.app.AppCompatActivity import androidx.lifecycle.MutableLiveData import com.navinfo.collect.library.R @@ -453,6 +451,32 @@ open class MeasureLayerHandler(context: AppCompatActivity, mapView: NIMapView) : } } + /** + * 初始化线数据, 用来二次编辑 + */ + fun initPathLine(geometry: String) { + bDrawLine = true + mPathLayer.isEnabled = true + mPathLayerTemp.isEnabled = true + val pointList = GeometryTools.getGeoPoints(geometry) + mPathLayer.setPoints(pointList) + for (point in pointList) { + val markerItem = MarkerItem(createUUID(), "", "", point) + markerLayer.addItem(markerItem) + mPathMakers.add(markerItem) + } + if (mPathLayer.points.size > 1) { + val distance: Double = GeometryTools.getDistance(mPathLayer.points) + val bg = BigDecimal(distance) + val f1 = bg.setScale(3, BigDecimal.ROUND_HALF_UP).toDouble() + lineLengthLiveData.value = f1 + tempLineDistanceLiveData.value = "${f1}米" + } else { + lineLengthLiveData.value = 0.000 + } + mMapView.updateMap(true) + } + private val itemGestureListener: OnItemGestureListener = object : OnItemGestureListener { override fun onItemSingleTapUp(index: Int, item: MarkerInterface): Boolean { diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/layers/OmdbTaskLinkLayer.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/layers/OmdbTaskLinkLayer.kt index 0b82d09e..c44d2405 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/layers/OmdbTaskLinkLayer.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/layers/OmdbTaskLinkLayer.kt @@ -59,12 +59,11 @@ class OmdbTaskLinkLayer(map: Map, private var style: Style) : VectorLayer(map) { update() } - fun removeLine(linkPid: String): Boolean { + fun removeLine(linkPid: String) { if (lineMap.containsKey(linkPid)) { super.remove(lineMap[linkPid]) lineMap.remove(linkPid) } - return false } fun removeLine(geometry: Geometry) { From 4ef07f470db83e4cf1a5861ad3cded030533ff32 Mon Sep 17 00:00:00 2001 From: squallzhjch Date: Tue, 18 Jul 2023 15:13:01 +0800 Subject: [PATCH 23/40] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E7=82=B9=E5=87=BB?= =?UTF-8?q?=E8=81=9A=E5=90=88marker=E5=B4=A9=E6=BA=83=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../omqs/ui/activity/map/MainActivity.kt | 33 +-- .../omqs/ui/activity/map/MainViewModel.kt | 44 ++-- .../library/map/handler/MarkHandler.kt | 229 +++++++----------- vtm | 2 +- 4 files changed, 130 insertions(+), 178 deletions(-) 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 01d35864..db09aa62 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 @@ -176,7 +176,7 @@ class MainActivity : BaseActivity() { //给xml传递viewModel对象 binding.viewModel = viewModel - binding.mainActivityVoice.setOnTouchListener { v, event -> + binding.mainActivityVoice.setOnTouchListener { v, event -> when (event?.action) { MotionEvent.ACTION_DOWN -> { voiceOnTouchStart()//Do Something @@ -206,7 +206,7 @@ class MainActivity : BaseActivity() { } } //捕捉列表变化回调 - viewModel.liveDataNoteIdList.observe(this) { + viewModel.liveDataNoteId.observe(this) { //跳转到质检数据页面 //获取右侧fragment容器 val naviController = findNavController(R.id.main_activity_right_fragment) @@ -214,11 +214,9 @@ class MainActivity : BaseActivity() { naviController.currentDestination?.let { navDestination -> when (navDestination.id) { R.id.RightEmptyFragment -> { - if (it.size == 1) { - val bundle = Bundle() - bundle.putString("NoteId", it[0]) - naviController.navigate(R.id.NoteFragment, bundle) - } + val bundle = Bundle() + bundle.putString("NoteId", it) + naviController.navigate(R.id.NoteFragment, bundle) } } } @@ -235,8 +233,8 @@ class MainActivity : BaseActivity() { //捕捉列表变化回调 viewModel.liveDataNILocationList.observe(this) { - if(viewModel.isSelectTrace()){ - Toast.makeText(this,"轨迹被点击了",Toast.LENGTH_LONG).show() + if (viewModel.isSelectTrace()) { + Toast.makeText(this, "轨迹被点击了", Toast.LENGTH_LONG).show() } } @@ -544,8 +542,8 @@ class MainActivity : BaseActivity() { @RequiresApi(Build.VERSION_CODES.N) fun tracePointsOnclick() { viewModel.setSelectTrace(!viewModel.isSelectTrace()) - if(viewModel.isSelectTrace()){ - Toast.makeText(this,"请选择轨迹点!",Toast.LENGTH_LONG).show() + if (viewModel.isSelectTrace()) { + Toast.makeText(this, "请选择轨迹点!", Toast.LENGTH_LONG).show() } binding.mainActivityTraceSnapshotPoints.isSelected = viewModel.isSelectTrace() } @@ -628,7 +626,12 @@ class MainActivity : BaseActivity() { mapController.mMapView.setScaleBarLayer(GLViewport.Position.BOTTOM_CENTER, 128, 65) } mapController.mMapView.vtmMap.animator() - .animateTo(GeoPoint( mapController.mMapView.vtmMap.mapPosition.geoPoint.latitude,mapController.mMapView.vtmMap.mapPosition.geoPoint.longitude)) + .animateTo( + GeoPoint( + mapController.mMapView.vtmMap.mapPosition.geoPoint.latitude, + mapController.mMapView.vtmMap.mapPosition.geoPoint.longitude + ) + ) } @RequiresApi(Build.VERSION_CODES.N) @@ -689,14 +692,14 @@ class MainActivity : BaseActivity() { */ fun showIndoorDataLayout() { binding.mainActivityMenuIndoorGroup.visibility = View.VISIBLE - if(Constant.INDOOR_IP.isNotEmpty()){ + if (Constant.INDOOR_IP.isNotEmpty()) { setIndoorGroupEnable(true) - }else{ + } else { setIndoorGroupEnable(false) } } - private fun setIndoorGroupEnable(enable: Boolean){ + private fun setIndoorGroupEnable(enable: Boolean) { binding.mainActivitySnapshotFinish.isEnabled = enable binding.mainActivityTraceSnapshotPoints.isEnabled = enable binding.mainActivitySnapshotMediaFlag.isEnabled = enable 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 877bc561..a8402389 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 @@ -75,7 +75,7 @@ class MainViewModel @Inject constructor( val liveDataQsRecordIdList = MutableLiveData>() //地图点击捕捉到的标签ID列表 - val liveDataNoteIdList = MutableLiveData>() + val liveDataNoteId = MutableLiveData() //地图点击捕捉到的轨迹列表 val liveDataNILocationList = MutableLiveData() @@ -159,8 +159,8 @@ class MainViewModel @Inject constructor( liveDataQsRecordIdList.value = list } - override fun onNoteList(list: MutableList) { - liveDataNoteIdList.value = list + override fun onNote(id: String) { + liveDataNoteId.value = id } override fun onNiLocation(item: NiLocation) { @@ -182,9 +182,7 @@ class MainViewModel @Inject constructor( // testPoint = it //线选择状态 if (bSelectRoad) { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - captureLink(it) - } + captureLink(it) } else { captureItem(it) } @@ -249,8 +247,7 @@ class MainViewModel @Inject constructor( //加载轨迹数据 val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) val list: List? = TraceDataBase.getDatabase( - mapController.mMapView.context, - Constant.USER_DATA_PATH + mapController.mMapView.context, Constant.USER_DATA_PATH ).niLocationDao.findToTaskIdAll(id.toString()) if (list != null) { for (location in list) { @@ -268,11 +265,13 @@ class MainViewModel @Inject constructor( viewModelScope.launch(Dispatchers.Default) { //用于定位点捕捉道路 mapController.locationLayerHandler.niLocationFlow.collectLatest { location -> - if (!isSelectRoad()&&!GeometryTools.isCheckError(location.longitude,location.latitude)) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + if (!isSelectRoad() && !GeometryTools.isCheckError( + location.longitude, location.latitude + ) + ) { captureLink( GeoPoint( - location.latitude, - location.longitude + location.latitude, location.longitude ) ) } @@ -280,7 +279,7 @@ class MainViewModel @Inject constructor( mapController.locationLayerHandler.niLocationFlow.collect { location -> //过滤掉无效点 - if(!GeometryTools.isCheckError(location.longitude,location.latitude)){ + if (!GeometryTools.isCheckError(location.longitude, location.latitude)) { val geometry = GeometryTools.createGeometry( GeoPoint( location.latitude, location.longitude @@ -309,8 +308,11 @@ class MainViewModel @Inject constructor( //增加间距判断 if (lastNiLocaion != null) { val disance = GeometryTools.getDistance( - location.latitude, location.longitude, - lastNiLocaion!!.latitude, lastNiLocaion!!.longitude) + location.latitude, + location.longitude, + lastNiLocaion!!.latitude, + lastNiLocaion!!.longitude + ) //相距差距大于2.5米以上进行存储 if (disance > 2.5) { traceDataBase.niLocationDao.insert(location) @@ -345,11 +347,11 @@ class MainViewModel @Inject constructor( */ @RequiresApi(Build.VERSION_CODES.N) private suspend fun captureLink(point: GeoPoint) { - if(captureLinkState){ + if (captureLinkState) { return } - try{ + try { captureLinkState = true val linkList = realmOperateHelper.queryLink( @@ -447,9 +449,9 @@ class MainViewModel @Inject constructor( liveDataRoadName.postValue(null) } - }catch (e:Exception){ + } catch (e: Exception) { - }finally { + } finally { captureLinkState = false } @@ -501,12 +503,10 @@ class MainViewModel @Inject constructor( try { if (!mCameraDialog!!.getmShareUtil().connectstate) { mCameraDialog!!.updateCameraResources( - 1, - mCameraDialog!!.getmDeviceNum() + 1, mCameraDialog!!.getmDeviceNum() ) } - TakePhotoManager.getInstance() - .getCameraVedioClent(mCameraDialog!!.getmDeviceNum()) + TakePhotoManager.getInstance().getCameraVedioClent(mCameraDialog!!.getmDeviceNum()) .StopSearch() } catch (e: Exception) { } diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt index fd6c367a..4b1a65e0 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt @@ -1,16 +1,13 @@ package com.navinfo.collect.library.map.handler import android.content.Context -import android.content.SharedPreferences import android.graphics.BitmapFactory import android.graphics.Canvas import android.graphics.Color import android.util.Log import androidx.appcompat.app.AppCompatActivity import androidx.core.content.res.ResourcesCompat -import androidx.lifecycle.lifecycleScope import com.navinfo.collect.library.R -import com.navinfo.collect.library.data.dao.impl.TraceDataBase import com.navinfo.collect.library.data.entity.NiLocation import com.navinfo.collect.library.data.entity.NoteBean import com.navinfo.collect.library.data.entity.QsRecordBean @@ -21,11 +18,6 @@ import com.navinfo.collect.library.map.layers.MyItemizedLayer import com.navinfo.collect.library.map.layers.NoteLineLayer import com.navinfo.collect.library.utils.GeometryTools import com.navinfo.collect.library.utils.StringUtil -import io.realm.Realm -import io.realm.kotlin.where -import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext import org.locationtech.jts.geom.Geometry import org.locationtech.jts.geom.LineString import org.locationtech.jts.geom.Polygon @@ -34,19 +26,11 @@ import org.oscim.backend.CanvasAdapter import org.oscim.backend.canvas.Bitmap import org.oscim.backend.canvas.Paint import org.oscim.core.GeoPoint -import org.oscim.layers.marker.ItemizedLayer +import org.oscim.layers.marker.* import org.oscim.layers.marker.ItemizedLayer.OnItemGestureListener -import org.oscim.layers.marker.MarkerInterface -import org.oscim.layers.marker.MarkerItem -import org.oscim.layers.marker.MarkerRendererFactory -import org.oscim.layers.marker.MarkerSymbol -import org.oscim.layers.vector.geometries.Drawable -import org.oscim.layers.vector.geometries.LineDrawable -import org.oscim.layers.vector.geometries.PointDrawable -import org.oscim.layers.vector.geometries.PolygonDrawable -import org.oscim.layers.vector.geometries.Style +import org.oscim.layers.vector.geometries.* import org.oscim.map.Map -import java.util.Locale +import java.util.* /** * marker 操作 @@ -74,9 +58,7 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : /** * 画布 */ - private val canvas: org.oscim.backend.canvas.Canvas by lazy { - CanvasAdapter.newCanvas() - } + private val canvas: org.oscim.backend.canvas.Canvas = CanvasAdapter.newCanvas() /** * 默认marker图层 @@ -88,36 +70,72 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : val markerSymbol = MarkerSymbol( mDefaultBitmap, - MarkerSymbol.HotspotPlace.BOTTOM_CENTER + MarkerSymbol.HotspotPlace.CENTER ) val layer = ItemizedLayer( mapView.vtmMap, - ArrayList(), markerSymbol, - object : OnItemGestureListener { - override fun onItemSingleTapUp(index: Int, item: MarkerInterface?): Boolean { - return false - } - - override fun onItemLongPress(index: Int, item: MarkerInterface?): Boolean { - return false - } - - } ) addLayer(layer, NIMapView.LAYER_GROUPS.OPERATE_MARKER) layer } - private var niLocationBitmap: Bitmap? = null - private var niLocationBitmap1: Bitmap? = null - private var niLocationBitmap2: Bitmap? = null - private var niLocationBitmap3: Bitmap? = null + private val niLocationBitmap: Bitmap by lazy { + AndroidBitmap( + BitmapFactory.decodeResource( + context.resources, + R.mipmap.icon_gps + ) + ) + } + private val niLocationBitmap1: Bitmap by lazy { + AndroidBitmap( + BitmapFactory.decodeResource( + context.resources, + R.mipmap.icon_gps_1 + ) + ) + } + private val niLocationBitmap2: Bitmap by lazy { + AndroidBitmap( + BitmapFactory.decodeResource( + context.resources, + R.mipmap.icon_nilocation + ) + ) + } + private val niLocationBitmap3: Bitmap by lazy { + AndroidBitmap( + BitmapFactory.decodeResource( + context.resources, + R.mipmap.icon_nilocation_1 + ) + ) + } /** * 评测数据marker 图层 */ private val qsRecordItemizedLayer: MyItemizedLayer by lazy { + val bitmapPoi: Bitmap = AndroidBitmap( + BitmapFactory.decodeResource( + mContext.resources, + R.mipmap.map_icon_blue2 + ) + ) + val symbol = MarkerSymbol(bitmapPoi, MarkerSymbol.HotspotPlace.BOTTOM_CENTER) + val markerRendererFactory = MarkerRendererFactory { markerLayer -> + object : ClusterMarkerRenderer( + mContext, + markerLayer, + symbol, + ClusterStyle( + org.oscim.backend.canvas.Color.WHITE, + org.oscim.backend.canvas.Color.BLUE + ) + ) { + } + } val layer = MyItemizedLayer( mMapView.vtmMap, mutableListOf(), @@ -160,37 +178,24 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : */ private val niLocationItemizedLayer: ItemizedLayer by lazy { - niLocationBitmap = - AndroidBitmap(BitmapFactory.decodeResource(context.resources, R.mipmap.icon_gps)) - niLocationBitmap1 = - AndroidBitmap(BitmapFactory.decodeResource(context.resources, R.mipmap.icon_gps_1)) - niLocationBitmap2 = - AndroidBitmap(BitmapFactory.decodeResource(context.resources, R.mipmap.icon_nilocation)) - niLocationBitmap3 = AndroidBitmap( - BitmapFactory.decodeResource( - context.resources, - R.mipmap.icon_nilocation_1 - ) - ) - + val symbol = MarkerSymbol(niLocationBitmap, MarkerSymbol.HotspotPlace.CENTER) val layer = ItemizedLayer( mapView.vtmMap, - mutableListOf(), - markerRendererFactory, - object : OnItemGestureListener { - override fun onItemSingleTapUp(index: Int, item: MarkerInterface?): Boolean { - itemListener?.let { - it.onNiLocation((niLocationItemizedLayer.itemList[index] as MarkerItem).uid as NiLocation) - } - return true + symbol, + ) + layer.setOnItemGestureListener(object : OnItemGestureListener { + override fun onItemSingleTapUp(index: Int, item: MarkerInterface?): Boolean { + itemListener?.let { + it.onNiLocation((niLocationItemizedLayer.itemList[index] as MarkerItem).uid as NiLocation) } + return true + } - override fun onItemLongPress(index: Int, item: MarkerInterface?): Boolean { - return true - } - - }) + override fun onItemLongPress(index: Int, item: MarkerInterface?): Boolean { + return true + } + }) addLayer(layer, NIMapView.LAYER_GROUPS.OPERATE_MARKER) layer } @@ -207,69 +212,33 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : /** * 便签图标图层 */ - private val noteLayer: MyItemizedLayer by lazy { - - val layer = MyItemizedLayer( + private val noteLayer: ItemizedLayer by lazy { + val bitmap = + AndroidBitmap(BitmapFactory.decodeResource(context.resources, noteResId)) + val symbol = MarkerSymbol(bitmap, MarkerSymbol.HotspotPlace.CENTER) + val layer = ItemizedLayer( mMapView.vtmMap, - mutableListOf(), - markerRendererFactory, - object : MyItemizedLayer.OnItemGestureListener { - override fun onItemSingleTapUp( - list: MutableList, - nearest: Int - ): Boolean { - itemListener?.let { - val idList = mutableListOf() - if (list.size == 0) { - - } else { - for (i in list) { - val markerInterface: MarkerInterface = - noteLayer.itemList[i] - if (markerInterface is MarkerItem) { - idList.add(markerInterface.title) - } - } - it.onNoteList(idList.distinct().toMutableList()) - } - } - return true + symbol, + ) + layer.setOnItemGestureListener(object : OnItemGestureListener { + override fun onItemSingleTapUp(index: Int, item: MarkerInterface?): Boolean { + itemListener?.let { + val marker = layer.itemList[index] + if (marker is MarkerItem) + it.onNote(marker.title) } + return true + } - override fun onItemLongPress( - list: MutableList?, - nearest: Int - ): Boolean { - return true - } - }) - + override fun onItemLongPress(index: Int, item: MarkerInterface?): Boolean { + return true + } + }) addLayer(layer, NIMapView.LAYER_GROUPS.OPERATE_MARKER) layer } - private val markerRendererFactory: MarkerRendererFactory by lazy { - val bitmapPoi: Bitmap = AndroidBitmap( - BitmapFactory.decodeResource( - mContext.resources, - R.mipmap.map_icon_blue2 - ) - ) - val symbol = MarkerSymbol(bitmapPoi, MarkerSymbol.HotspotPlace.BOTTOM_CENTER) - MarkerRendererFactory { markerLayer -> - object : ClusterMarkerRenderer( - mContext, - markerLayer, - symbol, - ClusterStyle( - org.oscim.backend.canvas.Color.WHITE, - org.oscim.backend.canvas.Color.BLUE - ) - ) { - } - } - } private val resId = R.mipmap.map_icon_report private val noteResId = R.drawable.icon_note_marker private var itemListener: OnQsRecordItemClickListener? = null @@ -436,26 +405,6 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : } -// /** -// * 初始话质检数据图层 -// */ -// private fun initQsRecordDataLayer() { -// -// mContext.lifecycleScope.launch(Dispatchers.IO) { -// var list = mutableListOf() -// val realm = Realm.getDefaultInstance() -// realm.executeTransaction { -// val objects = realm.where().findAll() -// list = realm.copyFromRealm(objects) -// } -// for (item in list) { -// createMarkerItem(item) -// } -// } -// -// } - - /** * 添加质检数据marker */ @@ -808,6 +757,6 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : interface OnQsRecordItemClickListener { fun onQsRecordList(list: MutableList) - fun onNoteList(list: MutableList) + fun onNote(noteId: String) fun onNiLocation(it: NiLocation) } diff --git a/vtm b/vtm index dd13e533..1ee201a4 160000 --- a/vtm +++ b/vtm @@ -1 +1 @@ -Subproject commit dd13e533c38b5738ab404c2737d7ccadeff01323 +Subproject commit 1ee201a41f78f169873848209a3f3bdac36f185a From 78bd3633725ce1d5b69d377c5e5b32d0e51b8988 Mon Sep 17 00:00:00 2001 From: qiji4215 Date: Tue, 18 Jul 2023 15:45:11 +0800 Subject: [PATCH 24/40] =?UTF-8?q?=E9=87=8D=E6=9E=84=E8=BD=A8=E8=BF=B9?= =?UTF-8?q?=E5=9B=9E=E6=94=BE=E4=B8=9A=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/navinfo/omqs/bean/TraceVideoBean.kt | 8 + .../com/navinfo/omqs/http/NetworkService.kt | 8 +- .../navinfo/omqs/http/NetworkServiceImpl.kt | 28 +++ .../omqs/ui/activity/map/MainActivity.kt | 92 +++++++++- .../omqs/ui/activity/map/MainViewModel.kt | 164 ++++++++++++++++-- .../omqs/ui/activity/scan/QRCodeViewModel.kt | 10 ++ .../omqs/ui/activity/scan/QrCodeActivity.kt | 6 + .../EvaluationResultViewModel.kt | 10 +- .../fragment/evaluationresult/LeftAdapter.kt | 4 +- app/src/main/res/layout/activity_main.xml | 1 + .../collect/library/data/entity/Feature.java | 2 +- .../library/map/handler/MarkHandler.kt | 52 +++--- 12 files changed, 334 insertions(+), 51 deletions(-) create mode 100644 app/src/main/java/com/navinfo/omqs/bean/TraceVideoBean.kt diff --git a/app/src/main/java/com/navinfo/omqs/bean/TraceVideoBean.kt b/app/src/main/java/com/navinfo/omqs/bean/TraceVideoBean.kt new file mode 100644 index 00000000..f8d0da42 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/bean/TraceVideoBean.kt @@ -0,0 +1,8 @@ +package com.navinfo.omqs.bean + +data class TraceVideoBean( + var userid: String = "", + var playMode: String = "", + var time: String = "", + var command: String = "", +) \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/http/NetworkService.kt b/app/src/main/java/com/navinfo/omqs/http/NetworkService.kt index beca12b6..2570f031 100644 --- a/app/src/main/java/com/navinfo/omqs/http/NetworkService.kt +++ b/app/src/main/java/com/navinfo/omqs/http/NetworkService.kt @@ -6,8 +6,7 @@ import com.navinfo.omqs.bean.IndoorConnectionInfoBean import com.navinfo.omqs.bean.LoginUserBean import com.navinfo.omqs.bean.QRCodeBean import com.navinfo.omqs.bean.SysUserBean -import okhttp3.ResponseBody -import retrofit2.Response +import com.navinfo.omqs.bean.TraceVideoBean /** @@ -38,4 +37,9 @@ interface NetworkService { * 更新用户信息 */ suspend fun updateServerInfo(url: String,indoorConnectionInfoBean: IndoorConnectionInfoBean): NetResult + + /** + * 设置轨迹对应的视频 + */ + suspend fun sendServerCommand(url: String,traceVideoBean: TraceVideoBean): NetResult } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/http/NetworkServiceImpl.kt b/app/src/main/java/com/navinfo/omqs/http/NetworkServiceImpl.kt index e2ce3a7e..059229b8 100644 --- a/app/src/main/java/com/navinfo/omqs/http/NetworkServiceImpl.kt +++ b/app/src/main/java/com/navinfo/omqs/http/NetworkServiceImpl.kt @@ -6,6 +6,7 @@ import com.navinfo.omqs.bean.IndoorConnectionInfoBean import com.navinfo.omqs.bean.LoginUserBean import com.navinfo.omqs.bean.QRCodeBean import com.navinfo.omqs.bean.SysUserBean +import com.navinfo.omqs.bean.TraceVideoBean import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import okhttp3.ResponseBody @@ -110,6 +111,33 @@ class NetworkServiceImpl @Inject constructor( map["baseurl"] = indoorConnectionInfoBean.baseurl map["platform"] = indoorConnectionInfoBean.platform + val result = netApi.retrofitUpdateServerInfo(url,map) + if (result.isSuccessful) { + if (result.code() == 200) { + NetResult.Success(result.body()) + } else { + NetResult.Failure(result.code(), result.message()) + } + } else { + NetResult.Failure(result.code(), result.message()) + } + } catch (e: Exception) { + NetResult.Error(e) + } + } + + override suspend fun sendServerCommand( + url: String, + traceVideoBean: TraceVideoBean + ): NetResult = + //在IO线程中运行 + withContext(Dispatchers.IO) { + return@withContext try { + val map: MutableMap = HashMap() + map["userid"] = traceVideoBean.userid + map["playMode"] = traceVideoBean.playMode + map["time"] = traceVideoBean.time + val result = netApi.retrofitUpdateServerInfo(url,map) if (result.isSuccessful) { if (result.code() == 200) { 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 f2e296c2..a36d1cb2 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 @@ -20,11 +20,13 @@ import androidx.navigation.findNavController import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.google.android.material.dialog.MaterialAlertDialogBuilder +import com.navinfo.collect.library.data.entity.NiLocation import com.navinfo.collect.library.map.NIMapController import com.navinfo.omqs.Constant import com.navinfo.omqs.R import com.navinfo.omqs.bean.ImportConfig import com.navinfo.omqs.bean.SignBean +import com.navinfo.omqs.bean.TraceVideoBean import com.navinfo.omqs.databinding.ActivityMainBinding import com.navinfo.omqs.http.offlinemapdownload.OfflineMapDownloadManager import com.navinfo.omqs.tools.LayerConfigUtils @@ -34,12 +36,14 @@ import com.navinfo.omqs.ui.fragment.offlinemap.OfflineMapFragment import com.navinfo.omqs.ui.fragment.qsrecordlist.QsRecordListFragment import com.navinfo.omqs.ui.fragment.signMoreInfo.SignMoreInfoFragment import com.navinfo.omqs.ui.fragment.tasklist.TaskManagerFragment +import com.navinfo.omqs.ui.other.BaseToast import com.navinfo.omqs.ui.widget.RecyclerViewSpacesItemDecoration import com.navinfo.omqs.util.FlowEventBus import com.navinfo.omqs.util.SpeakMode import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch import org.oscim.core.GeoPoint +import org.oscim.layers.marker.MarkerItem import org.oscim.renderer.GLViewport import org.videolan.vlc.Util import java.math.BigDecimal @@ -227,7 +231,10 @@ class MainActivity : BaseActivity() { //捕捉列表变化回调 viewModel.liveDataNILocationList.observe(this) { if(viewModel.isSelectTrace()){ - Toast.makeText(this,"轨迹被点击了",Toast.LENGTH_LONG).show() + //Toast.makeText(this,"轨迹被点击了",Toast.LENGTH_LONG).show() + viewModel.showMarker(this,it) + val traceVideoBean = TraceVideoBean(command = "videotime?", userid = Constant.USER_ID, time = "${it.time}:000") + viewModel.sendServerCommand(this,traceVideoBean) } } @@ -535,10 +542,17 @@ class MainActivity : BaseActivity() { @RequiresApi(Build.VERSION_CODES.N) fun tracePointsOnclick() { viewModel.setSelectTrace(!viewModel.isSelectTrace()) + binding.mainActivityTraceSnapshotPoints.isSelected = viewModel.isSelectTrace() + if(viewModel.isSelectTrace()){ Toast.makeText(this,"请选择轨迹点!",Toast.LENGTH_LONG).show() + //调用撤销自动播放 + binding.mainActivitySnapshotFinish.isEnabled = false + binding.mainActivitySnapshotRewind.isEnabled = false + binding.mainActivitySnapshotPause.isEnabled = false + binding.mainActivitySnapshotNext.isEnabled = false + viewModel.cancelTrace() } - binding.mainActivityTraceSnapshotPoints.isSelected = viewModel.isSelectTrace() } /** @@ -550,6 +564,7 @@ class MainActivity : BaseActivity() { viewModel.setSelectTrace(false) viewModel.setMediaFlag(false) viewModel.setSelectPauseTrace(false) + binding.mainActivityMenuIndoorGroup.visibility = View.GONE binding.mainActivityTraceSnapshotPoints.isSelected = viewModel.isSelectTrace() binding.mainActivitySnapshotMediaFlag.isSelected = viewModel.isMediaFlag() binding.mainActivitySnapshotPause.isSelected = viewModel.isSelectPauseTrace() @@ -569,7 +584,16 @@ class MainActivity : BaseActivity() { */ @RequiresApi(Build.VERSION_CODES.N) fun rewindTraceOnclick() { - pasePlayTrace() + pausePlayTrace() + val item = mapController.markerHandle.getNILocation(viewModel.currentIndexNiLocation-1) + if(item!=null){ + viewModel.currentIndexNiLocation = viewModel.currentIndexNiLocation-1 + viewModel.showMarker(this,(item as MarkerItem).uid as NiLocation) + val traceVideoBean = TraceVideoBean(command = "videotime?", userid = Constant.USER_ID, time = "${(item.uid as NiLocation).time}:000") + viewModel.sendServerCommand(this,traceVideoBean) + }else{ + dealNoData() + } } /** @@ -581,6 +605,41 @@ class MainActivity : BaseActivity() { binding.mainActivitySnapshotPause.isSelected = viewModel.isSelectPauseTrace() viewModel.setSelectTrace(false) binding.mainActivityTraceSnapshotPoints.isSelected = viewModel.isSelectTrace() + if(viewModel.isSelectPauseTrace()){ + playVideo() + }else{ + pauseVideo() + viewModel.cancelTrace() + } + } + + @RequiresApi(Build.VERSION_CODES.N) + fun playVideo(){ + if (mapController.markerHandle.getCurrentMark()==null) { + BaseToast.makeText(this, "请先选择轨迹点!", BaseToast.LENGTH_SHORT).show() + return + } + viewModel.setSelectTrace(false) + binding.mainActivityTraceSnapshotPoints.isSelected = viewModel.isSelectTrace() + val traceVideoBean = TraceVideoBean(command = "playVideo?", userid = Constant.USER_ID) + viewModel.sendServerCommand(this,traceVideoBean) + } + + /** + * 设置为播放状态 + */ + @RequiresApi(Build.VERSION_CODES.N) + fun setPlayStatus() { + //切换为播放 + viewModel.setSelectPauseTrace(true) + binding.mainActivitySnapshotPause.isSelected = viewModel.isSelectPauseTrace() + playVideo() + } + + @RequiresApi(Build.VERSION_CODES.N) + fun pauseVideo(){ + val traceVideoBean = TraceVideoBean(command = "pauseVideo?", userid = Constant.USER_ID) + viewModel.sendServerCommand(this,traceVideoBean) } /** @@ -588,15 +647,38 @@ class MainActivity : BaseActivity() { */ @RequiresApi(Build.VERSION_CODES.N) fun nextTraceOnclick() { - pasePlayTrace() + pausePlayTrace() + val item = mapController.markerHandle.getNILocation(viewModel.currentIndexNiLocation+1) + if(item!=null){ + viewModel.currentIndexNiLocation = viewModel.currentIndexNiLocation+1 + viewModel.showMarker(this,(item as MarkerItem).uid as NiLocation) + val traceVideoBean = TraceVideoBean(command = "videotime?", userid = Constant.USER_ID, time = "${(item.uid as NiLocation).time}:000") + viewModel.sendServerCommand(this,traceVideoBean) + }else{ + dealNoData() + } } @RequiresApi(Build.VERSION_CODES.N) - fun pasePlayTrace() { + private fun dealNoData() { + BaseToast.makeText(this, "无数据了!", Toast.LENGTH_SHORT).show() + + //无数据时自动暂停播放,并停止轨迹 + if (viewModel.isSelectPauseTrace()) { + pauseVideo() + viewModel.cancelTrace() + viewModel.setSelectPauseTrace(false) + binding.mainActivitySnapshotPause.isSelected = viewModel.isSelectPauseTrace() + } + } + + @RequiresApi(Build.VERSION_CODES.N) + fun pausePlayTrace() { viewModel.setSelectTrace(false) binding.mainActivityTraceSnapshotPoints.isSelected = viewModel.isSelectTrace() viewModel.setSelectPauseTrace(false) binding.mainActivitySnapshotPause.isSelected = viewModel.isSelectPauseTrace() + viewModel.cancelTrace() } 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 6a0b84ab..aa4b38f6 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 @@ -15,10 +15,10 @@ import android.view.View import android.view.ViewGroup import android.widget.ImageView import android.widget.PopupWindow +import android.widget.Toast import androidx.annotation.RequiresApi import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel -import androidx.lifecycle.lifecycleScope import androidx.lifecycle.viewModelScope import androidx.navigation.findNavController import com.blankj.utilcode.util.ToastUtils @@ -35,10 +35,16 @@ import com.navinfo.collect.library.utils.GeometryToolsKt import com.navinfo.omqs.Constant import com.navinfo.omqs.R import com.navinfo.omqs.bean.ImportConfig +import com.navinfo.omqs.bean.QRCodeBean import com.navinfo.omqs.bean.SignBean +import com.navinfo.omqs.bean.TraceVideoBean import com.navinfo.omqs.db.RealmOperateHelper +import com.navinfo.omqs.http.NetResult +import com.navinfo.omqs.http.NetworkService +import com.navinfo.omqs.ui.activity.scan.QrCodeStatus import com.navinfo.omqs.ui.dialog.CommonDialog import com.navinfo.omqs.ui.manager.TakePhotoManager +import com.navinfo.omqs.ui.other.BaseToast import com.navinfo.omqs.ui.widget.SignUtil import com.navinfo.omqs.util.DateTimeUtil import com.navinfo.omqs.util.SoundMeter @@ -56,6 +62,7 @@ import org.oscim.core.MapPosition import org.oscim.map.Map import org.videolan.libvlc.LibVlcUtil import java.io.File +import java.io.IOException import java.util.* import javax.inject.Inject @@ -69,6 +76,7 @@ class MainViewModel @Inject constructor( private val mapController: NIMapController, private val traceDataBase: TraceDataBase, private val realmOperateHelper: RealmOperateHelper, + private val networkService: NetworkService, private val sharedPreferences: SharedPreferences ) : ViewModel() { @@ -97,6 +105,8 @@ class MainViewModel @Inject constructor( */ val liveDataSignMoreInfo = MutableLiveData() + private var traceTag: String = "TRACE_TAG" + // var testPoint = GeoPoint(0, 0) //uuid标识,用于记录轨迹组 @@ -120,6 +130,9 @@ class MainViewModel @Inject constructor( val liveDataCenterPoint = MutableLiveData() + //状态 + val qrCodeStatus: MutableLiveData = MutableLiveData() + /** * 是不是线选择模式 */ @@ -144,6 +157,8 @@ class MainViewModel @Inject constructor( private var lastNiLocaion: NiLocation? = null + var currentIndexNiLocation: Int = 0; + init { mapController.mMapView.vtmMap.events.bind(Map.UpdateListener { e, mapPosition -> when (e) { @@ -163,8 +178,9 @@ class MainViewModel @Inject constructor( liveDataNoteIdList.value = list } - override fun onNiLocation(item: NiLocation) { + override fun onNiLocation(index: Int, item: NiLocation) { liveDataNILocationList.value = item + currentIndexNiLocation = index } }) @@ -175,11 +191,11 @@ class MainViewModel @Inject constructor( mapController.onMapClickFlow.collectLatest { // testPoint = it //线选择状态 -/* if (bSelectRoad) { - captureLink(it) - } else { - captureItem(it) - }*/ + /* if (bSelectRoad) { + captureLink(it) + } else { + captureItem(it) + }*/ } } viewModelScope.launch(Dispatchers.IO) { @@ -259,7 +275,7 @@ class MainViewModel @Inject constructor( mapController.locationLayerHandler.niLocationFlow.collect { location -> //过滤掉无效点 - if(!GeometryTools.isCheckError(location.longitude,location.latitude)){ + if (!GeometryTools.isCheckError(location.longitude, location.latitude)) { val geometry = GeometryTools.createGeometry( GeoPoint( location.latitude, location.longitude @@ -289,9 +305,10 @@ class MainViewModel @Inject constructor( if (lastNiLocaion != null) { val disance = GeometryTools.getDistance( location.latitude, location.longitude, - lastNiLocaion!!.latitude, lastNiLocaion!!.longitude) + lastNiLocaion!!.latitude, lastNiLocaion!!.longitude + ) //相距差距大于2.5米以上进行存储 - if (disance > 2.5) { + if (disance > 2.5 && disance < 60) { traceDataBase.niLocationDao.insert(location) mapController.markerHandle.addNiLocationMarkerItem(location) mapController.mMapView.vtmMap.updateMap(true) @@ -299,8 +316,8 @@ class MainViewModel @Inject constructor( } } else { traceDataBase.niLocationDao.insert(location) -/* mapController.markerHandle.addNiLocationMarkerItem(location) - mapController.mMapView.vtmMap.updateMap(true)*/ + mapController.markerHandle.addNiLocationMarkerItem(location) + mapController.mMapView.vtmMap.updateMap(true) lastNiLocaion = location } } @@ -309,7 +326,11 @@ class MainViewModel @Inject constructor( //用于定位点捕捉道路 viewModelScope.launch(Dispatchers.Default) { mapController.locationLayerHandler.niLocationFlow.collectLatest { location -> - if (!isSelectRoad()&&!GeometryTools.isCheckError(location.longitude,location.latitude)) captureLink( + if (!isSelectRoad() && !GeometryTools.isCheckError( + location.longitude, + location.latitude + ) + ) captureLink( GeoPoint( location.latitude, location.longitude @@ -335,11 +356,11 @@ class MainViewModel @Inject constructor( */ @RequiresApi(Build.VERSION_CODES.N) private suspend fun captureLink(point: GeoPoint) { - if(captureLinkState){ + if (captureLinkState) { return } - try{ + try { captureLinkState = true val linkList = realmOperateHelper.queryLink( @@ -437,9 +458,9 @@ class MainViewModel @Inject constructor( liveDataRoadName.postValue(null) } - }catch (e:Exception){ + } catch (e: Exception) { - }finally { + } finally { captureLinkState = false } @@ -673,5 +694,114 @@ class MainViewModel @Inject constructor( liveDataSignMoreInfo.value = data } + fun sendServerCommand(context: Context, traceVideoBean: TraceVideoBean) { + if (TextUtils.isEmpty(Constant.INDOOR_IP)) { + Toast.makeText(context, "获取ip失败!", Toast.LENGTH_LONG).show() + return + } + + viewModelScope.launch(Dispatchers.Default) { + val url = "http://${Constant.INDOOR_IP}:8080/sensor/service/${traceVideoBean.command}?" + + when (val result = networkService.sendServerCommand( + url = url, + traceVideoBean = traceVideoBean + )) { + is NetResult.Success<*> -> { + + if (result.data != null) { + try { + + val defaultUserResponse = result.data as QRCodeBean + + if (defaultUserResponse.errcode == 0) { + + withContext(Dispatchers.Main) { + Toast.makeText( + context, + "命令成功。", + Toast.LENGTH_LONG + ).show() + qrCodeStatus.postValue(QrCodeStatus.QR_CODE_STATUS_UPDATE_VIDEO_INFO_SUCCESS) + } + } else { + withContext(Dispatchers.Main) { + Toast.makeText( + context, + "命令无效${defaultUserResponse.errmsg}", + Toast.LENGTH_SHORT + ) + .show() + } + } + + } catch (e: IOException) { + withContext(Dispatchers.Main) { + Toast.makeText( + context, + "${e.message}", + Toast.LENGTH_SHORT + ).show() + } + } + } + } + + is NetResult.Error<*> -> { + withContext(Dispatchers.Main) { + Toast.makeText( + context, + "${result.exception.message}", + Toast.LENGTH_SHORT + ) + .show() + } + qrCodeStatus.postValue(QrCodeStatus.QR_CODE_STATUS_NET_FAILURE) + } + + is NetResult.Failure<*> -> { + withContext(Dispatchers.Main) { + Toast.makeText( + context, + "${result.code}:${result.msg}", + Toast.LENGTH_SHORT + ) + .show() + } + qrCodeStatus.postValue(QrCodeStatus.QR_CODE_STATUS_NET_FAILURE) + } + + else -> {} + } + + } + + } + + /** + * 显示marker + * @param trackCollection 轨迹点 + * @param type 1 提示最后一个轨迹点 非1提示第一个轨迹点 + */ + fun showMarker(context: Context, niLocation: NiLocation) { + if (mapController.markerHandle != null) { + mapController.markerHandle.removeMarker(traceTag) + if (niLocation != null) { + mapController.markerHandle.addMarker( + GeoPoint( + niLocation.latitude, + niLocation.longitude + ), traceTag, "", niLocation as java.lang.Object + ) + } + } + } + + /** + * 结束自动播放 + */ + fun cancelTrace() { + + } } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QRCodeViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QRCodeViewModel.kt index 1e82d3c7..566a92aa 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QRCodeViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QRCodeViewModel.kt @@ -33,6 +33,16 @@ enum class QrCodeStatus { * 信息更新成功 */ QR_CODE_STATUS_SERVER_INFO_SUCCESS, + + /** + * 信息更新轨迹成功 + */ + QR_CODE_STATUS_UPDATE_VIDEO_INFO_SUCCESS, + + /** + * 信息更新轨迹失败 + */ + QR_CODE_STATUS_UPDATE_VIDEO_INFO_FAILURE, } @HiltViewModel diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QrCodeActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QrCodeActivity.kt index 12706f25..876c1ab6 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QrCodeActivity.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QrCodeActivity.kt @@ -61,6 +61,12 @@ class QrCodeActivity : BaseActivity() { } QrCodeStatus.QR_CODE_STATUS_SERVER_INFO_SUCCESS -> { + } + QrCodeStatus.QR_CODE_STATUS_UPDATE_VIDEO_INFO_SUCCESS -> { + + } + QrCodeStatus.QR_CODE_STATUS_UPDATE_VIDEO_INFO_FAILURE -> { + } } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt index 0f3fc0ae..1468539c 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt @@ -212,6 +212,7 @@ class EvaluationResultViewModel @Inject constructor( if (classType2 != null) { classType = classType2 } + classCode = bean.renderEntity.code.toString() } //如果右侧栏没数据,给个默认值 if (liveDataQsRecordBean.value!!.classType.isEmpty()) { @@ -298,11 +299,12 @@ class EvaluationResultViewModel @Inject constructor( /** * 查询问题类型列表 */ - fun getProblemTypeList(classType: String) { + fun getProblemTypeList(scProblemTypeBean: ScProblemTypeBean) { viewModelScope.launch(Dispatchers.IO) { - getProblemList(classType) + getProblemList(scProblemTypeBean.classType) } - classTypeTemp = classType + classTypeTemp = scProblemTypeBean.classType + classCodeTemp = scProblemTypeBean.elementCode } /** @@ -381,7 +383,7 @@ class EvaluationResultViewModel @Inject constructor( GeoPoint( p.latitude, p.longitude - ), markerTitle + ), markerTitle,"",null ) //获取linkid diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/LeftAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/LeftAdapter.kt index d5a1f5d5..261b2106 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/LeftAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/LeftAdapter.kt @@ -7,7 +7,7 @@ import com.navinfo.omqs.databinding.TextItemSelectBinding import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter import com.navinfo.omqs.ui.other.BaseViewHolder -class LeftAdapter(private var itemListener: ((Int, String) -> Unit?)? = null) : +class LeftAdapter(private var itemListener: ((Int, ScProblemTypeBean) -> Unit?)? = null) : BaseRecyclerViewAdapter() { private var selectTitle = "" @@ -28,7 +28,7 @@ class LeftAdapter(private var itemListener: ((Int, String) -> Unit?)? = null) : selectTitle = title.classType notifyDataSetChanged() } - itemListener?.invoke(position, title.classType) + itemListener?.invoke(position, title) } } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index cdc5c529..774553c2 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -380,6 +380,7 @@ { override fun onItemSingleTapUp(index: Int, item: MarkerInterface?): Boolean { itemListener?.let { - it.onNiLocation((niLocationItemizedLayer.itemList[index] as MarkerItem).uid as NiLocation) + it.onNiLocation(index,(niLocationItemizedLayer.itemList[index] as MarkerItem).uid as NiLocation) } return true } @@ -303,7 +295,8 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : fun addMarker( geoPoint: GeoPoint, title: String?, - description: String? = "" + description: String? = "", + uid: java.lang.Object?=null, ) { var marker: MarkerItem? = null for (e in mDefaultMarkerLayer.itemList) { @@ -318,6 +311,7 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : tempTitle = StringUtil.createUUID() } val marker = MarkerItem( + uid, tempTitle, description, geoPoint @@ -333,6 +327,14 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : } } + fun getCurrentMark(): MarkerInterface? { + + if(mDefaultMarkerLayer!=null){ + return mDefaultMarkerLayer.itemList[mDefaultMarkerLayer.itemList.size-1] + } + return null + } + /** * 移除marker */ @@ -520,9 +522,13 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : /** * 添加质检数据marker */ - public suspend fun addNiLocationMarkerItem(niLocation: NiLocation) { + fun addNiLocationMarkerItem(niLocation: NiLocation) { + var geoMarkerItem = createNILocationBitmap(niLocation) + niLocationItemizedLayer.addItem(geoMarkerItem) + niLocationItemizedLayer.update() + } - var itemizedLayer: ItemizedLayer? = null + private fun createNILocationBitmap(niLocation: NiLocation): MarkerItem{ val direction: Double = niLocation.direction @@ -548,8 +554,6 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : MarkerSymbol(niLocationBitmap2, MarkerSymbol.HotspotPlace.CENTER, false) geoMarkerItem.marker = symbolGpsTemp } - niLocationItemizedLayer.addItem(geoMarkerItem) - itemizedLayer = niLocationItemizedLayer } 1 -> { @@ -565,14 +569,10 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : MarkerSymbol(niLocationBitmap3, MarkerSymbol.HotspotPlace.CENTER, false) geoMarkerItem.marker = symbolGpsTemp } - niLocationItemizedLayer.addItem(geoMarkerItem) - itemizedLayer = niLocationItemizedLayer } - } - itemizedLayer!!.update() - + return geoMarkerItem } @@ -794,10 +794,22 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : niLocationItemizedLayer.update() } + fun getNILocationItemizedLayerSize():Int{ + return niLocationItemizedLayer.itemList.size + } + + fun getNILocation(index:Int):MarkerInterface?{ + return if(index>-1&&index) fun onNoteList(list: MutableList) - fun onNiLocation(it: NiLocation) + fun onNiLocation(index:Int,it: NiLocation) } From 53275472f44b927b4fd0f74ab866963979733446 Mon Sep 17 00:00:00 2001 From: qiji4215 Date: Tue, 18 Jul 2023 15:56:21 +0800 Subject: [PATCH 25/40] =?UTF-8?q?=E8=A7=A3=E5=86=B3=E4=BB=A3=E7=A0=81?= =?UTF-8?q?=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt | 1 + .../com/navinfo/collect/library/map/handler/MarkHandler.kt | 3 +-- vtm | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) 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 56f211a1..105345e6 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 @@ -73,6 +73,7 @@ class MainViewModel @Inject constructor( private val mapController: NIMapController, private val traceDataBase: TraceDataBase, private val realmOperateHelper: RealmOperateHelper, + private val networkService: NetworkService, private val sharedPreferences: SharedPreferences ) : ViewModel() { diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt index 79888e5f..c114af4a 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt @@ -4,7 +4,6 @@ import android.content.Context import android.graphics.BitmapFactory import android.graphics.Canvas import android.graphics.Color -import android.util.Log import androidx.appcompat.app.AppCompatActivity import androidx.core.content.res.ResourcesCompat import com.navinfo.collect.library.R @@ -186,7 +185,7 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : layer.setOnItemGestureListener(object : OnItemGestureListener { override fun onItemSingleTapUp(index: Int, item: MarkerInterface?): Boolean { itemListener?.let { - it.onNiLocation((niLocationItemizedLayer.itemList[index] as MarkerItem).uid as NiLocation) + it.onNiLocation(index,(niLocationItemizedLayer.itemList[index] as MarkerItem).uid as NiLocation) } return true } diff --git a/vtm b/vtm index 1ee201a4..dd13e533 160000 --- a/vtm +++ b/vtm @@ -1 +1 @@ -Subproject commit 1ee201a41f78f169873848209a3f3bdac36f185a +Subproject commit dd13e533c38b5738ab404c2737d7ccadeff01323 From 0378378dec89f04c166f5c88e01f9d96fa068455 Mon Sep 17 00:00:00 2001 From: qiji4215 Date: Tue, 18 Jul 2023 17:08:07 +0800 Subject: [PATCH 26/40] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AE=9A=E4=BD=8D?= =?UTF-8?q?=E6=97=A0=E6=95=88=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../omqs/ui/activity/map/MainViewModel.kt | 31 ++++++------------- .../map/handler/LocationLayerHandler.kt | 12 ++----- .../library/map/handler/MarkHandler.kt | 4 +-- 3 files changed, 15 insertions(+), 32 deletions(-) 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 105345e6..8e7dae95 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 @@ -270,21 +270,10 @@ class MainViewModel @Inject constructor( */ @RequiresApi(Build.VERSION_CODES.N) private fun initLocation() { + //用于定位点存储到数据库 viewModelScope.launch(Dispatchers.Default) { //用于定位点捕捉道路 - mapController.locationLayerHandler.niLocationFlow.collectLatest { location -> - if (!isSelectRoad() && !GeometryTools.isCheckError( - location.longitude, location.latitude - ) - ) { - captureLink( - GeoPoint( - location.latitude, location.longitude - ) - ) - } - } mapController.locationLayerHandler.niLocationFlow.collect { location -> //过滤掉无效点 @@ -335,23 +324,23 @@ class MainViewModel @Inject constructor( } } } + } - //用于定位点捕捉道路 viewModelScope.launch(Dispatchers.Default) { + //用于定位点捕捉道路 mapController.locationLayerHandler.niLocationFlow.collectLatest { location -> if (!isSelectRoad() && !GeometryTools.isCheckError( - location.longitude, - location.latitude + location.longitude, location.latitude ) - ) captureLink( - GeoPoint( - location.latitude, - location.longitude + ) { + captureLink( + GeoPoint( + location.latitude, location.longitude + ) ) - ) + } } } - //显示轨迹图层 mapController.layerManagerHandler.showNiLocationLayer() diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LocationLayerHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LocationLayerHandler.kt index 0743a60d..749b2d58 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LocationLayerHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LocationLayerHandler.kt @@ -30,7 +30,7 @@ class LocationLayerHandler(context: AppCompatActivity, mapView: NIMapView) : // // } - val niLocationFlow = MutableSharedFlow(3) + val niLocationFlow = MutableSharedFlow(5) init { ///添加定位图层到地图,[NIMapView.LAYER_GROUPS.NAVIGATION] 是最上层layer组 @@ -67,18 +67,12 @@ class LocationLayerHandler(context: AppCompatActivity, mapView: NIMapView) : val errorCode = it.locType mCurrentLocation = it mLocationLayer.setPosition(it.latitude, it.longitude, it.radius) -// Log.e( -// "qj", -// "location==${it.longitude}==errorCode===$errorCode===${it.locTypeDescription}" -// ) + Log.e("qj", "location==${it.longitude}==errorCode===$errorCode===${it.locTypeDescription}") -// if (niLocationListener != null) { getCurrentNiLocation()?.let { it1 -> - mContext.lifecycleScope.launch(Dispatchers.Default) { + mContext.lifecycleScope.launch { niLocationFlow.emit(it1) } - -// }// niLocationListener.call(it1) } } //第一次定位成功显示当前位置 if (this.bFirst) { diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt index c114af4a..0c4bb225 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt @@ -504,7 +504,7 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : 0 -> { //角度不为0时需要预先设置marker样式并进行角度设置,否则使用图层默认的sym即可 //角度不为0时需要预先设置marker样式并进行角度设置,否则使用图层默认的sym即可 - if (direction != 0.0) { + if (direction > 0.0) { val symbolGpsTemp = MarkerSymbol(niLocationBitmap, MarkerSymbol.HotspotPlace.CENTER, false) geoMarkerItem.marker = symbolGpsTemp @@ -519,7 +519,7 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : 1 -> { //角度不为0时需要预先设置marker样式并进行角度设置,否则使用图层默认的sym即可 //角度不为0时需要预先设置marker样式并进行角度设置,否则使用图层默认的sym即可 - if (direction != 0.0) { + if (direction > 0.0) { val symbolLidarTemp = MarkerSymbol(niLocationBitmap1, MarkerSymbol.HotspotPlace.CENTER, false) geoMarkerItem.marker = symbolLidarTemp From 063927653a4d842709b8191b6a0410cff191ffe4 Mon Sep 17 00:00:00 2001 From: qiji4215 Date: Tue, 18 Jul 2023 18:00:31 +0800 Subject: [PATCH 27/40] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AE=A4=E5=86=85?= =?UTF-8?q?=E6=95=B4=E7=90=86=E5=B7=A5=E5=85=B7=E5=8F=8D=E5=90=91=E6=8E=A7?= =?UTF-8?q?=E5=88=B6=E4=B8=9A=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../omqs/ui/activity/map/MainViewModel.kt | 55 +- .../omqs/ui/activity/map/SocketServer.kt | 583 ++++++++++++++++++ .../library/data/dao/impl/INiLocationDao.java | 3 + 3 files changed, 637 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/com/navinfo/omqs/ui/activity/map/SocketServer.kt 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 8e7dae95..d00460e5 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 @@ -26,7 +26,6 @@ import com.navinfo.collect.library.data.dao.impl.TraceDataBase import com.navinfo.collect.library.data.entity.* import com.navinfo.collect.library.map.NIMapController import com.navinfo.collect.library.map.handler.OnQsRecordItemClickListener -import com.navinfo.collect.library.map.handler.OnTaskLinkItemClickListener import com.navinfo.collect.library.utils.GeometryTools import com.navinfo.collect.library.utils.GeometryToolsKt import com.navinfo.omqs.Constant @@ -75,7 +74,7 @@ class MainViewModel @Inject constructor( private val realmOperateHelper: RealmOperateHelper, private val networkService: NetworkService, private val sharedPreferences: SharedPreferences -) : ViewModel() { +) : ViewModel(),SocketServer.OnConnectSinsListener{ private var mCameraDialog: CommonDialog? = null @@ -133,6 +132,9 @@ class MainViewModel @Inject constructor( //状态 val qrCodeStatus: MutableLiveData = MutableLiveData() + //状态 + val indoorToolsStatus: MutableLiveData = MutableLiveData() + /** * 是不是线选择模式 */ @@ -157,7 +159,9 @@ class MainViewModel @Inject constructor( private var lastNiLocaion: NiLocation? = null - var currentIndexNiLocation: Int = 0; + var currentIndexNiLocation: Int = 0 + + private var socketServer:SocketServer? = null init { mapController.mMapView.vtmMap.events.bind(Map.UpdateListener { e, mapPosition -> @@ -203,6 +207,8 @@ class MainViewModel @Inject constructor( initNoteData() initNILocationData() } + + socketServer = SocketServer(mapController,traceDataBase,sharedPreferences) } /** @@ -343,7 +349,6 @@ class MainViewModel @Inject constructor( } //显示轨迹图层 mapController.layerManagerHandler.showNiLocationLayer() - } /** @@ -724,6 +729,17 @@ class MainViewModel @Inject constructor( Toast.LENGTH_LONG ).show() qrCodeStatus.postValue(QrCodeStatus.QR_CODE_STATUS_UPDATE_VIDEO_INFO_SUCCESS) + + //启动双向控制服务 + + //启动双向控制服务 + if (socketServer != null && socketServer!!.isServerClose) { + socketServer!!.connect( + Constant.INDOOR_IP, + this@MainViewModel + ) + } + } } else { withContext(Dispatchers.Main) { @@ -804,4 +820,35 @@ class MainViewModel @Inject constructor( fun cancelTrace() { } + + override fun onConnect(success: Boolean) { + if (!success && socketServer != null) { + BaseToast.makeText( + mapController.mMapView.context, + "轨迹反向控制服务失败,请确认连接是否正常!", + Toast.LENGTH_SHORT + ).show() + } + } + + override fun onIndexing() { + //切换为暂停状态 + indoorToolsStatus.postValue(IndoorToolsStatus.PAUSE) + } + + override fun onStop() { + TODO("Not yet implemented") + } + + override fun onPlay() { + TODO("Not yet implemented") + } + + override fun onParseEnd() { + TODO("Not yet implemented") + } + + override fun onReceiveLocation(mNiLocation: NiLocation?) { + TODO("Not yet implemented") + } } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/SocketServer.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/SocketServer.kt new file mode 100644 index 00000000..1f6cbb10 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/SocketServer.kt @@ -0,0 +1,583 @@ +package com.navinfo.omqs.ui.activity.map + +import android.app.Service +import android.content.Intent +import android.content.SharedPreferences +import android.os.Binder +import android.os.Handler +import android.os.IBinder +import android.os.Message +import android.text.TextUtils +import android.util.Log +import com.navinfo.collect.library.data.dao.impl.TraceDataBase +import com.navinfo.collect.library.data.entity.NiLocation +import com.navinfo.collect.library.map.NIMapController +import com.navinfo.omqs.Constant +import com.navinfo.omqs.util.DateTimeUtil +import org.json.JSONObject +import java.io.IOException +import java.io.InputStream +import java.io.OutputStream +import java.io.Serializable +import java.net.Socket +import java.util.Collections +import kotlin.math.abs + + +enum class IndoorToolsStatus { + PAUSE, + PLAY, + NEXT, + REWIND +} + +/** + * @author qj + * @version V1.0 + * @Date 2018/4/18. + * @Description: 轨迹反向控制服务 + */ +class SocketServer( + private val mapController: NIMapController, + private val traceDataBase: TraceDataBase, + private val sharedPreferences: SharedPreferences +) : Service() { + //类标识 + private val TAG = "SocketServer" + + //线程池 + private val threadConnect = ThreadLocal() + + //读的线程 + private var tRecv: RecvThread? = null + + //解析线程 + private var tParse: ParseThread? = null + + //输出流 + private var outStr: OutputStream? = null + + //输入流 + private var inStr: InputStream? = null + + //状态 + var connectstatus = false + + //socket + private var client: Socket? = null + + //接收缓存 + private val sData = ByteArray(512) + + //反馈接口 + private var mListener: OnConnectSinsListener? = null + + //服务 + private val mBinder: MyBinder = MyBinder() + + //接收集合 + private val mTaskList = Collections.synchronizedList(ArrayList()) + + //连接线程 + private var connectThread: Thread? = null + + //缓存ip + private var lastIp = "" + private val mHandler: Handler = object : Handler() { + override fun handleMessage(msg: Message) { + when (msg.what) { + 0x11 -> if (mListener != null) { + if (msg.obj != null && msg.obj is NiLocation) { + mListener!!.onReceiveLocation(msg.obj as NiLocation) + } else { + mListener!!.onReceiveLocation(null) + } + } + + 0x22 -> //索引定位中 + if (mListener != null) { + mListener!!.onIndexing() + } + + 0x33 -> if (mListener != null) { + mListener!!.onConnect(true) + } + + 0x44 -> if (mListener != null) { + mListener!!.onConnect(false) + } + + 0x55 -> if (mListener != null) { + mListener!!.onPlay() + } + + 0x66 -> if (mListener != null) { + mListener!!.onStop() + } + + 0x99 -> if (mListener != null) { + mListener!!.onParseEnd() + } + + 0x999 -> if (mListener != null) { + mListener!!.onConnect(false) + disconnect() + } + } + } + } + + override fun onCreate() { + super.onCreate() + } + + override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int { + return super.onStartCommand(intent, flags, startId) + } + + override fun onDestroy() { + super.onDestroy() + } + + override fun onBind(intent: Intent): IBinder? { + return mBinder + } + + inner class MyBinder : Binder() { + // 返回Activity所关联的Service对象,这样在Activity里,就可调用Service里的一些公用方法 和公用属性 + val service: SocketServer + get() =// 返回Activity所关联的Service对象,这样在Activity里,就可调用Service里的一些公用方法 和公用属性 + this@SocketServer + } + + /** + * 启动sock连接 + * + * @param ip + * @param listener 结果回调 + */ + fun connect(ip: String, listener: OnConnectSinsListener?) { + if (connectThread != null && connectThread!!.isAlive && TextUtils.equals(lastIp, ip)) { + return + } + mListener = listener + lastIp = ip + connectThread = object : Thread() { + override fun run() { + try { + client = threadConnect.get() + if (client == null) { + client = Socket(ip, 8010) + client!!.soTimeout = 3000000 + client!!.keepAlive = true + threadConnect.set(client) + } + outStr = client!!.getOutputStream() + inStr = client!!.getInputStream() + if (tRecv != null) { + tRecv!!.cancel() + } + tRecv = RecvThread() + val thread = Thread(tRecv) + thread.start() + + //解析线程 + if (tParse != null) { + tParse!!.cancel() + } + tParse = ParseThread() + val parsethread = Thread(tParse) + parsethread.start() + + //socket启动成功 + val msg = Message() + msg.what = 0x33 + mHandler.sendMessage(msg) + if (!connectstatus) { + connectstatus = true // 更改连接状态 + } + } catch (e: Exception) { + e.printStackTrace() + //启动失败 + val msg = Message() + msg.what = 0x44 + mHandler.sendMessage(msg) + } + } + } + (connectThread as Thread).start() + } + + /** + * sock是否启动 + * + * @return true 启动 false停止 + */ + val isStart: Boolean + get() = if (connectThread != null && connectThread!!.isAlive) { + true + } else false + + /** + * 销毁连接 + */ + fun disconnect() { + try { + + //销毁线程 + if (tRecv != null) { + tRecv!!.cancel() + } + + //销毁线程 + if (tParse != null) { + tParse!!.cancel() + } + } catch (e: Exception) { + } + try { + if (outStr != null) outStr!!.close() + if (inStr != null) inStr!!.close() + if (client != null) client!!.close() + } catch (e: IOException) { + e.printStackTrace() + } + } + + /** + * 解析接收到得线程 + */ + private inner class ParseThread : Runnable { + private var runFlag = true + + //轨迹时间buffer + private val traceTimeBuffer = 1500 + private var timeIndex = 0 + fun cancel() { + runFlag = false + } + + override fun run() { + try { + while (runFlag) { + if (mTaskList.size > 0) { + timeIndex = mTaskList.size - 1 + val result = parseResult(mTaskList[timeIndex]) + var resultNiLocation: NiLocation? = null + if (result != null) { + when (result.type) { + 1 -> { + //先暂停播放 + val msg = Message() + msg.what = 0x22 + mHandler.sendMessage(msg) + val currentTime: Long = DateTimeUtil.getTimePointSSS( + result.data + ) + val currentTimeStr: String = DateTimeUtil.TimePointSSSToTime( + result.data + ) + val startTime = currentTime - traceTimeBuffer + val endTme = currentTime + traceTimeBuffer + + //转换为数据库时间 + val startTimeStr: String = + DateTimeUtil.getDateSimpleTime(startTime) + + //转换为数据库时间 + val endTimeStr: String = + DateTimeUtil.getDateSimpleTime(endTme) + if (!TextUtils.isEmpty(startTimeStr) && !TextUtils.isEmpty( + endTimeStr + ) + ) { + Log.e(TAG, "getTraceData开始") + val list: List? = + getTrackList(startTimeStr, endTimeStr, currentTimeStr) + Log.e(TAG, "getTraceData结束") + if (list != null && list.size > 0) { + var disTime: Long = 0 + + + //只有一个点不进行判断直接返回结果 + if (list.size == 1) { + resultNiLocation = list[0] + } else { + + //遍历集合取最近时间的轨迹点 + b@ for (nilocation in list) { + if (!TextUtils.isEmpty(nilocation.time)) { + + //只获取到秒的常量 + val time: Long = + nilocation.timeStamp.toLong() + + val disTimeTemp = abs(time - currentTime) + + //如果时间相同直接返回该点 + if (disTimeTemp == 0L) { + resultNiLocation = nilocation + break@b + } else { + + //第一次不对比,取当前值 + if (disTime == 0L) { + disTime = disTimeTemp + resultNiLocation = + nilocation + } else { + + //前一个差值大于当前差值则取当前相对小的值 + if (disTime - disTimeTemp > 0) { + disTime = disTimeTemp + resultNiLocation = + nilocation + } + } + } + } + } + } + } + } + val msg1 = Message() + msg1.what = 0x11 + msg1.obj = resultNiLocation + mHandler.sendMessage(msg1) + } + + 2 -> { + val msg4 = Message() + msg4.what = 0x55 + mHandler.sendMessage(msg4) + } + + 3 -> { + val msg5 = Message() + msg5.what = 0x66 + mHandler.sendMessage(msg5) + } + } + } + + + //解析时索引与集合索引对比,如果不相同代表有新命令,需要继续解析最后一条,否则清空集合不在解析 + try { + if (timeIndex == mTaskList.size - 1) { + mTaskList.clear() + } + } catch (e: Exception) { + } + val msg2 = Message() + msg2.what = 0x99 + mHandler.sendMessage(msg2) + } + } + } catch (e: Exception) { + e.printStackTrace() + val msg = Message() + msg.what = 0x99 + mHandler.sendMessage(msg) + } + } + } + + /** + * 获取轨迹数据 + * + * @param startTimeStr 起始时间 + * @param endTimeStr 结束时间 + * @param currentTimeStr 当前点时间,如果存在便直接获取一个点 + * @return list 数据集合 + */ + private fun getTrackList( + startTimeStr: String, + endTimeStr: String, + currentTimeStr: String + ): List? { + if (!TextUtils.isEmpty(startTimeStr) && !TextUtils.isEmpty(endTimeStr)) { + var startTime: Long = 0 + var endTime: Long = 0 + try { + startTime = startTimeStr.toLong() + endTime = endTimeStr.toLong() + } catch (e: java.lang.Exception) { + } + if (startTime != 0L && endTime != 0L) { + + val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) + + val list: MutableList = traceDataBase.niLocationDao.taskIdAndTimeTofindList(id.toString(),startTime,endTime) + + if (list.size > 0) return list + } + } + return null + } + + /** + * 接收管道数据 + */ + private inner class RecvThread : Runnable { + private var runFlag = true + fun cancel() { + runFlag = false + } + + override fun run() { + var rlRead: Int + try { + while (runFlag) { + var line: String = "" + if (!isServerClose) { + rlRead = inStr!!.read(sData) //对方断开返回-1 + if (rlRead > 0) { + Log.e(TAG, sData.toString() + "") + line = String(sData, 0, rlRead) + mTaskList.add(line) + } else { + connectFaild("连接断开") + } + } else { + connectFaild("连接断开") + } + } + } catch (e: IOException) { + connectFaild(e.toString()) + e.printStackTrace() + } + } + } + + /** + * 连接失败 + * @param e 原因 + */ + private fun connectFaild(e: String) { + val msg2 = Message() + msg2.what = 0x999 + mHandler.sendMessage(msg2) + } + + /** + * 判断是否断开连接,断开返回true,没有返回false + * @return + */ + val isServerClose: Boolean + get() { + return try { + client!!.sendUrgentData(0) //发送1个字节的紧急数据,默认情况下,服务器端没有开启紧急数据处理,不影响正常通信 + false + } catch (se: Exception) { + true + } + } + + /** + * 停止接收管道数据 + */ + fun stop() { + Log.e(TAG, "stop!") + connectstatus = false + if (tRecv != null) { + tRecv!!.cancel() + } + if (tParse != null) { + tParse!!.cancel() + } + } + + /** + * 开始接收管道数据 + */ + fun start() { + Log.e(TAG, "start!") + if (tRecv != null) { + tRecv!!.cancel() + } + tRecv = RecvThread() + val thread = Thread(tRecv) + thread.start() + + //解析线程 + if (tParse != null) { + tParse!!.cancel() + } + tParse = ParseThread() + val parsethread = Thread(tParse) + parsethread.start() + } + + fun setTraceMap() { + + } + + /** + * 轨迹反向控制回调接口 + */ + interface OnConnectSinsListener { + /** + * 连接状态 + * + * @param success true 连接成功 false 连接失败 + */ + fun onConnect(success: Boolean) + + /** + * 索引中 + */ + fun onIndexing() + + /** + * 暂停 + */ + fun onStop() + + /** + * 播放 + */ + fun onPlay() + + /** + * 结束完成 + */ + fun onParseEnd() + + /** + * 轨迹点 + * + * @param mNiLocation + */ + fun onReceiveLocation(mNiLocation: NiLocation?) + } + + /** + * 解析返回值 + * + * @return 时间信息 + */ + private fun parseResult(data: String): Result? { + var data = data + if (!TextUtils.isEmpty(data)) { + try { + data = data.replace("\n".toRegex(), "") + val json = JSONObject(data) + val type = json.optInt("type") + val mResult: Result = Result() + mResult.type = type + if (type == 1) { + mResult.data = json.optString("data", "") + } + return mResult + } catch (e: Exception) { + } + } + return null + } + + //结果类对象 + internal inner class Result : Serializable { + var type = 0 + var data: String? = null + } +} \ No newline at end of file diff --git a/collect-library/src/main/java/com/navinfo/collect/library/data/dao/impl/INiLocationDao.java b/collect-library/src/main/java/com/navinfo/collect/library/data/dao/impl/INiLocationDao.java index 9d362617..c4fa6f57 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/data/dao/impl/INiLocationDao.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/data/dao/impl/INiLocationDao.java @@ -47,6 +47,9 @@ public interface INiLocationDao { @Query("SELECT * FROM niLocation") List findAll(); + @Query("SELECT * FROM niLocation where time>=:startTime and time<=:endTime and taskId=:taskId") + List taskIdAndTimeTofindList(String taskId,long startTime,long endTime); + @Query("SELECT * FROM niLocation where taskId =:taskId") List findToTaskIdAll(String taskId); } From 45de9982fcf3e4132680cf3639b52faa772c58b7 Mon Sep 17 00:00:00 2001 From: qiji4215 Date: Wed, 19 Jul 2023 17:01:02 +0800 Subject: [PATCH 28/40] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AE=A4=E5=86=85?= =?UTF-8?q?=E6=95=B4=E7=90=86=E5=B7=A5=E5=85=B7=E5=8F=8D=E5=90=91=E6=8E=A7?= =?UTF-8?q?=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../omqs/ui/activity/map/MainActivity.kt | 151 +++++++++++++----- .../omqs/ui/activity/map/MainViewModel.kt | 98 +++++++++--- .../omqs/ui/activity/map/SocketServer.kt | 49 ++++-- .../omqs/ui/activity/scan/QRCodeViewModel.kt | 9 -- .../omqs/ui/activity/scan/QrCodeActivity.kt | 6 - .../personalcenter/PersonalCenterFragment.kt | 4 +- .../src/main/assets/editormarker.xml | 45 +++--- .../library/map/handler/MarkHandler.kt | 21 +++ 8 files changed, 272 insertions(+), 111 deletions(-) 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 ebb13c47..7869f445 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 @@ -185,6 +185,7 @@ class MainActivity : BaseActivity() { MotionEvent.ACTION_DOWN -> { voiceOnTouchStart()//Do Something } + MotionEvent.ACTION_UP -> { voiceOnTouchStop()//Do Something } @@ -235,13 +236,18 @@ class MainActivity : BaseActivity() { ) } - //捕捉列表变化回调 + //捕捉轨迹点 viewModel.liveDataNILocationList.observe(this) { - if(viewModel.isSelectTrace()){ + if (viewModel.isSelectTrace()) { //Toast.makeText(this,"轨迹被点击了",Toast.LENGTH_LONG).show() - viewModel.showMarker(this,it) - val traceVideoBean = TraceVideoBean(command = "videotime?", userid = Constant.USER_ID, time = "${it.time}:000") - viewModel.sendServerCommand(this,traceVideoBean) + viewModel.showMarker(this, it) + viewModel.setCurrentIndexNiLocation(it) + val traceVideoBean = TraceVideoBean( + command = "videotime?", + userid = Constant.USER_ID, + time = "${it.time}:000" + ) + viewModel.sendServerCommand(this, traceVideoBean,IndoorToolsCommand.SELECT_POINT) } } @@ -321,6 +327,49 @@ class MainActivity : BaseActivity() { } } + viewModel.liveIndoorToolsResp.observe(this){ + when(it){ + IndoorToolsResp.QR_CODE_STATUS_UPDATE_VIDEO_INFO_SUCCESS->{ + + if(viewModel.indoorToolsCommand==IndoorToolsCommand.SELECT_POINT){ + selectPointFinish(true) + } + + } + IndoorToolsResp.QR_CODE_STATUS_UPDATE_VIDEO_INFO_FAILURE->{ + if(viewModel.indoorToolsCommand==IndoorToolsCommand.SELECT_POINT){ + selectPointFinish(false) + } + } + } + } + + //室内整理工具反向控制 + viewModel.liveIndoorToolsCommand.observe(this) { + when (it) { + IndoorToolsCommand.PLAY -> { + setPlayStatus() + } + IndoorToolsCommand.INDEXING -> { + pausePlayTrace() + } + IndoorToolsCommand.SELECT_POINT -> { + + } + + IndoorToolsCommand.NEXT -> { + } + + IndoorToolsCommand.REWIND -> { + } + + IndoorToolsCommand.STOP -> { + //切换为暂停状态 + pausePlayTrace() + } + } + } + lifecycleScope.launch { // 初始化地图图层控制接收器 FlowEventBus.subscribe>( @@ -551,13 +600,10 @@ class MainActivity : BaseActivity() { viewModel.setSelectTrace(!viewModel.isSelectTrace()) binding.mainActivityTraceSnapshotPoints.isSelected = viewModel.isSelectTrace() - if(viewModel.isSelectTrace()){ - Toast.makeText(this,"请选择轨迹点!",Toast.LENGTH_LONG).show() + if (viewModel.isSelectTrace()) { + Toast.makeText(this, "请选择轨迹点!", Toast.LENGTH_LONG).show() //调用撤销自动播放 - binding.mainActivitySnapshotFinish.isEnabled = false - binding.mainActivitySnapshotRewind.isEnabled = false - binding.mainActivitySnapshotPause.isEnabled = false - binding.mainActivitySnapshotNext.isEnabled = false + setViewEnable(false) viewModel.cancelTrace() } } @@ -592,13 +638,17 @@ class MainActivity : BaseActivity() { @RequiresApi(Build.VERSION_CODES.N) fun rewindTraceOnclick() { pausePlayTrace() - val item = mapController.markerHandle.getNILocation(viewModel.currentIndexNiLocation-1) - if(item!=null){ - viewModel.currentIndexNiLocation = viewModel.currentIndexNiLocation-1 - viewModel.showMarker(this,(item as MarkerItem).uid as NiLocation) - val traceVideoBean = TraceVideoBean(command = "videotime?", userid = Constant.USER_ID, time = "${(item.uid as NiLocation).time}:000") - viewModel.sendServerCommand(this,traceVideoBean) - }else{ + val item = mapController.markerHandle.getNILocation(viewModel.getCurrentNiLocationIndex() - 1) + if (item != null) { + viewModel.setCurrentIndexLoction(viewModel.getCurrentNiLocationIndex() - 1) + viewModel.showMarker(this, (item as MarkerItem).uid as NiLocation) + val traceVideoBean = TraceVideoBean( + command = "videotime?", + userid = Constant.USER_ID, + time = "${(item.uid as NiLocation).time}:000" + ) + viewModel.sendServerCommand(this, traceVideoBean,IndoorToolsCommand.REWIND) + } else { dealNoData() } } @@ -612,24 +662,24 @@ class MainActivity : BaseActivity() { binding.mainActivitySnapshotPause.isSelected = viewModel.isSelectPauseTrace() viewModel.setSelectTrace(false) binding.mainActivityTraceSnapshotPoints.isSelected = viewModel.isSelectTrace() - if(viewModel.isSelectPauseTrace()){ + if (viewModel.isSelectPauseTrace()) { playVideo() - }else{ + } else { pauseVideo() viewModel.cancelTrace() } } @RequiresApi(Build.VERSION_CODES.N) - fun playVideo(){ - if (mapController.markerHandle.getCurrentMark()==null) { + fun playVideo() { + if (mapController.markerHandle.getCurrentMark() == null) { BaseToast.makeText(this, "请先选择轨迹点!", BaseToast.LENGTH_SHORT).show() return } viewModel.setSelectTrace(false) binding.mainActivityTraceSnapshotPoints.isSelected = viewModel.isSelectTrace() val traceVideoBean = TraceVideoBean(command = "playVideo?", userid = Constant.USER_ID) - viewModel.sendServerCommand(this,traceVideoBean) + viewModel.sendServerCommand(this, traceVideoBean,IndoorToolsCommand.PLAY) } /** @@ -644,9 +694,9 @@ class MainActivity : BaseActivity() { } @RequiresApi(Build.VERSION_CODES.N) - fun pauseVideo(){ + fun pauseVideo() { val traceVideoBean = TraceVideoBean(command = "pauseVideo?", userid = Constant.USER_ID) - viewModel.sendServerCommand(this,traceVideoBean) + viewModel.sendServerCommand(this, traceVideoBean,IndoorToolsCommand.STOP) } /** @@ -655,13 +705,17 @@ class MainActivity : BaseActivity() { @RequiresApi(Build.VERSION_CODES.N) fun nextTraceOnclick() { pausePlayTrace() - val item = mapController.markerHandle.getNILocation(viewModel.currentIndexNiLocation+1) - if(item!=null){ - viewModel.currentIndexNiLocation = viewModel.currentIndexNiLocation+1 - viewModel.showMarker(this,(item as MarkerItem).uid as NiLocation) - val traceVideoBean = TraceVideoBean(command = "videotime?", userid = Constant.USER_ID, time = "${(item.uid as NiLocation).time}:000") - viewModel.sendServerCommand(this,traceVideoBean) - }else{ + val item = mapController.markerHandle.getNILocation(viewModel.getCurrentNiLocationIndex() + 1) + if (item != null) { + viewModel.setCurrentIndexLoction(viewModel.getCurrentNiLocationIndex()+1) + viewModel.showMarker(this, (item as MarkerItem).uid as NiLocation) + val traceVideoBean = TraceVideoBean( + command = "videotime?", + userid = Constant.USER_ID, + time = "${(item.uid as NiLocation).time}:000" + ) + viewModel.sendServerCommand(this, traceVideoBean,IndoorToolsCommand.NEXT) + } else { dealNoData() } } @@ -688,6 +742,26 @@ class MainActivity : BaseActivity() { viewModel.cancelTrace() } + /** + * 选点结束 + * @param value true 选点成功 false 选点失败 + */ + @RequiresApi(Build.VERSION_CODES.N) + private fun selectPointFinish(value: Boolean) { + if (value) { + setViewEnable(true) + viewModel.setSelectPauseTrace(false) + binding.mainActivitySnapshotPause.isSelected = viewModel.isSelectPauseTrace() + } + } + + private fun setViewEnable(value: Boolean){ + binding.mainActivitySnapshotRewind.isEnabled = value + binding.mainActivitySnapshotNext.isEnabled = value + binding.mainActivitySnapshotPause.isEnabled = value + binding.mainActivitySnapshotFinish.isEnabled = value + } + /** * 打开或关闭底部导航栏 @@ -708,7 +782,12 @@ class MainActivity : BaseActivity() { mapController.mMapView.setScaleBarLayer(GLViewport.Position.BOTTOM_CENTER, 128, 65) } mapController.mMapView.vtmMap.animator() - .animateTo(GeoPoint( mapController.mMapView.vtmMap.mapPosition.geoPoint.latitude,mapController.mMapView.vtmMap.mapPosition.geoPoint.longitude)) + .animateTo( + GeoPoint( + mapController.mMapView.vtmMap.mapPosition.geoPoint.latitude, + mapController.mMapView.vtmMap.mapPosition.geoPoint.longitude + ) + ) } @RequiresApi(Build.VERSION_CODES.N) @@ -769,14 +848,14 @@ class MainActivity : BaseActivity() { */ fun showIndoorDataLayout() { binding.mainActivityMenuIndoorGroup.visibility = View.VISIBLE - if(Constant.INDOOR_IP.isNotEmpty()){ + if (Constant.INDOOR_IP.isNotEmpty()) { setIndoorGroupEnable(true) - }else{ + } else { setIndoorGroupEnable(false) } } - private fun setIndoorGroupEnable(enable: Boolean){ + private fun setIndoorGroupEnable(enable: Boolean) { binding.mainActivitySnapshotFinish.isEnabled = enable binding.mainActivityTraceSnapshotPoints.isEnabled = enable binding.mainActivitySnapshotMediaFlag.isEnabled = enable 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 d00460e5..f180c729 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 @@ -43,6 +43,7 @@ import com.navinfo.omqs.ui.manager.TakePhotoManager import com.navinfo.omqs.ui.other.BaseToast import com.navinfo.omqs.ui.widget.SignUtil import com.navinfo.omqs.util.DateTimeUtil +import com.navinfo.omqs.util.ShareUtil import com.navinfo.omqs.util.SoundMeter import com.navinfo.omqs.util.SpeakMode import dagger.hilt.android.lifecycle.HiltViewModel @@ -74,7 +75,7 @@ class MainViewModel @Inject constructor( private val realmOperateHelper: RealmOperateHelper, private val networkService: NetworkService, private val sharedPreferences: SharedPreferences -) : ViewModel(),SocketServer.OnConnectSinsListener{ +) : ViewModel(), SocketServer.OnConnectSinsListener { private var mCameraDialog: CommonDialog? = null @@ -130,10 +131,10 @@ class MainViewModel @Inject constructor( val liveDataCenterPoint = MutableLiveData() //状态 - val qrCodeStatus: MutableLiveData = MutableLiveData() + val liveIndoorToolsResp: MutableLiveData = MutableLiveData() //状态 - val indoorToolsStatus: MutableLiveData = MutableLiveData() + val liveIndoorToolsCommand: MutableLiveData = MutableLiveData() /** * 是不是线选择模式 @@ -159,9 +160,11 @@ class MainViewModel @Inject constructor( private var lastNiLocaion: NiLocation? = null - var currentIndexNiLocation: Int = 0 + private var currentIndexNiLocation: Int = 0 - private var socketServer:SocketServer? = null + private var socketServer: SocketServer? = null + + var indoorToolsCommand: IndoorToolsCommand? = null init { mapController.mMapView.vtmMap.events.bind(Map.UpdateListener { e, mapPosition -> @@ -208,7 +211,7 @@ class MainViewModel @Inject constructor( initNILocationData() } - socketServer = SocketServer(mapController,traceDataBase,sharedPreferences) + socketServer = SocketServer(mapController, traceDataBase, sharedPreferences) } /** @@ -277,6 +280,7 @@ class MainViewModel @Inject constructor( @RequiresApi(Build.VERSION_CODES.N) private fun initLocation() { + val shareUtil = ShareUtil(mapController.mMapView.context, 1) //用于定位点存储到数据库 viewModelScope.launch(Dispatchers.Default) { //用于定位点捕捉道路 @@ -309,20 +313,20 @@ class MainViewModel @Inject constructor( } val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) location.taskId = id.toString() + if (shareUtil.connectstate) { + location.media = 1 + } + var disance = 0.0 //增加间距判断 if (lastNiLocaion != null) { - val disance = GeometryTools.getDistance( + disance = GeometryTools.getDistance( location.latitude, location.longitude, lastNiLocaion!!.latitude, lastNiLocaion!!.longitude ) - //相距差距大于2.5米以上进行存储 - if (disance > 2.5 && disance < 60) { - traceDataBase.niLocationDao.insert(location) - mapController.markerHandle.addNiLocationMarkerItem(location) - mapController.mMapView.vtmMap.updateMap(true) - lastNiLocaion = location - } - } else { + + } + //室内整理工具时不能进行轨迹存储,判断轨迹间隔要超过2.5并小于60米 + if (Constant.INDOOR_IP.isEmpty() && (disance == 0.0 || (disance > 2.5 && disance < 60))) { traceDataBase.niLocationDao.insert(location) mapController.markerHandle.addNiLocationMarkerItem(location) mapController.mMapView.vtmMap.updateMap(true) @@ -699,13 +703,19 @@ class MainViewModel @Inject constructor( liveDataSignMoreInfo.value = data } - fun sendServerCommand(context: Context, traceVideoBean: TraceVideoBean) { + fun sendServerCommand( + context: Context, + traceVideoBean: TraceVideoBean, + indoorToolsCommand: IndoorToolsCommand + ) { if (TextUtils.isEmpty(Constant.INDOOR_IP)) { Toast.makeText(context, "获取ip失败!", Toast.LENGTH_LONG).show() return } + this.indoorToolsCommand = indoorToolsCommand + viewModelScope.launch(Dispatchers.Default) { val url = "http://${Constant.INDOOR_IP}:8080/sensor/service/${traceVideoBean.command}?" @@ -728,7 +738,8 @@ class MainViewModel @Inject constructor( "命令成功。", Toast.LENGTH_LONG ).show() - qrCodeStatus.postValue(QrCodeStatus.QR_CODE_STATUS_UPDATE_VIDEO_INFO_SUCCESS) + + liveIndoorToolsResp.postValue(IndoorToolsResp.QR_CODE_STATUS_UPDATE_VIDEO_INFO_SUCCESS) //启动双向控制服务 @@ -750,6 +761,7 @@ class MainViewModel @Inject constructor( ) .show() } + liveIndoorToolsResp.postValue(IndoorToolsResp.QR_CODE_STATUS_UPDATE_VIDEO_INFO_FAILURE) } } catch (e: IOException) { @@ -773,7 +785,7 @@ class MainViewModel @Inject constructor( ) .show() } - qrCodeStatus.postValue(QrCodeStatus.QR_CODE_STATUS_NET_FAILURE) + liveIndoorToolsResp.postValue(IndoorToolsResp.QR_CODE_STATUS_UPDATE_VIDEO_INFO_FAILURE) } is NetResult.Failure<*> -> { @@ -785,7 +797,7 @@ class MainViewModel @Inject constructor( ) .show() } - qrCodeStatus.postValue(QrCodeStatus.QR_CODE_STATUS_NET_FAILURE) + liveIndoorToolsResp.postValue(IndoorToolsResp.QR_CODE_STATUS_UPDATE_VIDEO_INFO_FAILURE) } else -> {} @@ -814,6 +826,34 @@ class MainViewModel @Inject constructor( } } + /** + * 显示索引位置 + * @param niLocation 轨迹点 + */ + fun setCurrentIndexNiLocation(niLocation: NiLocation) { + viewModelScope.launch ( Dispatchers.IO ){ + Log.e("qj","开始$currentIndexNiLocation") + currentIndexNiLocation = mapController.markerHandle.getNILocationIndex(niLocation)!! + Log.e("qj","结束$currentIndexNiLocation") + } + } + + /** + * 设置索引位置 + * @param index 索引 + */ + fun setCurrentIndexLoction(index: Int) { + currentIndexNiLocation = index + } + + /** + * + * @return index 索引 + */ + fun getCurrentNiLocationIndex(): Int { + return currentIndexNiLocation + } + /** * 结束自动播放 */ @@ -833,22 +873,32 @@ class MainViewModel @Inject constructor( override fun onIndexing() { //切换为暂停状态 - indoorToolsStatus.postValue(IndoorToolsStatus.PAUSE) + liveIndoorToolsCommand.postValue(IndoorToolsCommand.INDEXING) } override fun onStop() { - TODO("Not yet implemented") + liveIndoorToolsCommand.postValue(IndoorToolsCommand.STOP) } override fun onPlay() { - TODO("Not yet implemented") + liveIndoorToolsCommand.postValue(IndoorToolsCommand.PLAY) } override fun onParseEnd() { - TODO("Not yet implemented") + } override fun onReceiveLocation(mNiLocation: NiLocation?) { - TODO("Not yet implemented") + if (mNiLocation != null) { + setCurrentIndexNiLocation(mNiLocation) + showMarker(mapController.mMapView.context, mNiLocation) + Log.e("qj","反向控制$currentIndexNiLocation") + } else { + BaseToast.makeText( + mapController.mMapView.context, + "没有找到对应轨迹点!", + Toast.LENGTH_SHORT + ).show() + } } } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/SocketServer.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/SocketServer.kt index 1f6cbb10..b2d0a9dd 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/SocketServer.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/SocketServer.kt @@ -24,11 +24,25 @@ import java.util.Collections import kotlin.math.abs -enum class IndoorToolsStatus { - PAUSE, +enum class IndoorToolsCommand { PLAY, + SELECT_POINT, + INDEXING, NEXT, - REWIND + REWIND, + STOP +} + +enum class IndoorToolsResp{ + /** + * 信息更新轨迹成功 + */ + QR_CODE_STATUS_UPDATE_VIDEO_INFO_SUCCESS, + + /** + * 信息更新轨迹失败 + */ + QR_CODE_STATUS_UPDATE_VIDEO_INFO_FAILURE, } /** @@ -264,6 +278,7 @@ class SocketServer( timeIndex = mTaskList.size - 1 val result = parseResult(mTaskList[timeIndex]) var resultNiLocation: NiLocation? = null + var index: Int = -1 if (result != null) { when (result.type) { 1 -> { @@ -277,6 +292,9 @@ class SocketServer( val currentTimeStr: String = DateTimeUtil.TimePointSSSToTime( result.data ) + + Log.e(TAG, "反向"+result.data) + val startTime = currentTime - traceTimeBuffer val endTme = currentTime + traceTimeBuffer @@ -291,21 +309,23 @@ class SocketServer( endTimeStr ) ) { + Log.e(TAG, "getTraceData开始") - val list: List? = - getTrackList(startTimeStr, endTimeStr, currentTimeStr) + + val list: List? = getTrackList(startTimeStr, endTimeStr, currentTimeStr) + Log.e(TAG, "getTraceData结束") + if (list != null && list.size > 0) { + var disTime: Long = 0 - - //只有一个点不进行判断直接返回结果 if (list.size == 1) { resultNiLocation = list[0] } else { - //遍历集合取最近时间的轨迹点 b@ for (nilocation in list) { + if (!TextUtils.isEmpty(nilocation.time)) { //只获取到秒的常量 @@ -323,15 +343,13 @@ class SocketServer( //第一次不对比,取当前值 if (disTime == 0L) { disTime = disTimeTemp - resultNiLocation = - nilocation + resultNiLocation = nilocation } else { //前一个差值大于当前差值则取当前相对小的值 if (disTime - disTimeTemp > 0) { disTime = disTimeTemp - resultNiLocation = - nilocation + resultNiLocation = nilocation } } } @@ -343,6 +361,9 @@ class SocketServer( val msg1 = Message() msg1.what = 0x11 msg1.obj = resultNiLocation + if (resultNiLocation != null) { + Log.e(TAG, "反向app"+resultNiLocation.time) + } mHandler.sendMessage(msg1) } @@ -373,6 +394,7 @@ class SocketServer( mHandler.sendMessage(msg2) } } + Thread.sleep(10) } catch (e: Exception) { e.printStackTrace() val msg = Message() @@ -407,7 +429,7 @@ class SocketServer( val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) - val list: MutableList = traceDataBase.niLocationDao.taskIdAndTimeTofindList(id.toString(),startTime,endTime) + val list: MutableList = traceDataBase.niLocationDao.findToTaskIdAll(id.toString()) if (list.size > 0) return list } @@ -442,6 +464,7 @@ class SocketServer( connectFaild("连接断开") } } + Thread.sleep(10) } catch (e: IOException) { connectFaild(e.toString()) e.printStackTrace() diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QRCodeViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QRCodeViewModel.kt index 566a92aa..f6122749 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QRCodeViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QRCodeViewModel.kt @@ -34,15 +34,6 @@ enum class QrCodeStatus { */ QR_CODE_STATUS_SERVER_INFO_SUCCESS, - /** - * 信息更新轨迹成功 - */ - QR_CODE_STATUS_UPDATE_VIDEO_INFO_SUCCESS, - - /** - * 信息更新轨迹失败 - */ - QR_CODE_STATUS_UPDATE_VIDEO_INFO_FAILURE, } @HiltViewModel diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QrCodeActivity.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QrCodeActivity.kt index 876c1ab6..12706f25 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QrCodeActivity.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/scan/QrCodeActivity.kt @@ -61,12 +61,6 @@ class QrCodeActivity : BaseActivity() { } QrCodeStatus.QR_CODE_STATUS_SERVER_INFO_SUCCESS -> { - } - QrCodeStatus.QR_CODE_STATUS_UPDATE_VIDEO_INFO_SUCCESS -> { - - } - QrCodeStatus.QR_CODE_STATUS_UPDATE_VIDEO_INFO_FAILURE -> { - } } } 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 81eef41b..bf6627a5 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 @@ -116,10 +116,10 @@ class PersonalCenterFragment(private var indoorDataListener: ((Boolean) -> Unit? } R.id.personal_center_menu_test -> { viewModel.readRealmData() - //108.91056000267433 34.29635901721207 + //108.90107116103331 34.29568928574205 // 定位到指定位置 niMapController.mMapView.vtmMap.animator() - .animateTo(GeoPoint( 34.29635901721207, 108.91056000267433)) + .animateTo(GeoPoint( 34.29568928574205, 108.90107116103331)) } // R.id.personal_center_menu_task_list -> { // findNavController().navigate(R.id.TaskManagerFragment) diff --git a/collect-library/src/main/assets/editormarker.xml b/collect-library/src/main/assets/editormarker.xml index 0b7a0264..0b5e0573 100644 --- a/collect-library/src/main/assets/editormarker.xml +++ b/collect-library/src/main/assets/editormarker.xml @@ -1707,48 +1707,52 @@ 0 - + + + + + + <!–不应用–> - + <!–无标线无可区分边界–> - + <!–标线–> - + <!–路牙–> - + <!–护栏–> - + <!–墙–> - + <!–道路面铺设边缘–> - + <!–虚拟三角岛–> - + <!–杆状障碍物–> - + --> @@ -1758,9 +1762,9 @@ - + - + @@ -1772,12 +1776,12 @@ - + - + + <!–导流区边线–> - - - - - + --> + + + diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt index 0c4bb225..5ce2872d 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt @@ -766,6 +766,27 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : } } + fun getNILocationIndex(niLocation: NiLocation):Int?{ + + var list = niLocationItemizedLayer.itemList + + if(niLocation!=null&&list.isNotEmpty()){ + + var index = -1 + + list.forEach{ + + index += 1 + + if(((it as MarkerItem).uid as NiLocation).id.equals(niLocation.id)){ + return index + } + } + } + + return -1 + } + } interface OnQsRecordItemClickListener { From 58f5329a75548fbf28742e7ee34e804b3dfa301a Mon Sep 17 00:00:00 2001 From: qiji4215 Date: Wed, 19 Jul 2023 17:40:44 +0800 Subject: [PATCH 29/40] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=9B=B8=E6=9C=BA?= =?UTF-8?q?=E8=87=AA=E5=8A=A8=E9=87=8D=E6=96=B0=E8=BF=9E=E6=8E=A5=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../omqs/ui/activity/map/MainActivity.kt | 52 +++++++++++-------- .../omqs/ui/activity/map/MainViewModel.kt | 51 +++++++++++++----- .../navinfo/omqs/ui/dialog/CommonDialog.java | 3 +- 3 files changed, 70 insertions(+), 36 deletions(-) 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 7869f445..c6e81e85 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 @@ -247,7 +247,7 @@ class MainActivity : BaseActivity() { userid = Constant.USER_ID, time = "${it.time}:000" ) - viewModel.sendServerCommand(this, traceVideoBean,IndoorToolsCommand.SELECT_POINT) + viewModel.sendServerCommand(this, traceVideoBean, IndoorToolsCommand.SELECT_POINT) } } @@ -327,17 +327,18 @@ class MainActivity : BaseActivity() { } } - viewModel.liveIndoorToolsResp.observe(this){ - when(it){ - IndoorToolsResp.QR_CODE_STATUS_UPDATE_VIDEO_INFO_SUCCESS->{ + viewModel.liveIndoorToolsResp.observe(this) { + when (it) { + IndoorToolsResp.QR_CODE_STATUS_UPDATE_VIDEO_INFO_SUCCESS -> { - if(viewModel.indoorToolsCommand==IndoorToolsCommand.SELECT_POINT){ + if (viewModel.indoorToolsCommand == IndoorToolsCommand.SELECT_POINT) { selectPointFinish(true) } } - IndoorToolsResp.QR_CODE_STATUS_UPDATE_VIDEO_INFO_FAILURE->{ - if(viewModel.indoorToolsCommand==IndoorToolsCommand.SELECT_POINT){ + + IndoorToolsResp.QR_CODE_STATUS_UPDATE_VIDEO_INFO_FAILURE -> { + if (viewModel.indoorToolsCommand == IndoorToolsCommand.SELECT_POINT) { selectPointFinish(false) } } @@ -350,9 +351,11 @@ class MainActivity : BaseActivity() { IndoorToolsCommand.PLAY -> { setPlayStatus() } + IndoorToolsCommand.INDEXING -> { pausePlayTrace() } + IndoorToolsCommand.SELECT_POINT -> { } @@ -389,8 +392,13 @@ class MainActivity : BaseActivity() { } } - supportFragmentManager.beginTransaction() - .add(R.id.console_fragment_layout, ConsoleFragment()).commit() + //自动连接相机 + if (viewModel.isAutoCamera()) { + viewModel.autoCamera() + } else { + supportFragmentManager.beginTransaction() + .add(R.id.console_fragment_layout, ConsoleFragment()).commit() + } } //根据输入的经纬度跳转坐标 @@ -638,7 +646,8 @@ class MainActivity : BaseActivity() { @RequiresApi(Build.VERSION_CODES.N) fun rewindTraceOnclick() { pausePlayTrace() - val item = mapController.markerHandle.getNILocation(viewModel.getCurrentNiLocationIndex() - 1) + val item = + mapController.markerHandle.getNILocation(viewModel.getCurrentNiLocationIndex() - 1) if (item != null) { viewModel.setCurrentIndexLoction(viewModel.getCurrentNiLocationIndex() - 1) viewModel.showMarker(this, (item as MarkerItem).uid as NiLocation) @@ -647,7 +656,7 @@ class MainActivity : BaseActivity() { userid = Constant.USER_ID, time = "${(item.uid as NiLocation).time}:000" ) - viewModel.sendServerCommand(this, traceVideoBean,IndoorToolsCommand.REWIND) + viewModel.sendServerCommand(this, traceVideoBean, IndoorToolsCommand.REWIND) } else { dealNoData() } @@ -679,7 +688,7 @@ class MainActivity : BaseActivity() { viewModel.setSelectTrace(false) binding.mainActivityTraceSnapshotPoints.isSelected = viewModel.isSelectTrace() val traceVideoBean = TraceVideoBean(command = "playVideo?", userid = Constant.USER_ID) - viewModel.sendServerCommand(this, traceVideoBean,IndoorToolsCommand.PLAY) + viewModel.sendServerCommand(this, traceVideoBean, IndoorToolsCommand.PLAY) } /** @@ -696,7 +705,7 @@ class MainActivity : BaseActivity() { @RequiresApi(Build.VERSION_CODES.N) fun pauseVideo() { val traceVideoBean = TraceVideoBean(command = "pauseVideo?", userid = Constant.USER_ID) - viewModel.sendServerCommand(this, traceVideoBean,IndoorToolsCommand.STOP) + viewModel.sendServerCommand(this, traceVideoBean, IndoorToolsCommand.STOP) } /** @@ -705,16 +714,17 @@ class MainActivity : BaseActivity() { @RequiresApi(Build.VERSION_CODES.N) fun nextTraceOnclick() { pausePlayTrace() - val item = mapController.markerHandle.getNILocation(viewModel.getCurrentNiLocationIndex() + 1) + val item = + mapController.markerHandle.getNILocation(viewModel.getCurrentNiLocationIndex() + 1) if (item != null) { - viewModel.setCurrentIndexLoction(viewModel.getCurrentNiLocationIndex()+1) + viewModel.setCurrentIndexLoction(viewModel.getCurrentNiLocationIndex() + 1) viewModel.showMarker(this, (item as MarkerItem).uid as NiLocation) val traceVideoBean = TraceVideoBean( command = "videotime?", userid = Constant.USER_ID, time = "${(item.uid as NiLocation).time}:000" ) - viewModel.sendServerCommand(this, traceVideoBean,IndoorToolsCommand.NEXT) + viewModel.sendServerCommand(this, traceVideoBean, IndoorToolsCommand.NEXT) } else { dealNoData() } @@ -755,11 +765,11 @@ class MainActivity : BaseActivity() { } } - private fun setViewEnable(value: Boolean){ - binding.mainActivitySnapshotRewind.isEnabled = value - binding.mainActivitySnapshotNext.isEnabled = value - binding.mainActivitySnapshotPause.isEnabled = value - binding.mainActivitySnapshotFinish.isEnabled = value + private fun setViewEnable(value: Boolean) { + binding.mainActivitySnapshotRewind.isEnabled = value + binding.mainActivitySnapshotNext.isEnabled = value + binding.mainActivitySnapshotPause.isEnabled = value + binding.mainActivitySnapshotFinish.isEnabled = value } 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 f180c729..e7c29ed3 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 @@ -24,6 +24,7 @@ import androidx.navigation.findNavController import com.blankj.utilcode.util.ToastUtils import com.navinfo.collect.library.data.dao.impl.TraceDataBase import com.navinfo.collect.library.data.entity.* +import com.navinfo.collect.library.garminvirbxe.HostBean import com.navinfo.collect.library.map.NIMapController import com.navinfo.collect.library.map.handler.OnQsRecordItemClickListener import com.navinfo.collect.library.utils.GeometryTools @@ -37,7 +38,6 @@ import com.navinfo.omqs.bean.TraceVideoBean import com.navinfo.omqs.db.RealmOperateHelper import com.navinfo.omqs.http.NetResult import com.navinfo.omqs.http.NetworkService -import com.navinfo.omqs.ui.activity.scan.QrCodeStatus import com.navinfo.omqs.ui.dialog.CommonDialog import com.navinfo.omqs.ui.manager.TakePhotoManager import com.navinfo.omqs.ui.other.BaseToast @@ -166,6 +166,8 @@ class MainViewModel @Inject constructor( var indoorToolsCommand: IndoorToolsCommand? = null + private var shareUtil: ShareUtil? = null + init { mapController.mMapView.vtmMap.events.bind(Map.UpdateListener { e, mapPosition -> when (e) { @@ -190,6 +192,8 @@ class MainViewModel @Inject constructor( } }) + shareUtil = ShareUtil(mapController.mMapView.context, 1) + initLocation() //处理地图点击操作 @@ -280,7 +284,6 @@ class MainViewModel @Inject constructor( @RequiresApi(Build.VERSION_CODES.N) private fun initLocation() { - val shareUtil = ShareUtil(mapController.mMapView.context, 1) //用于定位点存储到数据库 viewModelScope.launch(Dispatchers.Default) { //用于定位点捕捉道路 @@ -313,7 +316,7 @@ class MainViewModel @Inject constructor( } val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) location.taskId = id.toString() - if (shareUtil.connectstate) { + if (shareUtil?.connectstate == true) { location.media = 1 } var disance = 0.0 @@ -504,17 +507,8 @@ class MainViewModel @Inject constructor( Log.e("qj", LibVlcUtil.hasCompatibleCPU(context).toString()) - if (mCameraDialog == null) { - mCameraDialog = CommonDialog( - context, - context.resources.getDimension(R.dimen.head_img_width) - .toInt() * 3 + context.resources.getDimension(R.dimen.ten) - .toInt() + context.resources.getDimension(R.dimen.twenty_four).toInt(), - context.resources.getDimension(R.dimen.head_img_width).toInt() + 10, - 1 - ) - mCameraDialog!!.setCancelable(true) - } + initCameraDialog(context) + mCameraDialog!!.openCamear(mCameraDialog!!.getmShareUtil().continusTakePhotoState) mCameraDialog!!.show() mCameraDialog!!.setOnDismissListener(DialogInterface.OnDismissListener { @@ -539,6 +533,20 @@ class MainViewModel @Inject constructor( }) } + private fun initCameraDialog(context:Context){ + if (mCameraDialog == null) { + mCameraDialog = CommonDialog( + context, + context.resources.getDimension(R.dimen.head_img_width) + .toInt() * 3 + context.resources.getDimension(R.dimen.ten) + .toInt() + context.resources.getDimension(R.dimen.twenty_four).toInt(), + context.resources.getDimension(R.dimen.head_img_width).toInt() + 10, + 1 + ) + mCameraDialog!!.setCancelable(true) + } + } + fun startSoundMetter(context: Context, v: View) { //语音识别动画 @@ -901,4 +909,19 @@ class MainViewModel @Inject constructor( ).show() } } + + fun isAutoCamera():Boolean{ + + return shareUtil?.connectstate == true + } + + fun autoCamera(){ + if (shareUtil?.connectstate == true) { + val hostBean1 = HostBean() + hostBean1.ipAddress = shareUtil!!.takeCameraIP + hostBean1.hardwareAddress = shareUtil!!.takeCameraMac + onClickCameraButton(mapController.mMapView.context) + mCameraDialog?.connection(hostBean1) + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/dialog/CommonDialog.java b/app/src/main/java/com/navinfo/omqs/ui/dialog/CommonDialog.java index 4cac5dc0..5168b7e0 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/dialog/CommonDialog.java +++ b/app/src/main/java/com/navinfo/omqs/ui/dialog/CommonDialog.java @@ -676,6 +676,7 @@ public class CommonDialog extends Dialog implements SurfaceHolder.Callback, IVid //当前为连接时启动已有的状态 if (connectstate) { + mOneBtConnect.setPressed(true); mOneBtConnect.setBackgroundResource(R.drawable.shape_btn_red_disconnect_bg); @@ -1525,7 +1526,7 @@ public class CommonDialog extends Dialog implements SurfaceHolder.Callback, IVid } //连接 - private void connection(HostBean hostBean) { + public void connection(HostBean hostBean) { if (hostBean != null) { SensorParams params = new SensorParams(); From 392fb91215150a30ff4342076e10d8d7a3b72f6b Mon Sep 17 00:00:00 2001 From: qiji4215 Date: Wed, 19 Jul 2023 17:46:50 +0800 Subject: [PATCH 30/40] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=AE=9A=E4=BD=8D=E5=BC=80=E5=85=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/navinfo/omqs/Constant.kt | 5 +++++ .../navinfo/omqs/ui/activity/map/MainViewModel.kt | 4 ++++ .../personalcenter/PersonalCenterFragment.kt | 7 +++++++ app/src/main/res/menu/personal_center_menu.xml | 12 ++++++++++++ 4 files changed, 28 insertions(+) diff --git a/app/src/main/java/com/navinfo/omqs/Constant.kt b/app/src/main/java/com/navinfo/omqs/Constant.kt index f67ca0a6..7affaaab 100644 --- a/app/src/main/java/com/navinfo/omqs/Constant.kt +++ b/app/src/main/java/com/navinfo/omqs/Constant.kt @@ -59,6 +59,11 @@ class Constant { const val DEBUG = true + /** + * 是否自动定位 + */ + var AUTO_LOCATION = 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/MainViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt index e7c29ed3..18e02a77 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 @@ -352,6 +352,10 @@ class MainViewModel @Inject constructor( ) ) } + if(Constant.AUTO_LOCATION){ + mapController.mMapView.vtmMap.animator() + .animateTo(GeoPoint( location.longitude, location.latitude)) + } } } //显示轨迹图层 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 bf6627a5..afedf335 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 @@ -17,6 +17,7 @@ import com.github.k1rakishou.fsaf.callback.FSAFActivityCallbacks import com.github.k1rakishou.fsaf.callback.FileChooserCallback import com.navinfo.collect.library.data.entity.TaskBean import com.navinfo.collect.library.map.NIMapController +import com.navinfo.omqs.Constant import com.navinfo.omqs.R import com.navinfo.omqs.databinding.FragmentPersonalCenterBinding import com.navinfo.omqs.db.ImportOMDBHelper @@ -114,6 +115,12 @@ class PersonalCenterFragment(private var indoorDataListener: ((Boolean) -> Unit? } }) } + R.id.personal_center_menu_open_auto_location -> { + Constant.AUTO_LOCATION = true + } + R.id.personal_center_menu_close_auto_location -> { + Constant.AUTO_LOCATION = false + } R.id.personal_center_menu_test -> { viewModel.readRealmData() //108.90107116103331 34.29568928574205 diff --git a/app/src/main/res/menu/personal_center_menu.xml b/app/src/main/res/menu/personal_center_menu.xml index 50b4e070..e457c118 100644 --- a/app/src/main/res/menu/personal_center_menu.xml +++ b/app/src/main/res/menu/personal_center_menu.xml @@ -56,6 +56,18 @@ + + + + Date: Thu, 20 Jul 2023 10:48:38 +0800 Subject: [PATCH 31/40] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E7=BC=93=E5=AD=98=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../omqs/ui/activity/login/LoginViewModel.kt | 64 +++++++++++++++---- .../omqs/ui/activity/map/MainActivity.kt | 2 +- .../java/com/navinfo/omqs/util/ShareUtil.java | 1 + app/src/main/res/layout/activity_main.xml | 1 + .../src/main/assets/editormarker.xml | 15 ++++- 5 files changed, 65 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt index 095664d1..086a2e19 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt @@ -1,6 +1,7 @@ package com.navinfo.omqs.ui.activity.login import android.content.Context +import android.content.SharedPreferences import android.util.Log import android.view.View import android.widget.Toast @@ -16,11 +17,11 @@ import com.navinfo.omqs.http.DefaultResponse import com.navinfo.omqs.http.NetResult import com.navinfo.omqs.http.NetworkService import com.navinfo.omqs.tools.FileManager +import com.navinfo.omqs.util.NetUtils import dagger.hilt.android.lifecycle.HiltViewModel import io.realm.Realm import io.realm.RealmConfiguration import kotlinx.coroutines.* -import retrofit2.Response import java.io.File import java.io.IOException import javax.inject.Inject @@ -73,7 +74,9 @@ class LoginViewModel @Inject constructor( //是不是登录成功 val loginStatus: MutableLiveData = MutableLiveData() - var jobLogin: Job? = null; + var jobLogin: Job? = null + + var sharedPreferences: SharedPreferences? = null init { loginUser.value = LoginUserBean(userCode = "haofuyue00213", passWord = "123456") @@ -98,10 +101,26 @@ class LoginViewModel @Inject constructor( if (password.isEmpty()) { Toast.makeText(context, "请输入密码", Toast.LENGTH_SHORT).show() } + sharedPreferences = + context.getSharedPreferences("USER_SHAREDPREFERENCES", Context.MODE_PRIVATE) + val userNameCache = sharedPreferences?.getString("userName", null) + val passwordCache = sharedPreferences?.getString("passWord", null) + val userCodeCache = sharedPreferences?.getString("userCode", null) + //增加缓存记录,不用每次连接网络登录 + if (userNameCache != null && passwordCache != null && userCodeCache != null) { + if (userNameCache == userName && passwordCache == password) { + viewModelScope.launch(Dispatchers.IO) { + createUserFolder(context, userCodeCache) + loginStatus.postValue(LoginStatus.LOGIN_STATUS_SUCCESS) + } + return + } + } //不指定IO,会在主线程里运行 jobLogin = viewModelScope.launch(Dispatchers.IO) { loginCheck(context, userName, password) } + } /** @@ -115,25 +134,33 @@ class LoginViewModel @Inject constructor( loginStatus.postValue(LoginStatus.LOGIN_STATUS_NET_LOADING) var userCode = "99999"; //登录访问 - when (val result = networkService.loginUser(LoginUserBean(userName,password))) { - is NetResult.Success<*> ->{ - if (result.data!=null) { + when (val result = networkService.loginUser(LoginUserBean(userName, password))) { + is NetResult.Success<*> -> { + if (result.data != null) { try { val defaultUserResponse = result.data as DefaultResponse - if(defaultUserResponse.success){ - if(defaultUserResponse.obj==null|| defaultUserResponse.obj!!.userCode==null){ + if (defaultUserResponse.success) { + if (defaultUserResponse.obj == null || defaultUserResponse.obj!!.userCode == null) { withContext(Dispatchers.Main) { - Toast.makeText(context, "服务返回用户Code信息错误", Toast.LENGTH_SHORT) + Toast.makeText( + context, + "服务返回用户Code信息错误", + Toast.LENGTH_SHORT + ) .show() } loginStatus.postValue(LoginStatus.LOGIN_STATUS_CANCEL) return - }else{ + } else { userCode = defaultUserResponse.obj?.userCode.toString() } - }else{ + } else { withContext(Dispatchers.Main) { - Toast.makeText(context, "${defaultUserResponse.msg}", Toast.LENGTH_SHORT) + Toast.makeText( + context, + "${defaultUserResponse.msg}", + Toast.LENGTH_SHORT + ) .show() } loginStatus.postValue(LoginStatus.LOGIN_STATUS_CANCEL) @@ -145,7 +172,8 @@ class LoginViewModel @Inject constructor( } } } - is NetResult.Error<*> ->{ + + is NetResult.Error<*> -> { withContext(Dispatchers.Main) { Toast.makeText(context, "${result.exception.message}", Toast.LENGTH_SHORT) .show() @@ -153,7 +181,8 @@ class LoginViewModel @Inject constructor( loginStatus.postValue(LoginStatus.LOGIN_STATUS_CANCEL) return } - is NetResult.Failure<*> ->{ + + is NetResult.Failure<*> -> { withContext(Dispatchers.Main) { Toast.makeText(context, "${result.code}:${result.msg}", Toast.LENGTH_SHORT) .show() @@ -161,12 +190,16 @@ class LoginViewModel @Inject constructor( loginStatus.postValue(LoginStatus.LOGIN_STATUS_CANCEL) return } + else -> {} } //文件夹初始化 try { loginStatus.postValue(LoginStatus.LOGIN_STATUS_FOLDER_INIT) + sharedPreferences?.edit()?.putString("userName", userName)?.commit() + sharedPreferences?.edit()?.putString("passWord", password)?.commit() + sharedPreferences?.edit()?.putString("userCode", userCode)?.commit() createUserFolder(context, userCode) } catch (e: IOException) { loginStatus.postValue(LoginStatus.LOGIN_STATUS_FOLDER_FAILURE) @@ -185,18 +218,21 @@ class LoginViewModel @Inject constructor( roomAppDatabase.getOfflineMapDao().insertOrUpdate(result.data) } } + is NetResult.Error<*> -> { withContext(Dispatchers.Main) { Toast.makeText(context, "${result.exception.message}", Toast.LENGTH_SHORT) .show() } } + is NetResult.Failure<*> -> { withContext(Dispatchers.Main) { Toast.makeText(context, "${result.code}:${result.msg}", Toast.LENGTH_SHORT) .show() } } + is NetResult.Loading -> {} else -> {} } @@ -234,7 +270,7 @@ class LoginViewModel @Inject constructor( // 拷贝配置文件到用户目录下 val omdbConfigFile = File(userFolder.absolutePath, Constant.OMDB_CONFIG); // if (!omdbConfigFile.exists()) { - ResourceUtils.copyFileFromAssets(Constant.OMDB_CONFIG, omdbConfigFile.absolutePath) + ResourceUtils.copyFileFromAssets(Constant.OMDB_CONFIG, omdbConfigFile.absolutePath) // } } 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 c6e81e85..60a4d736 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 @@ -868,7 +868,7 @@ class MainActivity : BaseActivity() { private fun setIndoorGroupEnable(enable: Boolean) { binding.mainActivitySnapshotFinish.isEnabled = enable binding.mainActivityTraceSnapshotPoints.isEnabled = enable - binding.mainActivitySnapshotMediaFlag.isEnabled = enable + //binding.mainActivitySnapshotMediaFlag.isEnabled = enable binding.mainActivitySnapshotRewind.isEnabled = enable binding.mainActivitySnapshotPause.isEnabled = enable binding.mainActivitySnapshotNext.isEnabled = enable diff --git a/app/src/main/java/com/navinfo/omqs/util/ShareUtil.java b/app/src/main/java/com/navinfo/omqs/util/ShareUtil.java index b3441a8b..cb54cdb2 100644 --- a/app/src/main/java/com/navinfo/omqs/util/ShareUtil.java +++ b/app/src/main/java/com/navinfo/omqs/util/ShareUtil.java @@ -370,4 +370,5 @@ public class ShareUtil { return null; } + } diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 774553c2..7833fcfc 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -362,6 +362,7 @@ diff --git a/collect-library/src/main/assets/editormarker.xml b/collect-library/src/main/assets/editormarker.xml index 0b5e0573..6f738290 100644 --- a/collect-library/src/main/assets/editormarker.xml +++ b/collect-library/src/main/assets/editormarker.xml @@ -1708,9 +1708,13 @@ - + + + + + - + @@ -1815,7 +1820,11 @@ - + + + + + From c83ed1b97e61d49da9996bba56bc7dabc1b59d41 Mon Sep 17 00:00:00 2001 From: qiji4215 Date: Thu, 20 Jul 2023 16:01:42 +0800 Subject: [PATCH 32/40] =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=AE=A4=E5=86=85?= =?UTF-8?q?=E6=95=B4=E7=90=86=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../omqs/ui/activity/map/MainActivity.kt | 19 +++--- .../omqs/ui/activity/map/MainViewModel.kt | 60 +++++++++++++++---- app/src/main/res/layout/activity_main.xml | 6 +- .../src/main/assets/editormarker.xml | 9 ++- .../library/map/handler/MarkHandler.kt | 4 +- 5 files changed, 69 insertions(+), 29 deletions(-) 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 60a4d736..5035fe10 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 @@ -334,7 +334,10 @@ class MainActivity : BaseActivity() { if (viewModel.indoorToolsCommand == IndoorToolsCommand.SELECT_POINT) { selectPointFinish(true) } - + //启动自动播放 + if (viewModel.indoorToolsCommand == IndoorToolsCommand.PLAY) { + viewModel.startTimer() + } } IndoorToolsResp.QR_CODE_STATUS_UPDATE_VIDEO_INFO_FAILURE -> { @@ -627,7 +630,7 @@ class MainActivity : BaseActivity() { viewModel.setSelectPauseTrace(false) binding.mainActivityMenuIndoorGroup.visibility = View.GONE binding.mainActivityTraceSnapshotPoints.isSelected = viewModel.isSelectTrace() - binding.mainActivitySnapshotMediaFlag.isSelected = viewModel.isMediaFlag() + //binding.mainActivitySnapshotMediaFlag.isSelected = viewModel.isMediaFlag() binding.mainActivitySnapshotPause.isSelected = viewModel.isSelectPauseTrace() } @@ -636,8 +639,8 @@ class MainActivity : BaseActivity() { */ @RequiresApi(Build.VERSION_CODES.N) fun mediaFlagOnclick() { - viewModel.setMediaFlag(!viewModel.isMediaFlag()) - binding.mainActivitySnapshotMediaFlag.isSelected = viewModel.isMediaFlag() +/* viewModel.setMediaFlag(!viewModel.isMediaFlag()) + binding.mainActivitySnapshotMediaFlag.isSelected = viewModel.isMediaFlag()*/ } /** @@ -650,11 +653,11 @@ class MainActivity : BaseActivity() { mapController.markerHandle.getNILocation(viewModel.getCurrentNiLocationIndex() - 1) if (item != null) { viewModel.setCurrentIndexLoction(viewModel.getCurrentNiLocationIndex() - 1) - viewModel.showMarker(this, (item as MarkerItem).uid as NiLocation) + viewModel.showMarker(this, item) val traceVideoBean = TraceVideoBean( command = "videotime?", userid = Constant.USER_ID, - time = "${(item.uid as NiLocation).time}:000" + time = "${item.time}:000" ) viewModel.sendServerCommand(this, traceVideoBean, IndoorToolsCommand.REWIND) } else { @@ -718,11 +721,11 @@ class MainActivity : BaseActivity() { mapController.markerHandle.getNILocation(viewModel.getCurrentNiLocationIndex() + 1) if (item != null) { viewModel.setCurrentIndexLoction(viewModel.getCurrentNiLocationIndex() + 1) - viewModel.showMarker(this, (item as MarkerItem).uid as NiLocation) + viewModel.showMarker(this, item) val traceVideoBean = TraceVideoBean( command = "videotime?", userid = Constant.USER_ID, - time = "${(item.uid as NiLocation).time}:000" + time = "${item.time}:000" ) viewModel.sendServerCommand(this, traceVideoBean, IndoorToolsCommand.NEXT) } else { 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 18e02a77..7ef3a45d 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 @@ -22,6 +22,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import androidx.navigation.findNavController import com.blankj.utilcode.util.ToastUtils +import com.blankj.utilcode.util.ViewUtils.runOnUiThread import com.navinfo.collect.library.data.dao.impl.TraceDataBase import com.navinfo.collect.library.data.entity.* import com.navinfo.collect.library.garminvirbxe.HostBean @@ -56,12 +57,14 @@ import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.oscim.core.GeoPoint import org.oscim.core.MapPosition +import org.oscim.layers.marker.MarkerItem import org.oscim.map.Map import org.videolan.libvlc.LibVlcUtil import java.io.File import java.io.IOException import java.util.* import javax.inject.Inject +import kotlin.concurrent.fixedRateTimer /** * 创建Activity全局viewmode @@ -168,6 +171,10 @@ class MainViewModel @Inject constructor( private var shareUtil: ShareUtil? = null + private var timer: Timer? = null + + private var disTime :Long = 1000 + init { mapController.mMapView.vtmMap.events.bind(Map.UpdateListener { e, mapPosition -> when (e) { @@ -352,9 +359,11 @@ class MainViewModel @Inject constructor( ) ) } - if(Constant.AUTO_LOCATION){ - mapController.mMapView.vtmMap.animator() - .animateTo(GeoPoint( location.longitude, location.latitude)) + withContext(Dispatchers.Main){ + if(Constant.AUTO_LOCATION){ + mapController.mMapView.vtmMap.animator() + .animateTo(GeoPoint( location.longitude, location.latitude)) + } } } } @@ -866,13 +875,6 @@ class MainViewModel @Inject constructor( return currentIndexNiLocation } - /** - * 结束自动播放 - */ - fun cancelTrace() { - - } - override fun onConnect(success: Boolean) { if (!success && socketServer != null) { BaseToast.makeText( @@ -928,4 +930,40 @@ class MainViewModel @Inject constructor( mCameraDialog?.connection(hostBean1) } } -} \ No newline at end of file + + fun startTimer() { + if(timer!=null){ + cancelTrace() + } + timer = fixedRateTimer("", false, disTime, disTime) { + if(currentIndexNiLocation + app:constraint_referenced_ids="main_activity_snapshot_finish,main_activity_trace_snapshot_points,main_activity_snapshot_rewind,main_activity_snapshot_pause,main_activity_snapshot_next" /> - + android:src="@drawable/map_trace_mediaflag" />--> - + @@ -1819,12 +1818,12 @@ --> - + - - + + diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt index 5ce2872d..45071d62 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt @@ -758,9 +758,9 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : return niLocationItemizedLayer.itemList.size } - fun getNILocation(index:Int):MarkerInterface?{ + fun getNILocation(index:Int):NiLocation?{ return if(index>-1&&index Date: Fri, 21 Jul 2023 15:10:28 +0800 Subject: [PATCH 33/40] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B5=8B=E8=AF=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E4=BA=BA=E8=AE=B0=E5=BD=95=E9=94=99=E8=AF=AF?= =?UTF-8?q?2.=E8=B0=83=E6=95=B4=E8=BD=A6=E9=81=93=E8=BE=B9=E7=95=8C?= =?UTF-8?q?=E7=B1=BB=E5=9E=8B=E6=B8=B2=E6=9F=93=E5=8E=9F=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/navinfo/omqs/Constant.kt | 5 + .../omqs/ui/activity/login/LoginViewModel.kt | 14 +- .../omqs/ui/activity/map/MainViewModel.kt | 9 +- .../EvaluationResultViewModel.kt | 1 + .../src/main/assets/editormarker.xml | 241 +++++++++--------- .../library/data/entity/QsRecordBean.kt | 2 +- 6 files changed, 138 insertions(+), 134 deletions(-) diff --git a/app/src/main/java/com/navinfo/omqs/Constant.kt b/app/src/main/java/com/navinfo/omqs/Constant.kt index 7affaaab..5db3b683 100644 --- a/app/src/main/java/com/navinfo/omqs/Constant.kt +++ b/app/src/main/java/com/navinfo/omqs/Constant.kt @@ -24,6 +24,11 @@ class Constant { */ lateinit var USER_ID: String + /** + * 当前用户名称 + */ + lateinit var USER_REAL_NAME: String + //数据版本 lateinit var VERSION_ID: String diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt index 086a2e19..5b2a9b32 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/login/LoginViewModel.kt @@ -106,11 +106,12 @@ class LoginViewModel @Inject constructor( val userNameCache = sharedPreferences?.getString("userName", null) val passwordCache = sharedPreferences?.getString("passWord", null) val userCodeCache = sharedPreferences?.getString("userCode", null) + val userRealName = sharedPreferences?.getString("userRealName", null) //增加缓存记录,不用每次连接网络登录 - if (userNameCache != null && passwordCache != null && userCodeCache != null) { + if (userNameCache != null && passwordCache != null && userCodeCache != null&&userRealName!=null) { if (userNameCache == userName && passwordCache == password) { viewModelScope.launch(Dispatchers.IO) { - createUserFolder(context, userCodeCache) + createUserFolder(context, userCodeCache,userRealName) loginStatus.postValue(LoginStatus.LOGIN_STATUS_SUCCESS) } return @@ -133,6 +134,7 @@ class LoginViewModel @Inject constructor( //网络访问 loginStatus.postValue(LoginStatus.LOGIN_STATUS_NET_LOADING) var userCode = "99999"; + var userRealName = ""; //登录访问 when (val result = networkService.loginUser(LoginUserBean(userName, password))) { is NetResult.Success<*> -> { @@ -153,6 +155,7 @@ class LoginViewModel @Inject constructor( return } else { userCode = defaultUserResponse.obj?.userCode.toString() + userRealName = defaultUserResponse.obj?.userName.toString() } } else { withContext(Dispatchers.Main) { @@ -200,7 +203,9 @@ class LoginViewModel @Inject constructor( sharedPreferences?.edit()?.putString("userName", userName)?.commit() sharedPreferences?.edit()?.putString("passWord", password)?.commit() sharedPreferences?.edit()?.putString("userCode", userCode)?.commit() - createUserFolder(context, userCode) + sharedPreferences?.edit()?.putString("userRealName", userRealName)?.commit() + + createUserFolder(context, userCode,userRealName) } catch (e: IOException) { loginStatus.postValue(LoginStatus.LOGIN_STATUS_FOLDER_FAILURE) } @@ -242,9 +247,10 @@ class LoginViewModel @Inject constructor( /** * 创建用户目录 */ - private fun createUserFolder(context: Context, userId: String) { + private fun createUserFolder(context: Context, userId: String,userRealName:String) { Constant.IS_VIDEO_SPEED = false Constant.USER_ID = userId + Constant.USER_REAL_NAME = userRealName Constant.VERSION_ID = userId Constant.USER_DATA_PATH = Constant.DATA_PATH + Constant.USER_ID + "/" + Constant.VERSION_ID Constant.USER_DATA_ATTACHEMNT_PATH = Constant.USER_DATA_PATH + "/attachment/" 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 7ef3a45d..a968fe48 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 @@ -321,9 +321,11 @@ class MainViewModel @Inject constructor( } catch (e: Exception) { } - val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) - location.taskId = id.toString() - if (shareUtil?.connectstate == true) { + + location.taskId = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1).toString() + + //判断如果是连接状态并处于录像模式,标记为有效点 + if (shareUtil?.connectstate == true&&shareUtil?.takeCameraMode==0) { location.media = 1 } var disance = 0.0 @@ -333,7 +335,6 @@ class MainViewModel @Inject constructor( location.latitude, location.longitude, lastNiLocaion!!.latitude, lastNiLocaion!!.longitude ) - } //室内整理工具时不能进行轨迹存储,判断轨迹间隔要超过2.5并小于60米 if (Constant.INDOOR_IP.isEmpty() && (disance == 0.0 || (disance > 2.5 && disance < 60))) { diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt index 40f2c3d5..b9eed21f 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt @@ -329,6 +329,7 @@ class EvaluationResultViewModel @Inject constructor( viewModelScope.launch(Dispatchers.IO) { val realm = Realm.getDefaultInstance() liveDataQsRecordBean.value!!.checkTime = DateTimeUtil.getDataTime() + liveDataQsRecordBean.value!!.checkUserId = Constant.USER_REAL_NAME realm.executeTransaction { it.copyToRealmOrUpdate(liveDataQsRecordBean.value) } diff --git a/collect-library/src/main/assets/editormarker.xml b/collect-library/src/main/assets/editormarker.xml index 01bfe2cd..73eaf196 100644 --- a/collect-library/src/main/assets/editormarker.xml +++ b/collect-library/src/main/assets/editormarker.xml @@ -1560,51 +1560,51 @@ - + - + - + @@ -1698,9 +1698,9 @@ - + @@ -1715,56 +1715,55 @@ - + - + - - + @@ -1772,7 +1771,7 @@ - + @@ -1785,46 +1784,38 @@ - + + + + + + + + + + + + + + + + - <!–导流区边线–> - - - - --> - - - - - - - + + + + + + + + diff --git a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/QsRecordBean.kt b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/QsRecordBean.kt index 96bf6b3a..7a5fe153 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/QsRecordBean.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/QsRecordBean.kt @@ -64,7 +64,7 @@ open class QsRecordBean @JvmOverloads constructor( /** * 质检员ID */ - var checkUserId: String = "张海球", + var checkUserId: String = "", /** * 质检日期 */ From 2bb72035391de059e2cfb19efcf6c41ca7951302 Mon Sep 17 00:00:00 2001 From: squallzhjch Date: Fri, 21 Jul 2023 15:11:21 +0800 Subject: [PATCH 34/40] =?UTF-8?q?=E8=AF=84=E6=B5=8B=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BB=BB=E5=8A=A1id=20=E8=AF=84=E6=B5=8B?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E6=A0=B9=E6=8D=AE=E6=89=80=E9=80=89=E4=BB=BB?= =?UTF-8?q?=E5=8A=A1=E6=98=BE=E9=9A=90=20=E4=BF=AE=E6=94=B9=E8=AF=84?= =?UTF-8?q?=E6=B5=8Blink=E5=92=8C=E8=AF=84=E6=B5=8B=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E7=9A=84=E8=81=94=E5=8A=A8=E7=BB=B4=E6=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/build.gradle | 2 + .../com/navinfo/omqs/db/RealmOperateHelper.kt | 36 ++ .../omqs/http/taskupload/TaskUploadScope.kt | 5 +- .../omqs/ui/activity/map/MainActivity.kt | 21 +- .../omqs/ui/activity/map/MainViewModel.kt | 318 ++++++++++-------- .../EvaluationResultFragment.kt | 166 +++------ .../EvaluationResultViewModel.kt | 291 ++++++++++------ .../ui/fragment/tasklink/TaskLinkViewModel.kt | 33 +- .../omqs/ui/fragment/tasklist/TaskFragment.kt | 45 ++- .../ui/fragment/tasklist/TaskListFragment.kt | 2 + .../fragment/tasklist/TaskManagerFragment.kt | 12 + .../ui/fragment/tasklist/TaskViewModel.kt | 208 ++++++++---- .../main/res/drawable-v24/baseline_add_24.xml | 5 + .../drawable-v24/baseline_add_24_press.xml | 5 + .../res/drawable/selector_add_taskline.xml | 5 + .../res/layout/fragment_evaluation_result.xml | 18 + app/src/main/res/layout/fragment_task.xml | 15 +- .../library/data/entity/QsRecordBean.kt | 2 + .../collect/library/map/BaseClickListener.kt | 3 + .../collect/library/map/NIMapController.kt | 27 +- .../collect/library/map/NIMapView.java | 78 +++-- .../library/map/OnGeoPointClickListener.kt | 7 + .../library/map/handler/LineHandler.kt | 65 ++-- .../library/map/handler/MarkHandler.kt | 84 +++-- 24 files changed, 897 insertions(+), 556 deletions(-) create mode 100644 app/src/main/res/drawable-v24/baseline_add_24.xml create mode 100644 app/src/main/res/drawable-v24/baseline_add_24_press.xml create mode 100644 app/src/main/res/drawable/selector_add_taskline.xml create mode 100644 collect-library/src/main/java/com/navinfo/collect/library/map/BaseClickListener.kt create mode 100644 collect-library/src/main/java/com/navinfo/collect/library/map/OnGeoPointClickListener.kt diff --git a/app/build.gradle b/app/build.gradle index ca4fa52f..f6479027 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -133,6 +133,8 @@ dependencies { annotationProcessor 'com.github.bumptech.glide:compiler:4.15.1' // implementation "io.realm:realm-kotlin-extensions:6.1.0" + //带侧滑的自定义列表 + implementation 'com.yanzhenjie.recyclerview:x:1.3.2' } //允许引用生成的代码 kapt { diff --git a/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt b/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt index 8edb79c4..a1a02fd4 100644 --- a/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt +++ b/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt @@ -3,6 +3,7 @@ package com.navinfo.omqs.db import android.os.Build import android.util.Log import androidx.annotation.RequiresApi +import com.navinfo.collect.library.data.entity.HadLinkDvoBean import com.navinfo.collect.library.data.entity.RenderEntity import com.navinfo.collect.library.data.entity.RenderEntity.Companion.LinkTable import com.navinfo.collect.library.map.NIMapController @@ -85,6 +86,39 @@ class RealmOperateHelper() { } + suspend fun captureTaskLink( + taskId: Int, + point: GeoPoint, + buffer: Double = DEFAULT_BUFFER, + bufferType: BUFFER_TYPE = DEFAULT_BUFFER_TYPE, + ): HadLinkDvoBean? { + + val polygon = getPolygonFromPoint( + GeometryTools.createPoint(point.longitude, point.latitude), + buffer, + bufferType + ) + + val realm = Realm.getDefaultInstance() + val realmList = realm.where(HadLinkDvoBean::class.java) + .equalTo("taskId", taskId) + .findAll() + var linkBean: HadLinkDvoBean? = null + var nearLast: Double = 99999.99 + for (link in realmList) { + if (polygon.intersects(GeometryTools.createGeometry(link.geometry))) { + val near = point.distance(GeometryTools.createGeoPoint(link.geometry)) + if (near < nearLast) { + nearLast = near + linkBean = link + } + } + } + if (linkBean != null) + return realm.copyFromRealm(linkBean) + return null + } + suspend fun queryLink(linkPid: String): RenderEntity? { var link: RenderEntity? = null withContext(Dispatchers.IO) { @@ -237,6 +271,8 @@ class RealmOperateHelper() { Log.d("queryLink", wkt.toString()) return wkt } + + } enum class BUFFER_TYPE(val index: Int) { diff --git a/app/src/main/java/com/navinfo/omqs/http/taskupload/TaskUploadScope.kt b/app/src/main/java/com/navinfo/omqs/http/taskupload/TaskUploadScope.kt index 19e28738..41b948ef 100644 --- a/app/src/main/java/com/navinfo/omqs/http/taskupload/TaskUploadScope.kt +++ b/app/src/main/java/com/navinfo/omqs/http/taskupload/TaskUploadScope.kt @@ -163,7 +163,8 @@ class TaskUploadScope( var s: String = "%.3f".format(hadLinkDvoBean.length)//保留一位小数(且支持四舍五入) val objects = realm.where(QsRecordBean::class.java) - .equalTo("linkId", /*"84207223282277331"*/hadLinkDvoBean.linkPid).findAll() + .equalTo("linkId", /*"84207223282277331"*/hadLinkDvoBean.linkPid).and() + .equalTo("taskId", hadLinkDvoBean.taskId).findAll() if (objects != null && objects.size > 0) { val copyList = realm.copyFromRealm(objects) @@ -183,7 +184,7 @@ class TaskUploadScope( var dataLevel = 0 - if(hadLinkDvoBean.linkInfo!=null){ + if (hadLinkDvoBean.linkInfo != null) { roadClassfcation = hadLinkDvoBean.linkInfo!!.kind roadFunctionGrade = hadLinkDvoBean.linkInfo!!.functionLevel dataLevel = hadLinkDvoBean.linkInfo!!.dataLevel 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 db09aa62..d4747786 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 @@ -106,7 +106,6 @@ class MainActivity : BaseActivity() { } //点击详细信息 - @RequiresApi(Build.VERSION_CODES.N) override fun onMoreInfoClick(selectTag: String, tag: String, signBean: SignBean) { viewModel.showSignMoreInfo(signBean.renderEntity) val fragment = @@ -147,7 +146,6 @@ class MainActivity : BaseActivity() { } - @RequiresApi(Build.VERSION_CODES.N) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -226,8 +224,7 @@ class MainActivity : BaseActivity() { val bundle = Bundle() bundle.putString("TaskLinkId", it) findNavController(R.id.main_activity_right_fragment).navigate( - R.id.TaskLinkFragment, - bundle + R.id.TaskLinkFragment, bundle ) } @@ -382,7 +379,6 @@ class MainActivity : BaseActivity() { mapController.mMapView.onPause() } - @RequiresApi(Build.VERSION_CODES.N) override fun onDestroy() { super.onDestroy() viewModel.speakMode?.shutdown() @@ -413,7 +409,6 @@ class MainActivity : BaseActivity() { /** * 打开相机预览 */ - @RequiresApi(Build.VERSION_CODES.N) fun openCamera() { //显示轨迹图层 viewModel.onClickCameraButton(this) @@ -422,7 +417,6 @@ class MainActivity : BaseActivity() { /** * 开关菜单 */ - @RequiresApi(Build.VERSION_CODES.N) fun onClickMenu() { //显示菜单图层 viewModel.onClickMenu() @@ -530,7 +524,6 @@ class MainActivity : BaseActivity() { /** * 点击线选择 */ - @RequiresApi(Build.VERSION_CODES.N) fun selectLineOnclick() { viewModel.setSelectRoad(!viewModel.isSelectRoad()) binding.mainActivitySelectLine.isSelected = viewModel.isSelectRoad() @@ -539,7 +532,6 @@ class MainActivity : BaseActivity() { /** * 点击线选择 */ - @RequiresApi(Build.VERSION_CODES.N) fun tracePointsOnclick() { viewModel.setSelectTrace(!viewModel.isSelectTrace()) if (viewModel.isSelectTrace()) { @@ -551,7 +543,6 @@ class MainActivity : BaseActivity() { /** * 点击结束轨迹操作 */ - @RequiresApi(Build.VERSION_CODES.N) fun finishTraceOnclick() { setIndoorGroupEnable(false) viewModel.setSelectTrace(false) @@ -565,7 +556,6 @@ class MainActivity : BaseActivity() { /** * 点击结束轨迹操作 */ - @RequiresApi(Build.VERSION_CODES.N) fun mediaFlagOnclick() { viewModel.setMediaFlag(!viewModel.isMediaFlag()) binding.mainActivitySnapshotMediaFlag.isSelected = viewModel.isMediaFlag() @@ -574,7 +564,6 @@ class MainActivity : BaseActivity() { /** * 点击上一个轨迹点播放操作 */ - @RequiresApi(Build.VERSION_CODES.N) fun rewindTraceOnclick() { pasePlayTrace() } @@ -582,7 +571,6 @@ class MainActivity : BaseActivity() { /** * 点击暂停播放轨迹操作 */ - @RequiresApi(Build.VERSION_CODES.N) fun pauseTraceOnclick() { viewModel.setSelectPauseTrace(!viewModel.isSelectPauseTrace()) binding.mainActivitySnapshotPause.isSelected = viewModel.isSelectPauseTrace() @@ -593,12 +581,10 @@ class MainActivity : BaseActivity() { /** * 点击下一个轨迹点 */ - @RequiresApi(Build.VERSION_CODES.N) fun nextTraceOnclick() { pasePlayTrace() } - @RequiresApi(Build.VERSION_CODES.N) fun pasePlayTrace() { viewModel.setSelectTrace(false) binding.mainActivityTraceSnapshotPoints.isSelected = viewModel.isSelectTrace() @@ -625,8 +611,7 @@ class MainActivity : BaseActivity() { binding.mainActivityBottomSheetGroup.visibility = View.VISIBLE mapController.mMapView.setScaleBarLayer(GLViewport.Position.BOTTOM_CENTER, 128, 65) } - mapController.mMapView.vtmMap.animator() - .animateTo( + mapController.mMapView.vtmMap.animator().animateTo( GeoPoint( mapController.mMapView.vtmMap.mapPosition.geoPoint.latitude, mapController.mMapView.vtmMap.mapPosition.geoPoint.longitude @@ -634,7 +619,6 @@ class MainActivity : BaseActivity() { ) } - @RequiresApi(Build.VERSION_CODES.N) private fun voiceOnTouchStart() { viewModel.startSoundMetter(this, binding.mainActivityVoice) } @@ -738,7 +722,6 @@ class MainActivity : BaseActivity() { /** * 打开道路名称属性看板,选择的道路在viewmodel里记录,不用 */ - @RequiresApi(Build.VERSION_CODES.N) fun openRoadNameFragment() { if (viewModel.liveDataRoadName.value != null) { viewModel.showSignMoreInfo(viewModel.liveDataRoadName.value!!) 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 a8402389..e62cc5d0 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 @@ -18,13 +18,15 @@ import android.widget.PopupWindow import androidx.annotation.RequiresApi import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel -import androidx.lifecycle.lifecycleScope import androidx.lifecycle.viewModelScope import androidx.navigation.findNavController import com.blankj.utilcode.util.ToastUtils import com.navinfo.collect.library.data.dao.impl.TraceDataBase import com.navinfo.collect.library.data.entity.* import com.navinfo.collect.library.map.NIMapController +import com.navinfo.collect.library.map.OnGeoPointClickListener +import com.navinfo.collect.library.map.handler.ONNoteItemClickListener +import com.navinfo.collect.library.map.handler.OnNiLocationItemListener import com.navinfo.collect.library.map.handler.OnQsRecordItemClickListener import com.navinfo.collect.library.map.handler.OnTaskLinkItemClickListener import com.navinfo.collect.library.utils.GeometryTools @@ -60,14 +62,15 @@ import javax.inject.Inject * 创建Activity全局viewmode */ -@RequiresApi(Build.VERSION_CODES.N) @HiltViewModel class MainViewModel @Inject constructor( private val mapController: NIMapController, private val traceDataBase: TraceDataBase, private val realmOperateHelper: RealmOperateHelper, private val sharedPreferences: SharedPreferences -) : ViewModel() { +) : ViewModel(), SharedPreferences.OnSharedPreferenceChangeListener { + + private val TAG = "MainViewModel" private var mCameraDialog: CommonDialog? = null @@ -97,6 +100,16 @@ class MainViewModel @Inject constructor( */ val liveDataSignMoreInfo = MutableLiveData() + /** + * 右上角菜单状态 + */ + val liveDataMenuState = MutableLiveData() + + /** + * 地图中心坐标 + */ + val liveDataCenterPoint = MutableLiveData() + // var testPoint = GeoPoint(0, 0) //uuid标识,用于记录轨迹组 @@ -116,9 +129,7 @@ class MainViewModel @Inject constructor( var captureLinkState: Boolean = false - val liveDataMenuState = MutableLiveData() - - val liveDataCenterPoint = MutableLiveData() + var currentTaskBean: TaskBean? = null /** * 是不是线选择模式 @@ -145,6 +156,7 @@ class MainViewModel @Inject constructor( private var lastNiLocaion: NiLocation? = null init { + mapController.mMapView.vtmMap.events.bind(Map.UpdateListener { e, mapPosition -> when (e) { Map.SCALE_EVENT, Map.MOVE_EVENT, Map.ROTATE_EVENT -> liveDataCenterPoint.value = @@ -152,76 +164,114 @@ class MainViewModel @Inject constructor( } }) - //处理质检数据点击事件 - mapController.markerHandle.setOnQsRecordItemClickListener(object : - OnQsRecordItemClickListener { - override fun onQsRecordList(list: MutableList) { - liveDataQsRecordIdList.value = list - } - - override fun onNote(id: String) { - liveDataNoteId.value = id - } - - override fun onNiLocation(item: NiLocation) { - liveDataNILocationList.value = item - } - }) - mapController.lineHandler.setOnTaskLinkItemClickListener(object : - OnTaskLinkItemClickListener { - override fun onTaskLink(taskLinkId: String) { - liveDataTaskLink.value = taskLinkId - } - }) - initLocation() + /** + * 处理点击道路捕捉回调功能 + */ + mapController.mMapView.addOnNIMapClickListener( + TAG, + //处理地图点击操作 + object : OnGeoPointClickListener { + override fun onMapClick(tag: String, point: GeoPoint) { + if (tag == TAG) { + viewModelScope.launch(Dispatchers.Default) { + //线选择状态 + if (bSelectRoad) { + captureLink(point) + } + } + } + } + }, + /** + * 处理之间数据的点击 + */ + object : OnQsRecordItemClickListener { + override fun onQsRecordList(tag: String, list: MutableList) { + if (tag == TAG) + liveDataQsRecordIdList.value = list + } + }, + /** + * 处理新增link线点击编辑 + */ + object : OnTaskLinkItemClickListener { + override fun onTaskLink(tag: String, taskLinkId: String) { + if (tag == TAG) + liveDataTaskLink.value = taskLinkId + } + }, + /** + * 处理便签点击 + */ + object : ONNoteItemClickListener { + override fun onNote(tag: String, noteId: String) { + if (tag == TAG) + liveDataNoteId.value = noteId + } - //处理地图点击操作 - viewModelScope.launch(Dispatchers.Default) { - mapController.onMapClickFlow.collectLatest { -// testPoint = it - //线选择状态 - if (bSelectRoad) { - captureLink(it) - } else { - captureItem(it) + }, + /** + * 处理定位点的点击 + */ + object : OnNiLocationItemListener { + override fun onNiLocation(tag: String, it: NiLocation) { + if (tag == TAG) + liveDataNILocationList.value = it } } - } + ) + viewModelScope.launch(Dispatchers.IO) { - initTaskData() + getTaskBean() + //初始化选中的任务高亮高亮 + mapController.lineHandler.showTaskLines(currentTaskBean?.hadLinkDvoList!!) initQsRecordData() initNoteData() initNILocationData() } + sharedPreferences.registerOnSharedPreferenceChangeListener(this) } + /** - * 初始化选中的任务高亮高亮 + * 获取当前任务 */ - private suspend fun initTaskData() { + private suspend fun getTaskBean() { val id = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) val realm = Realm.getDefaultInstance() val res = realm.where(TaskBean::class.java).equalTo("id", id).findFirst() if (res != null) { - val taskBean = realm.copyFromRealm(res) - mapController.lineHandler.showTaskLines(taskBean.hadLinkDvoList) + currentTaskBean = realm.copyFromRealm(res) } + } + + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) { + if (key == Constant.SELECT_TASK_ID) { + viewModelScope.launch(Dispatchers.IO) { + getTaskBean() + initQsRecordData() + } + } } /** * 初始化渲染质检数据 */ private suspend fun initQsRecordData() { - var list = mutableListOf() - val realm = Realm.getDefaultInstance() - realm.executeTransaction { - val objects = realm.where().findAll() - list = realm.copyFromRealm(objects) - } - for (item in list) { - mapController.markerHandle.addOrUpdateQsRecordMark(item) + if (currentTaskBean != null) { + var list = mutableListOf() + val realm = Realm.getDefaultInstance() + realm.executeTransaction { + val objects = + realm.where().equalTo("taskId", currentTaskBean!!.id).findAll() + list = realm.copyFromRealm(objects) + } + mapController.markerHandle.removeAllQsMarker() + for (item in list) { + mapController.markerHandle.addOrUpdateQsRecordMark(item) + } } } @@ -259,7 +309,6 @@ class MainViewModel @Inject constructor( /** * 初始化定位信息 */ - @RequiresApi(Build.VERSION_CODES.N) private fun initLocation() { //用于定位点存储到数据库 viewModelScope.launch(Dispatchers.Default) { @@ -335,17 +384,10 @@ class MainViewModel @Inject constructor( } - /** - * 捕捉要素 - */ - private suspend fun captureItem(point: GeoPoint) { - - } /** * 捕获道路和面板 */ - @RequiresApi(Build.VERSION_CODES.N) private suspend fun captureLink(point: GeoPoint) { if (captureLinkState) { return @@ -354,101 +396,103 @@ class MainViewModel @Inject constructor( try { captureLinkState = true - val linkList = realmOperateHelper.queryLink( - point = point, - ) - var hisRoadName = false - if (linkList.isNotEmpty()) { - //看板数据 - val signList = mutableListOf() - val topSignList = mutableListOf() - mapController.lineHandler.linksLayer.clear() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + val linkList = realmOperateHelper.queryLink( + point = point, + ) - val link = linkList[0] + var hisRoadName = false + if (linkList.isNotEmpty()) { + //看板数据 + val signList = mutableListOf() + val topSignList = mutableListOf() + mapController.lineHandler.linksLayer.clear() - val linkId = link.properties[RenderEntity.Companion.LinkTable.linkPid] + val link = linkList[0] - if (linkIdCache != linkId) { + val linkId = link.properties[RenderEntity.Companion.LinkTable.linkPid] - mapController.lineHandler.showLine(link.geometry) - linkId?.let { - var elementList = realmOperateHelper.queryLinkByLinkPid(it) - for (element in elementList) { + if (linkIdCache != linkId) { - if (element.code == 2011) { - hisRoadName = true - liveDataRoadName.postValue(element) - continue - } + mapController.lineHandler.showLine(link.geometry) + linkId?.let { + var elementList = realmOperateHelper.queryLinkByLinkPid(it) + for (element in elementList) { - val distance = GeometryTools.distanceToDouble( - point, GeometryTools.createGeoPoint(element.geometry) - ) + if (element.code == 2011) { + hisRoadName = true + liveDataRoadName.postValue(element) + continue + } - val signBean = SignBean( - iconId = SignUtil.getSignIcon(element), - iconText = SignUtil.getSignIconText(element), - distance = distance.toInt(), - linkId = linkId, - name = SignUtil.getSignNameText(element), - bottomRightText = SignUtil.getSignBottomRightText(element), - renderEntity = element, - isMoreInfo = SignUtil.isMoreInfo(element), - index = SignUtil.getRoadInfoIndex(element) - ) - Log.e("jingo", "捕捉到的数据code ${element.code}") - when (element.code) { - //车道数,种别,功能等级,线限速,道路方向 - 2041, 2008, 2002, 2019, 2010 -> topSignList.add( - signBean + val distance = GeometryTools.distanceToDouble( + point, GeometryTools.createGeoPoint(element.geometry) ) - 4002, 4003, 4004, 4010, 4022, 4601 -> signList.add( - signBean + val signBean = SignBean( + iconId = SignUtil.getSignIcon(element), + iconText = SignUtil.getSignIconText(element), + distance = distance.toInt(), + linkId = linkId, + name = SignUtil.getSignNameText(element), + bottomRightText = SignUtil.getSignBottomRightText(element), + renderEntity = element, + isMoreInfo = SignUtil.isMoreInfo(element), + index = SignUtil.getRoadInfoIndex(element) ) + Log.e("jingo", "捕捉到的数据code ${element.code}") + when (element.code) { + //车道数,种别,功能等级,线限速,道路方向 + 2041, 2008, 2002, 2019, 2010 -> topSignList.add( + signBean + ) + + 4002, 4003, 4004, 4010, 4022, 4601 -> signList.add( + signBean + ) + } + } - } - - val realm = Realm.getDefaultInstance() - val entity = realm.where(RenderEntity::class.java) - .equalTo("table", "OMDB_RESTRICTION").and().equalTo( - "properties['linkIn']", it - ).findFirst() - if (entity != null) { - val outLink = entity.properties["linkOut"] - val linkOutEntity = realm.where(RenderEntity::class.java) - .equalTo("table", "OMDB_RD_LINK").and().equalTo( - "properties['${RenderEntity.Companion.LinkTable.linkPid}']", - outLink + val realm = Realm.getDefaultInstance() + val entity = realm.where(RenderEntity::class.java) + .equalTo("table", "OMDB_RESTRICTION").and().equalTo( + "properties['linkIn']", it ).findFirst() - if (linkOutEntity != null) { - mapController.lineHandler.linksLayer.addLine( - linkOutEntity.geometry, 0x7DFF0000 - ) + if (entity != null) { + val outLink = entity.properties["linkOut"] + val linkOutEntity = realm.where(RenderEntity::class.java) + .equalTo("table", "OMDB_RD_LINK").and().equalTo( + "properties['${RenderEntity.Companion.LinkTable.linkPid}']", + outLink + ).findFirst() + if (linkOutEntity != null) { + mapController.lineHandler.linksLayer.addLine( + linkOutEntity.geometry, 0x7DFF0000 + ) + } } } - } - liveDataTopSignList.postValue(topSignList.distinctBy { it.name } - .sortedBy { it.index }) + liveDataTopSignList.postValue(topSignList.distinctBy { it.name } + .sortedBy { it.index }) - liveDataSignList.postValue(signList.sortedBy { it.distance }) - val speechText = SignUtil.getRoadSpeechText(topSignList) - withContext(Dispatchers.Main) { - speakMode?.speakText(speechText) + liveDataSignList.postValue(signList.sortedBy { it.distance }) + val speechText = SignUtil.getRoadSpeechText(topSignList) + withContext(Dispatchers.Main) { + speakMode?.speakText(speechText) + } + linkIdCache = linkId ?: "" } - linkIdCache = linkId ?: "" + } else { + mapController.lineHandler.removeLine() + linkIdCache = "" + } + //如果没有捕捉到道路名 + if (!hisRoadName) { + liveDataRoadName.postValue(null) } - } else { - mapController.lineHandler.removeLine() - linkIdCache = "" } - //如果没有捕捉到道路名 - if (!hisRoadName) { - liveDataRoadName.postValue(null) - } - } catch (e: Exception) { } finally { @@ -474,9 +518,9 @@ class MainViewModel @Inject constructor( override fun onCleared() { super.onCleared() - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - mapController.lineHandler.removeLine() - } + sharedPreferences.unregisterOnSharedPreferenceChangeListener(this) + mapController.mMapView.removeOnNIMapClickListener(TAG) + mapController.lineHandler.removeLine() } //点击相机按钮 diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultFragment.kt index 270654cd..60a50bea 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultFragment.kt @@ -8,6 +8,7 @@ import android.os.Bundle import android.provider.MediaStore import android.util.Log import android.view.* +import android.widget.Toast import androidx.activity.result.ActivityResult import androidx.activity.result.ActivityResultLauncher import androidx.activity.result.contract.ActivityResultContracts @@ -44,7 +45,7 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - mCameraLauncher = registerForActivityResult( + mCameraLauncher = registerForActivityResult( ActivityResultContracts.StartActivityForResult() ) { result: ActivityResult -> if (result.resultCode == Activity.RESULT_OK) { @@ -65,37 +66,28 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener { binding = DataBindingUtil.inflate(inflater, R.layout.fragment_evaluation_result, container, false) binding.fragment = this - val layoutManager = LinearLayoutManager(context) binding.viewModel = viewModel binding.lifecycleOwner = this - //// 设置 RecyclerView 的固定大小,避免在滚动时重新计算视图大小和布局,提高性能 - binding.evaluationVoiceRecyclerview.setHasFixedSize(true) - binding.evaluationVoiceRecyclerview.layoutManager = layoutManager - /** - * 监听左侧栏的点击事件 - */ - val adapter = SoundtListAdapter { _, view -> - - } - - binding.evaluationVoiceRecyclerview.adapter = adapter - viewModel.listDataChatMsgEntityList.observe(viewLifecycleOwner) { - adapter.refreshData(it) - } - - - return binding.root } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - //监听是否退出当前页面 - viewModel.liveDataFinish.observe(viewLifecycleOwner) { - onBackPressed() + //// 设置 RecyclerView 的固定大小,避免在滚动时重新计算视图大小和布局,提高性能 + binding.evaluationVoiceRecyclerview.setHasFixedSize(true) + val layoutManager = LinearLayoutManager(context) + binding.evaluationVoiceRecyclerview.layoutManager = layoutManager + /** + * 监听左侧栏的点击事件 + */ + val adapter = SoundtListAdapter { _, _ -> + } + + binding.evaluationVoiceRecyclerview.adapter = adapter + //返回按钮点击 - binding.evaluationBar.setOnClickListener() { + binding.evaluationBar.setOnClickListener { val mDialog = FirstDialog(context) mDialog.setTitle("提示?") mDialog.setMessage("是否退出,请确认!") @@ -110,15 +102,13 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener { } //保存事件 - binding.evaluationBarSave.setOnClickListener() { + binding.evaluationBarSave.setOnClickListener { viewModel.saveData() } //删除事件 - binding.evaluationBarDelete.setOnClickListener() { - + binding.evaluationBarDelete.setOnClickListener { viewModel.deleteData(requireContext()) - } /** * 照片view @@ -166,22 +156,21 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener { /** * 读取元数据 */ -// val id = args.qsId var id = "" var signBean: SignBean? = null - var autoSave: Boolean = false - var filePath: String = "" + var autoSave = false + var filePath = "" arguments?.let { id = it.getString("QsId", "") filePath = it.getString("filePath", "") try { signBean = it.getParcelable("SignBean") autoSave = it.getBoolean("AutoSave") - } catch (e: java.lang.Exception) { + } catch (_: java.lang.Exception) { } } - if (id == null || id.isEmpty()) { + if (id.isEmpty()) { viewModel.initNewData(signBean, filePath) //增加监听,联动列表自动保存 viewModel.liveDataRightTypeList.observe(viewLifecycleOwner) { @@ -192,102 +181,22 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener { } else { viewModel.initData(id) } -// //监听大分类数据变化 -// viewModel.liveDataClassTypeList.observe(viewLifecycleOwner) { -// if (it == null || it.isEmpty()) { -// Toast.makeText(requireContext(), "还没有导入元数据!", Toast.LENGTH_SHORT).show() -// } else { -// binding.evaluationClassType.adapter = -// ArrayAdapter(requireContext(), R.layout.text_item_select, it) -// } -// } -// -// viewModel.liveDataProblemTypeList.observe(viewLifecycleOwner){ -// if (it == null || it.isEmpty()) { -// Toast.makeText(requireContext(), "还没有导入元数据!", Toast.LENGTH_SHORT).show() -// }else{ -// binding.evaluationProblemType.adapter = -// ArrayAdapter(requireContext(), R.layout.text_item_select, it) -// } -// } -// //选择问题分类的回调 -// binding.evaluationClassType.onItemSelectedListener = -// object : AdapterView.OnItemSelectedListener { -// override fun onItemSelected( -// parent: AdapterView<*>?, view: View?, position: Int, id: Long -// ) { -// viewModel.getProblemTypeList(position) -// } -// -// override fun onNothingSelected(parent: AdapterView<*>?) {} -// } -// /** -// * 监听联动选择的内容 -// */ -// viewModel.problemTypeListLiveData.observe(viewLifecycleOwner) { -// binding.evaluationClassTabLayout.let { tabLayout -> -// tabLayout.removeAllTabs() -// val fragmentList = mutableListOf() -// for (item in it) { -// val tab = tabLayout.newTab() -// tab.text = item -// tabLayout.addTab(tab) -// fragmentList.add(PhenomenonFragment(viewModel.currentClassType, item)) -// } -// phenomenonFragmentAdapter = -// activity?.let { a -> EvaluationResultAdapter(a, fragmentList) } -// binding.evaluationViewpager.adapter = phenomenonFragmentAdapter -// -// TabLayoutMediator( -// binding.evaluationClassTabLayout, -// binding.evaluationViewpager -// ) { tab, position -> -// tab.text = it[position] -// }.attach() -// updateHeight(0) -// } -// -// } + viewModel.listDataChatMsgEntityList.observe(viewLifecycleOwner) { + adapter.refreshData(it) + } + + //监听是否退出当前页面 + viewModel.liveDataFinish.observe(viewLifecycleOwner) { + onBackPressed() + } + //监听要提示的信息 + viewModel.liveDataToastMessage.observe(viewLifecycleOwner) { + Toast.makeText(requireContext(), it, Toast.LENGTH_SHORT).show() + } -// binding.evaluationViewpager.registerOnPageChangeCallback(object : -// ViewPager2.OnPageChangeCallback() { -// override fun onPageSelected(position: Int) { -// super.onPageSelected(position) -// updateHeight(position) -// } -// }) } - -// private fun updateHeight(position: Int) { -// phenomenonFragmentAdapter?.let { -// if (it.fragmentList.size > position) { -// val fragment: Fragment = it.fragmentList[position] -// if (fragment.view != null) { -// val viewWidth = View.MeasureSpec.makeMeasureSpec( -// fragment.requireView().width, View.MeasureSpec.EXACTLY -// ) -// val viewHeight = -// View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) -// fragment.requireView().measure(viewWidth, viewHeight) -// binding.evaluationViewpager.let { viewpager -> -// if (viewpager.layoutParams.height != fragment.requireView().measuredHeight) { -// //必须要用对象去接收,然后修改该对象再采用该对象,否则无法生效... -// val layoutParams: ViewGroup.LayoutParams = -// viewpager.layoutParams -// layoutParams.height = fragment.requireView().measuredHeight -// viewpager.layoutParams = layoutParams -// } -// } -// -// } -// } -// } -// -// } - - override fun onDestroyView() { activity?.run { findNavController(R.id.main_activity_middle_fragment).navigateUp() @@ -307,6 +216,7 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener { if (currentItem > 0) { binding.evaluationPictureViewpager.currentItem = currentItem - 1 } else { + return } } @@ -316,7 +226,7 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener { if (currentItem < pictureAdapter.data.size - 1) { binding.evaluationPictureViewpager.currentItem = currentItem + 1 } else { - + return } } //上三项,打开面板 @@ -369,7 +279,9 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener { R.id.evaluation_camera -> { takePhoto() } - else -> {} + else -> { + return + } } } } @@ -402,6 +314,4 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener { Log.d("TTTT", e.toString()) } } - - } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt index 468d56d6..509748a0 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt @@ -3,6 +3,7 @@ package com.navinfo.omqs.ui.fragment.evaluationresult import android.app.Activity import android.app.Dialog import android.content.Context +import android.content.SharedPreferences import android.graphics.Bitmap import android.graphics.drawable.AnimationDrawable import android.graphics.drawable.BitmapDrawable @@ -20,9 +21,12 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.blankj.utilcode.util.ToastUtils import com.navinfo.collect.library.data.entity.AttachmentBean +import com.navinfo.collect.library.data.entity.HadLinkDvoBean import com.navinfo.collect.library.data.entity.QsRecordBean import com.navinfo.collect.library.data.entity.RenderEntity.Companion.LinkTable +import com.navinfo.collect.library.data.entity.TaskBean import com.navinfo.collect.library.map.NIMapController +import com.navinfo.collect.library.map.OnGeoPointClickListener import com.navinfo.collect.library.utils.GeometryTools import com.navinfo.omqs.Constant import com.navinfo.omqs.R @@ -39,8 +43,8 @@ import dagger.hilt.android.lifecycle.HiltViewModel import io.realm.Realm import io.realm.RealmList import kotlinx.coroutines.Dispatchers -import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import org.oscim.core.GeoPoint import java.io.File import java.io.FileOutputStream @@ -52,9 +56,11 @@ class EvaluationResultViewModel @Inject constructor( private val roomAppDatabase: RoomAppDatabase, private val mapController: NIMapController, private val realmOperateHelper: RealmOperateHelper, -) : ViewModel() { + private val sharedPreferences: SharedPreferences +) : ViewModel(), SharedPreferences.OnSharedPreferenceChangeListener { - private val markerTitle = "点选marker" + + private val TAG = "点选marker" /** * 操作结束,销毁页面 @@ -66,10 +72,6 @@ class EvaluationResultViewModel @Inject constructor( */ val liveDataLeftTypeList = MutableLiveData>() - /** - * 问题类型 liveData 给[MiddleAdapter]展示的数据 - */ -// val liveDataMiddleTypeList = MutableLiveData>() /** * 问题现象 liveData 给[RightGroupHeaderAdapter]展示的数据 @@ -77,9 +79,9 @@ class EvaluationResultViewModel @Inject constructor( val liveDataRightTypeList = MutableLiveData>() /** - * + * 要保存的评测数据 */ - val liveDataQsRecordBean = MutableLiveData() + val liveDataQsRecordBean = MutableLiveData(QsRecordBean(id = UUID.randomUUID().toString())) /** * 语音列表 @@ -91,6 +93,19 @@ class EvaluationResultViewModel @Inject constructor( */ val liveDataPictureList = MutableLiveData>() + /** + * toast信息 + */ + val liveDataToastMessage = MutableLiveData() + + /** + * 当前选择的任务 + */ + val liveDataTaskBean = MutableLiveData() + + /** + * 编辑数据时用来差分数据 + */ var oldBean: QsRecordBean? = null //语音窗体 @@ -108,24 +123,27 @@ class EvaluationResultViewModel @Inject constructor( var classCodeTemp: String = "" init { - liveDataQsRecordBean.value = QsRecordBean(id = UUID.randomUUID().toString()) - viewModelScope.launch { - mapController.onMapClickFlow.collectLatest { - liveDataQsRecordBean.value!!.geometry = GeometryTools.createGeometry(it).toText() - mapController.markerHandle.addMarker(it, markerTitle) - viewModelScope.launch { - captureLink(it.longitude, it.latitude) + mapController.mMapView.addOnNIMapClickListener(TAG, object : OnGeoPointClickListener { + override fun onMapClick(tag: String, point: GeoPoint) { + if (tag == TAG) { + liveDataQsRecordBean.value!!.geometry = + GeometryTools.createGeometry(point).toText() + mapController.markerHandle.addMarker(point, TAG) + viewModelScope.launch { + captureLink(point) + } } + } - } + }) + sharedPreferences.registerOnSharedPreferenceChangeListener(this) } override fun onCleared() { super.onCleared() - mapController.markerHandle.removeMarker(markerTitle) - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - mapController.lineHandler.removeLine() - } + mapController.mMapView.removeOnNIMapClickListener(TAG) + mapController.markerHandle.removeMarker(TAG) + mapController.lineHandler.removeLine() } @@ -133,40 +151,57 @@ class EvaluationResultViewModel @Inject constructor( * 查询数据库,获取问题分类 */ fun initNewData(bean: SignBean?, filePath: String) { - //获取当前定位点 - val geoPoint = mapController.locationLayerHandler.getCurrentGeoPoint() - //如果不是从面板进来的 - if (bean == null) { - geoPoint?.let { - liveDataQsRecordBean.value!!.geometry = GeometryTools.createGeometry(it).toText() - mapController.markerHandle.addMarker(geoPoint, markerTitle) - mapController.animationHandler.animationByLatLon( - geoPoint.latitude, geoPoint.longitude - ) - viewModelScope.launch { - captureLink(geoPoint.longitude, geoPoint.latitude) - } - } - } else { - liveDataQsRecordBean.value?.run { - elementId = bean.renderEntity.code.toString() - linkId = bean.linkId - if (linkId.isNotEmpty()) { - viewModelScope.launch { - val link = realmOperateHelper.queryLink(linkId) - link?.let { l -> - mapController.lineHandler.showLine(l.geometry) - } - } - } - val point = GeometryTools.createGeoPoint(bean.renderEntity.geometry) - this.geometry = GeometryTools.createGeometry(point).toText() - mapController.animationHandler.animationByLatLon(point.latitude, point.longitude) - mapController.markerHandle.addMarker(point, markerTitle) - } - } //查询元数据 viewModelScope.launch(Dispatchers.IO) { + /** + * 获取当前所选的任务 + */ + val taskId = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) + val realm = Realm.getDefaultInstance() + val objects = realm.where(TaskBean::class.java).equalTo("id", taskId).findFirst() + if (objects != null) { + liveDataTaskBean.postValue(realm.copyFromRealm(objects)) + } + + //获取当前定位点 + val geoPoint = mapController.locationLayerHandler.getCurrentGeoPoint() + //如果不是从面板进来的 + if (bean == null) { + geoPoint?.let { + liveDataQsRecordBean.value!!.geometry = + GeometryTools.createGeometry(it).toText() + withContext(Dispatchers.Main) { + mapController.markerHandle.addMarker(geoPoint, TAG) + mapController.animationHandler.animationByLatLon( + geoPoint.latitude, geoPoint.longitude + ) + } + captureLink(geoPoint) + } + } else { + liveDataQsRecordBean.value?.run { + elementId = bean.renderEntity.code.toString() + linkId = bean.linkId + if (linkId.isNotEmpty()) { + viewModelScope.launch { + val link = realmOperateHelper.queryLink(linkId) + link?.let { l -> + mapController.lineHandler.showLine(l.geometry) + } + } + } + + val point = GeometryTools.createGeoPoint(bean.renderEntity.geometry) + this.geometry = GeometryTools.createGeometry(point).toText() + withContext(Dispatchers.Main) { + mapController.animationHandler.animationByLatLon( + point.latitude, point.longitude + ) + mapController.markerHandle.addMarker(point, TAG) + } + } + } + getClassTypeList(bean) getProblemLinkList() } @@ -174,23 +209,32 @@ class EvaluationResultViewModel @Inject constructor( } /** - * 捕捉道路 + * 捕捉道路或新增评测link */ - private suspend fun captureLink(longitude: Double, latitude: Double) { + private suspend fun captureLink(point: GeoPoint) { + if (liveDataTaskBean.value == null) { + liveDataToastMessage.postValue("请先选择所属任务!") + return + } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { - val linkList = realmOperateHelper.queryLink( - point = GeoPoint(latitude, longitude), - ) - liveDataQsRecordBean.value?.let { - if (linkList.isNotEmpty()) { - it.linkId = linkList[0].properties[LinkTable.linkPid] ?: "" - mapController.lineHandler.showLine(linkList[0].geometry) - Log.e("jingo", "捕捉到的linkId = ${it.linkId}") + + val taskLink = + realmOperateHelper.captureTaskLink(liveDataTaskBean.value!!.id, point) + if (taskLink != null) { + it.linkId = taskLink.linkPid + mapController.lineHandler.showLine(taskLink.geometry) + return } else { - it.linkId = "" - mapController.lineHandler.removeLine() + val linkList = realmOperateHelper.queryLink(point = point) + if (linkList.isNotEmpty()) { + it.linkId = linkList[0].properties[LinkTable.linkPid] ?: "" + mapController.lineHandler.showLine(linkList[0].geometry) + return + } } + it.linkId = "" + mapController.lineHandler.removeLine() } } } @@ -323,19 +367,51 @@ class EvaluationResultViewModel @Inject constructor( liveDataQsRecordBean.postValue(liveDataQsRecordBean.value) } + /** + * 保存数据 + */ + fun saveData() { + viewModelScope.launch(Dispatchers.IO) { + val taskBean = liveDataQsRecordBean.value!! + if (liveDataTaskBean.value == null) { + liveDataToastMessage.postValue("请选择所属任务!") + return@launch + } else if (taskBean.classType.isEmpty()) { + liveDataToastMessage.postValue("请选择要素分类!") + return@launch + } else if (taskBean.problemType.isEmpty()) { + liveDataToastMessage.postValue("请选择问题类型!") + return@launch + } else if (taskBean.phenomenon.isEmpty()) { + liveDataToastMessage.postValue("请选择问题现象!") + return@launch + } else if (taskBean.problemLink.isEmpty()) { + liveDataToastMessage.postValue("请选择问题环节!") + return@launch + } else if (taskBean.classType.isEmpty()) { + liveDataToastMessage.postValue("请选择问题分类!") + return@launch + } else if (taskBean.cause.isEmpty()) { + liveDataToastMessage.postValue("请选择初步分析原因!") + return@launch + } + val realm = Realm.getDefaultInstance() + liveDataQsRecordBean.value!!.taskId = liveDataTaskBean.value!!.id liveDataQsRecordBean.value!!.checkTime = DateTimeUtil.getDataTime() realm.executeTransaction { it.copyToRealmOrUpdate(liveDataQsRecordBean.value) } -// realm.close() mapController.markerHandle.addOrUpdateQsRecordMark(liveDataQsRecordBean.value!!) liveDataFinish.postValue(true) } } + /** + * 删除数据 + */ fun deleteData(context: Context) { val mDialog = FirstDialog(context) mDialog.setTitle("提示?") @@ -368,39 +444,49 @@ class EvaluationResultViewModel @Inject constructor( viewModelScope.launch(Dispatchers.IO) { - Realm.getDefaultInstance().use { realm -> - realm.executeTransactionAsync { bgRealm -> - // find the item + val realm = Realm.getDefaultInstance() + val objects = realm.where(QsRecordBean::class.java).equalTo("id", id).findFirst() + Log.e("jingo", "查询数据 id= $id") + if (objects != null) { + oldBean = realm.copyFromRealm(objects) + oldBean?.let { + /** + * 获取当前所选的任务 + */ val objects = - bgRealm.where(QsRecordBean::class.java).equalTo("id", id).findFirst() + realm.where(TaskBean::class.java).equalTo("id", it.taskId).findFirst() if (objects != null) { - oldBean = bgRealm.copyFromRealm(objects) - oldBean?.let { - liveDataQsRecordBean.postValue(it.copy()) - val p = GeometryTools.createGeoPoint(it.geometry) - mapController.markerHandle.addMarker( - GeoPoint( - p.latitude, - p.longitude - ), markerTitle - ) + liveDataTaskBean.postValue(realm.copyFromRealm(objects)) + } - //获取linkid - if (it.linkId.isNotEmpty()) { - viewModelScope.launch(Dispatchers.IO) { - val link = realmOperateHelper.queryLink(it.linkId) - link?.let { l -> - mapController.lineHandler.showLine(l.geometry) - } - } + liveDataQsRecordBean.postValue(it.copy()) + val p = GeometryTools.createGeoPoint(it.geometry) + mapController.markerHandle.addMarker( + GeoPoint( + p.latitude, p.longitude + ), TAG + ) + + //获取linkid + if (it.linkId.isNotEmpty()) { + val link = realmOperateHelper.queryLink(it.linkId) + if (link != null) { + mapController.lineHandler.showLine(link.geometry) + } else { + val realmR = realm.where(HadLinkDvoBean::class.java) + .equalTo("linkPid", it.linkId).and().equalTo("taskId", it.taskId) + .findFirst() + if (realmR != null) { + mapController.lineHandler.showLine(realmR.geometry) } - liveDataQsRecordBean.value?.attachmentBeanList = - it.attachmentBeanList - // 显示语音数据到界面 - getChatMsgEntityList() } } + liveDataQsRecordBean.value?.attachmentBeanList = it.attachmentBeanList + // 显示语音数据到界面 + getChatMsgEntityList() } + } else { + liveDataToastMessage.postValue("数据读取失败") } } } @@ -408,7 +494,7 @@ class EvaluationResultViewModel @Inject constructor( /** * 查询问题类型列表 */ - fun getChatMsgEntityList() { + private suspend fun getChatMsgEntityList() { val chatMsgEntityList: MutableList = ArrayList() liveDataQsRecordBean.value?.attachmentBeanList?.forEach { //1 录音 @@ -535,8 +621,7 @@ class EvaluationResultViewModel @Inject constructor( viewModelScope.launch(Dispatchers.IO) { // 创建一个名为 "MyApp" 的文件夹 val myAppDir = File(Constant.USER_DATA_ATTACHEMNT_PATH) - if (!myAppDir.exists()) - myAppDir.mkdirs() // 确保文件夹已创建 + if (!myAppDir.exists()) myAppDir.mkdirs() // 确保文件夹已创建 // 创建一个名为 fileName 的文件 val file = File(myAppDir, "${UUID.randomUUID()}.png") @@ -558,4 +643,20 @@ class EvaluationResultViewModel @Inject constructor( } } + + /** + * 监听任务选择变化 + */ + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) { + if (key == Constant.SELECT_TASK_ID && oldBean == null) { + viewModelScope.launch(Dispatchers.IO) { + val taskId = sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) + val realm = Realm.getDefaultInstance() + val objects = realm.where(TaskBean::class.java).equalTo("id", taskId).findFirst() + if (objects != null) { + liveDataTaskBean.postValue(realm.copyFromRealm(objects)) + } + } + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt index 6945c9a9..a6e7d636 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklink/TaskLinkViewModel.kt @@ -246,7 +246,7 @@ class TaskLinkViewModel @Inject constructor( /** * 监听shared变化 */ - override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) { if (key == Constant.SELECT_TASK_ID) { getTaskBean() } @@ -313,32 +313,47 @@ class TaskLinkViewModel @Inject constructor( * 删除数据 */ fun deleteData(context: Context) { - if(hadLinkDvoBean == null){ + if (hadLinkDvoBean == null) { liveDataFinish.value = true return } val mDialog = FirstDialog(context) mDialog.setTitle("提示?") mDialog.setMessage("是否删除Mark,请确认!") - mDialog.setPositiveButton("确定" + mDialog.setPositiveButton( + "确定" ) { _, _ -> mDialog.dismiss() viewModelScope.launch(Dispatchers.IO) { val realm = Realm.getDefaultInstance() realm.executeTransaction { - val task = it.where(TaskBean::class.java).equalTo("id",hadLinkDvoBean!!.taskId).findFirst() - if(task != null) { + //先找到对应的任务 + val task = it.where(TaskBean::class.java).equalTo("id", hadLinkDvoBean!!.taskId) + .findFirst() + //维护任务删除当前link + if (task != null) { for (h in task.hadLinkDvoList) { - if(h.linkPid == hadLinkDvoBean!!.linkPid) + if (h.linkPid == hadLinkDvoBean!!.linkPid) task.hadLinkDvoList.remove(h) break } realm.copyToRealmOrUpdate(task) } -// val objects = it.where(HadLinkDvoBean::class.java) -// .equalTo("linkPid", hadLinkDvoBean!!.linkPid).findFirst() -// objects?.deleteFromRealm() + //删除link + val objects = it.where(HadLinkDvoBean::class.java) + .equalTo("linkPid", hadLinkDvoBean!!.linkPid).findFirst() + objects?.deleteFromRealm() + //删除相关联的评测任务 + val qsRecordBeans = it.where(QsRecordBean::class.java) + .equalTo("linkId", hadLinkDvoBean!!.linkPid).and() + .equalTo("taskId", hadLinkDvoBean!!.taskId).findAll() + if (qsRecordBeans != null) { + for (b in qsRecordBeans) { + mapController.markerHandle.removeQsRecordMark(b) + } + qsRecordBeans.deleteAllFromRealm() + } } mapController.lineHandler.removeTaskLink(hadLinkDvoBean!!.linkPid) mapController.mMapView.vtmMap.updateMap(true) diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskFragment.kt index afe01176..9312378b 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskFragment.kt @@ -17,8 +17,12 @@ import com.navinfo.omqs.R import com.navinfo.omqs.databinding.FragmentTaskBinding import com.navinfo.omqs.ui.fragment.BaseFragment import com.navinfo.omqs.ui.other.shareViewModels +import com.yanzhenjie.recyclerview.SwipeMenuBridge +import com.yanzhenjie.recyclerview.SwipeMenuCreator +import com.yanzhenjie.recyclerview.SwipeMenuItem import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch +import org.videolan.vlc.Util /** * 当前任务的道路列表 @@ -36,12 +40,8 @@ class TaskFragment : BaseFragment() { private val adapter: TaskAdapter by lazy { TaskAdapter(object : TaskAdapterCallback { override fun itemOnClick(bean: HadLinkDvoBean) { - if(bean!=null){ - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { - viewModel.showCurrentLink(bean) - } - }else{ - Toast.makeText(context, "数据错误,无法显示!", Toast.LENGTH_SHORT).show() + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { + viewModel.showCurrentLink(bean) } } @@ -63,11 +63,43 @@ class TaskFragment : BaseFragment() { override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + binding.taskAddLink.setOnClickListener { + viewModel.setSelectLink(!binding.taskAddLink.isSelected) + } + + viewModel.liveDataSelectNewLink.observe(viewLifecycleOwner) { + binding.taskAddLink.isSelected = it + } + + //注意:使用滑动菜单不能开启滑动删除,否则只有滑动删除没有滑动菜单 + val mSwipeMenuCreator = SwipeMenuCreator { _, rightMenu, _ -> + //添加菜单自动添加至尾部 + val deleteItem = SwipeMenuItem(context) + deleteItem.height = Util.convertDpToPx(requireContext(), 60) + deleteItem.width = Util.convertDpToPx(requireContext(), 80) + deleteItem.text = "删除" + deleteItem.background = requireContext().getDrawable(R.color.red) + deleteItem.setTextColor(requireContext().resources.getColor(R.color.white)) + rightMenu.addMenuItem(deleteItem) + } + val layoutManager = LinearLayoutManager(context) //// 设置 RecyclerView 的固定大小,避免在滚动时重新计算视图大小和布局,提高性能 binding.taskRecyclerview.setHasFixedSize(true) binding.taskRecyclerview.layoutManager = layoutManager + + //增加侧滑按钮 + binding.taskRecyclerview.setSwipeMenuCreator(mSwipeMenuCreator) + + + //单项点击 + binding.taskRecyclerview.setOnItemMenuClickListener { menuBridge, position -> + menuBridge.closeMenu() + viewModel.deleteTaskLink(requireContext(), adapter.data[position]) + } + binding.taskRecyclerview.adapter = adapter + binding.taskSearchClear.setOnClickListener { binding.taskSearch.setText("") } @@ -90,6 +122,7 @@ class TaskFragment : BaseFragment() { }) } + override fun onDestroyView() { super.onDestroyView() _binding = null diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt index 7e114aaa..1d83b1e9 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListFragment.kt @@ -106,6 +106,8 @@ class TaskListFragment : BaseFragment() { }) } + + override fun onDestroyView() { super.onDestroyView() _binding = null diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskManagerFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskManagerFragment.kt index 63285395..5d1634c7 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskManagerFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskManagerFragment.kt @@ -4,7 +4,9 @@ import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import android.widget.Toast import androidx.navigation.fragment.findNavController +import androidx.viewpager2.widget.ViewPager2 import com.google.android.material.tabs.TabLayoutMediator import com.navinfo.omqs.databinding.FragmentTaskManagerBinding import com.navinfo.omqs.ui.fragment.BaseFragment @@ -38,10 +40,20 @@ class TaskManagerFragment(private var backListener: ((TaskManagerFragment) -> Un override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + viewModel.liveDataToastMessage.observe(viewLifecycleOwner) { + Toast.makeText(requireContext(), it, Toast.LENGTH_SHORT).show() + } //禁止滑动,因为页面在抽屉里,和抽屉的滑动有冲突 binding.taskManagerViewpager.isUserInputEnabled = false //创建viewpager2的适配器 binding.taskManagerViewpager.adapter = activity?.let { TaskManagerAdapter(it) } + binding.taskManagerViewpager.registerOnPageChangeCallback(object : + ViewPager2.OnPageChangeCallback() { + override fun onPageSelected(position: Int) { + viewModel.setSelectLink(false) + } + }) + //绑定viewpager2与tabLayout TabLayoutMediator( binding.taskManagerTabLayout, diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt index 4d0f8e8c..b6f25996 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt @@ -1,12 +1,11 @@ package com.navinfo.omqs.ui.fragment.tasklist -import android.app.Dialog import android.content.Context import android.content.SharedPreferences import android.content.SharedPreferences.OnSharedPreferenceChangeListener import android.os.Build +import android.view.View import android.widget.Toast -import androidx.annotation.RequiresApi import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope @@ -16,8 +15,10 @@ import com.navinfo.collect.library.data.entity.NiLocation import com.navinfo.collect.library.data.entity.QsRecordBean import com.navinfo.collect.library.data.entity.TaskBean import com.navinfo.collect.library.map.NIMapController +import com.navinfo.collect.library.map.OnGeoPointClickListener import com.navinfo.collect.library.utils.GeometryTools import com.navinfo.omqs.Constant +import com.navinfo.omqs.db.RealmOperateHelper import com.navinfo.omqs.http.NetResult import com.navinfo.omqs.http.NetworkService import com.navinfo.omqs.tools.FileManager @@ -26,6 +27,8 @@ import com.navinfo.omqs.util.DateTimeUtil import dagger.hilt.android.lifecycle.HiltViewModel import io.realm.Realm import kotlinx.coroutines.* +import kotlinx.coroutines.flow.collectLatest +import org.oscim.core.GeoPoint import javax.inject.Inject @@ -33,8 +36,10 @@ import javax.inject.Inject class TaskViewModel @Inject constructor( private val networkService: NetworkService, private val mapController: NIMapController, - private val sharedPreferences: SharedPreferences + private val sharedPreferences: SharedPreferences, + private val realmOperateHelper: RealmOperateHelper, ) : ViewModel(), OnSharedPreferenceChangeListener { + private val TAG = "TaskViewModel" /** * 用来更新任务列表 @@ -58,6 +63,11 @@ class TaskViewModel @Inject constructor( */ val liveDataCloseTask = MutableLiveData() + /** + * 提示信息 + */ + val liveDataToastMessage = MutableLiveData() + /** * 当前选中的任务 */ @@ -70,6 +80,10 @@ class TaskViewModel @Inject constructor( private var filterTaskJob: Job? = null + /** + * 是否开启了道路选择 + */ + var liveDataSelectNewLink = MutableLiveData(false) init { sharedPreferences.registerOnSharedPreferenceChangeListener(this) @@ -318,65 +332,13 @@ class TaskViewModel @Inject constructor( * 关闭任务 */ fun removeTask(context: Context, taskBean: TaskBean) { - if (taskBean != null) { - val mDialog = FirstDialog(context) - mDialog.setTitle("提示?") - mDialog.setMessage("是否关闭,请确认!") - mDialog.setPositiveButton("确定", object : FirstDialog.OnClickListener { - override fun onClick(dialog: Dialog?, which: Int) { - mDialog.dismiss() - viewModelScope.launch(Dispatchers.IO) { - val realm = Realm.getDefaultInstance() - realm.executeTransaction { - val objects = it.where(TaskBean::class.java) - .equalTo("id", taskBean.id).findFirst() - objects?.deleteFromRealm() - } - //遍历删除对应的数据 - taskBean.hadLinkDvoList.forEach { hadLinkDvoBean -> - val qsRecordList = realm.where(QsRecordBean::class.java) - .equalTo("linkId", hadLinkDvoBean.linkPid).findAll() - if (qsRecordList != null && qsRecordList.size > 0) { - val copyList = realm.copyFromRealm(qsRecordList) - copyList.forEach { - it.deleteFromRealm() - mapController.markerHandle.removeQsRecordMark(it) - mapController.mMapView.vtmMap.updateMap(true) - } - } - } - //过滤掉已上传的超过90天的数据 - var nowTime: Long = DateTimeUtil.getNowDate().time - var beginNowTime: Long = nowTime - 90 * 3600 * 24 * 1000L - var syncUpload: Int = FileManager.Companion.FileUploadStatus.DONE - val objects = realm.where(TaskBean::class.java) - .notEqualTo("syncStatus", syncUpload).or() - .between("operationTime", beginNowTime, nowTime) - .equalTo("syncStatus", syncUpload).findAll() - val taskList = realm.copyFromRealm(objects) - for (item in taskList) { - FileManager.checkOMDBFileInfo(item) - } - liveDataTaskList.postValue(taskList) - liveDataCloseTask.postValue(true) - } - } - }) - mDialog.setNegativeButton("取消", object : FirstDialog.OnClickListener { - override fun onClick(dialog: Dialog?, which: Int) { - liveDataCloseTask.postValue(false) - mDialog.dismiss() - } - }) - mDialog.show() - } val mDialog = FirstDialog(context) mDialog.setTitle("提示?") mDialog.setMessage("是否关闭,请确认!") mDialog.setPositiveButton( "确定" - ) { _, _ -> - mDialog.dismiss() + ) { dialog, _ -> + dialog.dismiss() viewModelScope.launch(Dispatchers.IO) { val realm = Realm.getDefaultInstance() realm.executeTransaction { @@ -387,7 +349,8 @@ class TaskViewModel @Inject constructor( //遍历删除对应的数据 taskBean.hadLinkDvoList.forEach { hadLinkDvoBean -> val qsRecordList = realm.where(QsRecordBean::class.java) - .equalTo("linkId", hadLinkDvoBean.linkPid).findAll() + .equalTo("linkId", hadLinkDvoBean.linkPid).and() + .equalTo("taskId", hadLinkDvoBean.taskId).findAll() if (qsRecordList != null && qsRecordList.size > 0) { val copyList = realm.copyFromRealm(qsRecordList) copyList.forEach { @@ -410,9 +373,15 @@ class TaskViewModel @Inject constructor( FileManager.checkOMDBFileInfo(item) } liveDataTaskList.postValue(taskList) + liveDataCloseTask.postValue(true) } } - mDialog.setNegativeButton("取消", null) + mDialog.setNegativeButton( + "取消" + ) { _, _ -> + liveDataCloseTask.postValue(false) + mDialog.dismiss() + } mDialog.show() } @@ -421,7 +390,8 @@ class TaskViewModel @Inject constructor( val realm = Realm.getDefaultInstance() taskBean.hadLinkDvoList.forEach { hadLinkDvoBean -> val objects = realm.where(QsRecordBean::class.java) - .equalTo("linkId", hadLinkDvoBean.linkPid).findAll() + .equalTo("linkId", hadLinkDvoBean.linkPid).and() + .equalTo("taskId", hadLinkDvoBean.taskId).findAll() val map: MutableMap = HashMap() if (objects.isEmpty() && hadLinkDvoBean.reason.isEmpty()) { withContext(Dispatchers.Main) { @@ -452,11 +422,127 @@ class TaskViewModel @Inject constructor( /** * 监听新增的评测link */ - override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences?, key: String?) { + override fun onSharedPreferenceChanged(sharedPreferences: SharedPreferences, key: String) { if (key == Constant.SHARED_SYNC_TASK_LINK_ID) { viewModelScope.launch(Dispatchers.IO) { getLocalTaskList() } } } + + /** + * 设置是否开启选择link + */ + fun setSelectLink(selected: Boolean) { + liveDataSelectNewLink.value = selected + //开始捕捉 + if (selected) { + mapController.mMapView.addOnNIMapClickListener(TAG, object : OnGeoPointClickListener { + override fun onMapClick(tag: String, point: GeoPoint) { + if (tag == TAG) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + viewModelScope.launch(Dispatchers.Default) { + if (currentSelectTaskBean == null) { + liveDataToastMessage.postValue("还没有开启任何任务") + } else { + val links = realmOperateHelper.queryLink( + point = point, + ) + if (links.isNotEmpty()) { + val l = links[0] + for (link in currentSelectTaskBean!!.hadLinkDvoList) { + if (link.linkPid == l.properties["linkPid"]) { + return@launch + } + } + val hadLinkDvoBean = HadLinkDvoBean( + taskId = currentSelectTaskBean!!.id, + linkPid = l.properties["linkPid"]!!, + geometry = l.geometry, + linkStatus = 2 + ) + currentSelectTaskBean!!.hadLinkDvoList.add( + hadLinkDvoBean + ) + val realm = Realm.getDefaultInstance() + realm.executeTransaction { r -> + r.copyToRealmOrUpdate(hadLinkDvoBean) + r.copyToRealmOrUpdate(currentSelectTaskBean!!) + } + liveDataTaskLinks.postValue(currentSelectTaskBean!!.hadLinkDvoList) + mapController.lineHandler.addTaskLink(hadLinkDvoBean) + } + } + } + } + } + } + + }) + } else { + mapController.mMapView.removeOnNIMapClickListener(TAG) + mapController.lineHandler.removeLine() + } + } + + /** + * 删除评测link + */ + fun deleteTaskLink(context: Context, hadLinkDvoBean: HadLinkDvoBean) { + if (hadLinkDvoBean.linkStatus == 1) { + val mDialog = FirstDialog(context) + mDialog.setTitle("提示") + mDialog.setMessage("当前要评测的link是任务原始规划的,不能删除,如果不进行作业请标记原因") + mDialog.setCancelVisibility(View.GONE) + mDialog.setPositiveButton( + "确定" + ) { _, _ -> + mDialog.dismiss() + } + mDialog.show() + } else { + val mDialog = FirstDialog(context) + mDialog.setTitle("提示") + mDialog.setMessage("是否删除当前link,与之相关联的评测任务会一起删除!!") + mDialog.setPositiveButton( + "确定" + ) { dialog, _ -> + dialog.dismiss() + viewModelScope.launch(Dispatchers.IO) { + val realm = Realm.getDefaultInstance() + realm.executeTransaction { + for (link in currentSelectTaskBean!!.hadLinkDvoList) { + if (link.linkPid == hadLinkDvoBean.linkPid) { + currentSelectTaskBean!!.hadLinkDvoList.remove(link) + break + } + } + realm.where(HadLinkDvoBean::class.java) + .equalTo("linkPid", hadLinkDvoBean.linkPid).findFirst() + ?.deleteFromRealm() + val markers = realm.where(QsRecordBean::class.java) + .equalTo("linkId", hadLinkDvoBean.linkPid) + .and().equalTo("taskId", hadLinkDvoBean.taskId) + .findAll() + if(markers != null){ + for(marker in markers){ + mapController.markerHandle.removeQsRecordMark(marker) + } + markers.deleteAllFromRealm() + } + + realm.copyToRealmOrUpdate(currentSelectTaskBean) + mapController.lineHandler.removeTaskLink(hadLinkDvoBean.linkPid) + liveDataTaskLinks.postValue(currentSelectTaskBean!!.hadLinkDvoList) + } + } + } + mDialog.setNegativeButton( + "取消" + ) { _, _ -> + mDialog.dismiss() + } + mDialog.show() + } + } } diff --git a/app/src/main/res/drawable-v24/baseline_add_24.xml b/app/src/main/res/drawable-v24/baseline_add_24.xml new file mode 100644 index 00000000..647e5ea9 --- /dev/null +++ b/app/src/main/res/drawable-v24/baseline_add_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable-v24/baseline_add_24_press.xml b/app/src/main/res/drawable-v24/baseline_add_24_press.xml new file mode 100644 index 00000000..c52171ce --- /dev/null +++ b/app/src/main/res/drawable-v24/baseline_add_24_press.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable/selector_add_taskline.xml b/app/src/main/res/drawable/selector_add_taskline.xml new file mode 100644 index 00000000..45941ce4 --- /dev/null +++ b/app/src/main/res/drawable/selector_add_taskline.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/app/src/main/res/layout/fragment_evaluation_result.xml b/app/src/main/res/layout/fragment_evaluation_result.xml index 7d77f88b..d1186c70 100644 --- a/app/src/main/res/layout/fragment_evaluation_result.xml +++ b/app/src/main/res/layout/fragment_evaluation_result.xml @@ -87,6 +87,24 @@ android:layout_marginBottom="7dp" android:orientation="vertical"> + + + + + + + + + + - () +// val onMapClickFlow = MutableSharedFlow() fun init( context: AppCompatActivity, @@ -43,13 +39,26 @@ class NIMapController { measureLayerHandler = MeasureLayerHandler(context, mapView) mMapView = mapView mMapView.setOnMapClickListener { - context.lifecycleScope.launch { - onMapClickFlow.emit(it) + if (mapView.listenerTagList.isNotEmpty()) { + val tag = mapView.listenerTagList.last() + val listenerList = mapView.listenerList[tag] + if (listenerList != null) { + for (listener in listenerList) { + if (listener is OnGeoPointClickListener) { + listener.onMapClick(tag, it) + return@setOnMapClickListener + } + } + } } + +// context.lifecycleScope.launch { +// onMapClickFlow.emit(it) +// } + } mapView.setOptions(options) } - - } + diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapView.java b/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapView.java index e10dd9a2..f07e6217 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapView.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapView.java @@ -3,8 +3,8 @@ package com.navinfo.collect.library.map; import android.content.Context; import android.os.Build; import android.os.Bundle; +import android.text.TextUtils; import android.util.AttributeSet; -import android.util.Log; import android.view.LayoutInflater; import android.view.MotionEvent; import android.view.View; @@ -12,12 +12,12 @@ import android.view.ViewGroup; import android.widget.ImageView; import android.widget.RelativeLayout; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import com.navinfo.collect.library.R; import com.navinfo.collect.library.data.entity.NiLocation; import com.navinfo.collect.library.map.layers.NaviMapScaleBar; -import com.navinfo.collect.library.map.source.MapLifeNiLocationTileSource; import org.oscim.android.MapPreferences; import org.oscim.android.MapView; @@ -29,22 +29,14 @@ import org.oscim.event.Gesture; import org.oscim.event.GestureListener; import org.oscim.layers.GroupLayer; import org.oscim.layers.Layer; -import org.oscim.layers.tile.buildings.BuildingLayer; -import org.oscim.layers.tile.vector.OsmTileLayer; import org.oscim.layers.tile.vector.VectorTileLayer; -import org.oscim.layers.tile.vector.labeling.LabelLayer; -import org.oscim.layers.tile.vector.labeling.LabelTileLoaderHook; import org.oscim.map.Map; import org.oscim.renderer.GLViewport; import org.oscim.scalebar.MapScaleBarLayer; -import org.oscim.theme.IRenderTheme; -import org.oscim.theme.ThemeLoader; import org.oscim.theme.VtmThemes; -import org.oscim.tiling.source.mapfile.MapFileTileSource; -import org.oscim.tiling.source.mapfile.MultiMapFileTileSource; -import java.io.File; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; @@ -91,11 +83,6 @@ public final class NIMapView extends RelativeLayout { * 地图状态设置 */ private NIMapOptions options; - /** - * 地图图层管理器 - */ -// private NILayerManager mLayerManager; -// private Layer baseRasterLayer, defaultVectorTileLayer, defaultVectorLabelLayer, gridLayer; /** * 地图网格图层 */ @@ -109,6 +96,23 @@ public final class NIMapView extends RelativeLayout { protected String mapFilePath = "/map"; protected GroupLayer baseGroupLayer; // 用于盛放所有基础底图的图层组,便于统一管理 + + private HashMap listenerList = new HashMap(); + private List listenerTagList = new ArrayList(); + + public HashMap getListenerList() { + return listenerList; + } + + /** + * 获取所有tag + * + * @return + */ + public List getListenerTagList() { + return listenerTagList; + } + public void setOptions(NIMapOptions option) { this.options = option; initOptions(); @@ -812,8 +816,6 @@ public final class NIMapView extends RelativeLayout { /** * 设置logo显隐 - * - * @param position 按钮位置 */ public void setLogoVisable(int visable) { if (logoImage != null) { @@ -886,12 +888,13 @@ public final class NIMapView extends RelativeLayout { /** * 设置比例尺位置 + * * @param position * @param xOffset * @param yOffset */ - public void setScaleBarLayer(GLViewport.Position position, int xOffset, int yOffset){ - if(mapScaleBarLayer!=null&&mapView.map().layers().contains(mapScaleBarLayer)){ + public void setScaleBarLayer(GLViewport.Position position, int xOffset, int yOffset) { + if (mapScaleBarLayer != null && mapView.map().layers().contains(mapScaleBarLayer)) { mapView.map().layers().remove(mapScaleBarLayer); mapScaleBarLayer = null; } @@ -1029,4 +1032,39 @@ public final class NIMapView extends RelativeLayout { mapView.map().updateMap(redraw); } + + /** + * 增加地图点击监听 + */ + public boolean addOnNIMapClickListener(@NonNull String tag, @NonNull BaseClickListener... listeners) { + if (TextUtils.equals(tag, "")) { + return false; + } + for (Object s : listenerTagList) { + if (s == tag) { + return false; + } + } + listenerTagList.add(tag); + listenerList.put(tag, listeners); + return true; + } + + /** + * 移除点击监听 + * + * @param tag + */ + public void removeOnNIMapClickListener(@NonNull String tag) { + listenerList.remove(tag); + for (String t : listenerTagList) { + if (t.equals(tag)) { + listenerTagList.remove(t); + return; + } + } + } } + + + diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/OnGeoPointClickListener.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/OnGeoPointClickListener.kt new file mode 100644 index 00000000..339ed625 --- /dev/null +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/OnGeoPointClickListener.kt @@ -0,0 +1,7 @@ +package com.navinfo.collect.library.map + +import org.oscim.core.GeoPoint + +interface OnGeoPointClickListener : BaseClickListener { + fun onMapClick(tag: String, point: GeoPoint) +} diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt index c52bbd7e..3a38ab3c 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LineHandler.kt @@ -4,6 +4,7 @@ import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import com.navinfo.collect.library.R import com.navinfo.collect.library.data.entity.HadLinkDvoBean +import com.navinfo.collect.library.map.BaseClickListener import com.navinfo.collect.library.map.NIMapView import com.navinfo.collect.library.map.layers.MultiLinesLayer import com.navinfo.collect.library.map.layers.OmdbTaskLinkLayer @@ -19,21 +20,23 @@ import org.oscim.layers.vector.geometries.Style class LineHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler(context, mapView) { - //绘制线 样式 - private val lineStyle: Style - - //高亮线绘制线 样式 - private val defaultLineStyle: Style /** * 高亮线图层,同时只高亮一条线,如线选择 */ - private val mDefaultPathLayer: PathLayer + private val mDefaultPathLayer: PathLayer by lazy { + //高亮线绘制线 样式 + val defaultLineStyle = Style.builder() + .stippleColor(context.resources.getColor(R.color.draw_line_blue2_color)) + .strokeWidth(10f) + .fillColor(context.resources.getColor(R.color.teal_200)) + .fillAlpha(0.5f) + .strokeColor(context.resources.getColor(R.color.teal_200)) + .fixed(true).build() - private var onTaskLinkItemClickListener: OnTaskLinkItemClickListener? = null - - fun setOnTaskLinkItemClickListener(listener: OnTaskLinkItemClickListener) { - onTaskLinkItemClickListener = listener + val layer = PathLayer(mMapView.vtmMap, defaultLineStyle) + addLayer(layer, NIMapView.LAYER_GROUPS.OPERATE_LINE) + layer } @@ -84,12 +87,18 @@ class LineHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler( markerSymbol, object : OnItemGestureListener { override fun onItemSingleTapUp(index: Int, item: MarkerInterface?): Boolean { - onTaskLinkItemClickListener?.let { - if (item is MarkerItem) { - it.onTaskLink(item.title) + val tag = mMapView.listenerTagList.last() + val listenerList = mMapView.listenerList[tag] + if (listenerList != null) { + for (listener in listenerList) { + if (listener is OnTaskLinkItemClickListener) { + if (item is MarkerItem) { + listener.onTaskLink(tag, item.title) + } + break + } } } - return false } @@ -103,30 +112,6 @@ class LineHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler( layer } - init { - - //新增线数据图层和线样式 - lineStyle = Style.builder() - .stippleColor(context.resources.getColor(R.color.draw_line_blue1_color)) - .strokeWidth(4f) - .fillColor(context.resources.getColor(R.color.draw_line_blue2_color)) - .fillAlpha(0.5f) - .strokeColor(context.resources.getColor(R.color.draw_line_blue2_color)) - .fixed(true).build() - - - defaultLineStyle = Style.builder() - .stippleColor(context.resources.getColor(R.color.draw_line_blue2_color)) - .strokeWidth(10f) - .fillColor(context.resources.getColor(R.color.teal_200)) - .fillAlpha(0.5f) - .strokeColor(context.resources.getColor(R.color.teal_200)) - .fixed(true).build() - - mDefaultPathLayer = PathLayer(mMapView.vtmMap, defaultLineStyle) - addLayer(mDefaultPathLayer, NIMapView.LAYER_GROUPS.OPERATE_LINE) - - } /** * 高亮一条线 @@ -226,6 +211,6 @@ class LineHandler(context: AppCompatActivity, mapView: NIMapView) : BaseHandler( } } -interface OnTaskLinkItemClickListener { - fun onTaskLink(taskLinkId: String) +interface OnTaskLinkItemClickListener : BaseClickListener { + fun onTaskLink(tag: String, taskLinkId: String) } \ No newline at end of file diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt index 4b1a65e0..c7aa09be 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/MarkHandler.kt @@ -11,6 +11,7 @@ import com.navinfo.collect.library.R import com.navinfo.collect.library.data.entity.NiLocation import com.navinfo.collect.library.data.entity.NoteBean import com.navinfo.collect.library.data.entity.QsRecordBean +import com.navinfo.collect.library.map.BaseClickListener import com.navinfo.collect.library.map.NIMapView import com.navinfo.collect.library.map.cluster.ClusterMarkerItem import com.navinfo.collect.library.map.cluster.ClusterMarkerRenderer @@ -145,18 +146,22 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : list: MutableList, nearest: Int ): Boolean { - itemListener?.let { - val idList = mutableListOf() - if (list.size == 0) { - } else { - for (i in list) { - val markerInterface: MarkerInterface = - qsRecordItemizedLayer.itemList[i] - if (markerInterface is MarkerItem) { - idList.add(markerInterface.title) + val tag = mMapView.listenerTagList.last() + val listenerList = mMapView.listenerList[tag] + if (listenerList != null) { + for (listener in listenerList) { + if (listener is OnQsRecordItemClickListener) { + val idList = mutableListOf() + for (i in list) { + val markerInterface: MarkerInterface = + qsRecordItemizedLayer.itemList[i] + if (markerInterface is MarkerItem) { + idList.add(markerInterface.title) + } } + listener.onQsRecordList(tag, idList.distinct().toMutableList()) + break } - it.onQsRecordList(idList.distinct().toMutableList()) } } return true @@ -185,8 +190,18 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : ) layer.setOnItemGestureListener(object : OnItemGestureListener { override fun onItemSingleTapUp(index: Int, item: MarkerInterface?): Boolean { - itemListener?.let { - it.onNiLocation((niLocationItemizedLayer.itemList[index] as MarkerItem).uid as NiLocation) + val tag = mMapView.listenerTagList.last() + val listenerList = mMapView.listenerList[tag] + if (listenerList != null) { + for (listener in listenerList) { + if (listener is OnNiLocationItemListener) { + listener.onNiLocation( + tag, + (niLocationItemizedLayer.itemList[index] as MarkerItem).uid as NiLocation + ) + break + } + } } return true } @@ -222,10 +237,17 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : ) layer.setOnItemGestureListener(object : OnItemGestureListener { override fun onItemSingleTapUp(index: Int, item: MarkerInterface?): Boolean { - itemListener?.let { - val marker = layer.itemList[index] - if (marker is MarkerItem) - it.onNote(marker.title) + val tag = mMapView.listenerTagList.last() + val listenerList = mMapView.listenerList[tag] + if (listenerList != null) { + for (listener in listenerList) { + if (listener is ONNoteItemClickListener) { + val marker = layer.itemList[index] + if (marker is MarkerItem) + listener.onNote(tag, marker.title) + break + } + } } return true } @@ -241,7 +263,6 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : private val resId = R.mipmap.map_icon_report private val noteResId = R.drawable.icon_note_marker - private var itemListener: OnQsRecordItemClickListener? = null /** * 文字大小 @@ -259,17 +280,10 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : }) } - /** - * 设置marker 点击回调 - */ - fun setOnQsRecordItemClickListener(listener: OnQsRecordItemClickListener?) { - itemListener = listener - } /** * 增加marker */ - fun addMarker( geoPoint: GeoPoint, title: String?, @@ -753,10 +767,24 @@ class MarkHandler(context: AppCompatActivity, mapView: NIMapView) : niLocationItemizedLayer.update() } + /** + * 移除所有质检数据 + */ + fun removeAllQsMarker() { + qsRecordItemizedLayer.removeAllItems() + mMapView.updateMap(true) + } + } -interface OnQsRecordItemClickListener { - fun onQsRecordList(list: MutableList) - fun onNote(noteId: String) - fun onNiLocation(it: NiLocation) +interface OnQsRecordItemClickListener : BaseClickListener { + fun onQsRecordList(tag: String, list: MutableList) } + +interface ONNoteItemClickListener : BaseClickListener { + fun onNote(tag: String, noteId: String) +} + +interface OnNiLocationItemListener : BaseClickListener { + fun onNiLocation(tag: String, it: NiLocation) +} \ No newline at end of file From 19876f8275df843a1314c20ebbb163bfebcafed7 Mon Sep 17 00:00:00 2001 From: squallzhjch Date: Fri, 21 Jul 2023 15:39:44 +0800 Subject: [PATCH 35/40] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=86=B2=E7=AA=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../omqs/ui/activity/map/MainActivity.kt | 24 ++++----- .../omqs/ui/activity/map/MainViewModel.kt | 52 ++++++++++--------- vtm | 2 +- 3 files changed, 38 insertions(+), 40 deletions(-) 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 ca816771..80e6f008 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 @@ -12,7 +12,6 @@ import android.widget.EditText import android.widget.Toast import androidx.activity.result.contract.ActivityResultContracts import androidx.activity.viewModels -import androidx.annotation.RequiresApi import androidx.databinding.DataBindingUtil import androidx.fragment.app.Fragment import androidx.lifecycle.lifecycleScope @@ -20,7 +19,6 @@ import androidx.navigation.findNavController import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.google.android.material.dialog.MaterialAlertDialogBuilder -import com.navinfo.collect.library.data.entity.NiLocation import com.navinfo.collect.library.map.NIMapController import com.navinfo.omqs.Constant import com.navinfo.omqs.R @@ -43,7 +41,6 @@ import com.navinfo.omqs.util.SpeakMode import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch import org.oscim.core.GeoPoint -import org.oscim.layers.marker.MarkerItem import org.oscim.renderer.GLViewport import org.videolan.vlc.Util import java.math.BigDecimal @@ -407,7 +404,7 @@ class MainActivity : BaseActivity() { val inputDialog = MaterialAlertDialogBuilder( this ).setTitle("坐标定位").setView(view) - var editText = view.findViewById(R.id.dialog_edittext) + val editText = view.findViewById(R.id.dialog_edittext) editText.hint = "请输入经纬度例如:\n116.1234567,39.1234567\n116.1234567 39.1234567" inputDialog.setNegativeButton("取消") { dialog, _ -> dialog.dismiss() @@ -670,8 +667,7 @@ class MainActivity : BaseActivity() { } } - @RequiresApi(Build.VERSION_CODES.N) - fun playVideo() { + private fun playVideo() { if (mapController.markerHandle.getCurrentMark() == null) { BaseToast.makeText(this, "请先选择轨迹点!", BaseToast.LENGTH_SHORT).show() return @@ -685,16 +681,14 @@ class MainActivity : BaseActivity() { /** * 设置为播放状态 */ - @RequiresApi(Build.VERSION_CODES.N) - fun setPlayStatus() { + private fun setPlayStatus() { //切换为播放 viewModel.setSelectPauseTrace(true) binding.mainActivitySnapshotPause.isSelected = viewModel.isSelectPauseTrace() playVideo() } - @RequiresApi(Build.VERSION_CODES.N) - fun pauseVideo() { + private fun pauseVideo() { val traceVideoBean = TraceVideoBean(command = "pauseVideo?", userid = Constant.USER_ID) viewModel.sendServerCommand(this, traceVideoBean, IndoorToolsCommand.STOP) } @@ -732,7 +726,7 @@ class MainActivity : BaseActivity() { } } - fun pasePlayTrace() { + fun pausePlayTrace() { viewModel.setSelectTrace(false) binding.mainActivityTraceSnapshotPoints.isSelected = viewModel.isSelectTrace() viewModel.setSelectPauseTrace(false) @@ -780,11 +774,11 @@ class MainActivity : BaseActivity() { mapController.mMapView.setScaleBarLayer(GLViewport.Position.BOTTOM_CENTER, 128, 65) } mapController.mMapView.vtmMap.animator().animateTo( - GeoPoint( - mapController.mMapView.vtmMap.mapPosition.geoPoint.latitude, - mapController.mMapView.vtmMap.mapPosition.geoPoint.longitude - ) + GeoPoint( + mapController.mMapView.vtmMap.mapPosition.geoPoint.latitude, + mapController.mMapView.vtmMap.mapPosition.geoPoint.longitude ) + ) } private fun voiceOnTouchStart() { 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 8e7e522b..6f758a6f 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 @@ -31,6 +31,7 @@ import com.navinfo.collect.library.map.OnGeoPointClickListener import com.navinfo.collect.library.map.handler.ONNoteItemClickListener import com.navinfo.collect.library.map.handler.OnNiLocationItemListener import com.navinfo.collect.library.map.handler.OnQsRecordItemClickListener +import com.navinfo.collect.library.map.handler.OnTaskLinkItemClickListener import com.navinfo.collect.library.utils.GeometryTools import com.navinfo.collect.library.utils.GeometryToolsKt import com.navinfo.omqs.Constant @@ -80,7 +81,8 @@ class MainViewModel @Inject constructor( private val realmOperateHelper: RealmOperateHelper, private val networkService: NetworkService, private val sharedPreferences: SharedPreferences -) : ViewModel(), SocketServer.OnConnectSinsListener, SharedPreferences.OnSharedPreferenceChangeListener { +) : ViewModel(), SocketServer.OnConnectSinsListener, + SharedPreferences.OnSharedPreferenceChangeListener { private val TAG = "MainViewModel" @@ -185,7 +187,7 @@ class MainViewModel @Inject constructor( private var timer: Timer? = null - private var disTime :Long = 1000 + private var disTime: Long = 1000 init { @@ -250,7 +252,7 @@ class MainViewModel @Inject constructor( * 处理定位点的点击 */ object : OnNiLocationItemListener { - override fun onNiLocation(tag: String, it: NiLocation) { + override fun onNiLocation(tag: String, index: Int, it: NiLocation) { if (tag == TAG) liveDataNILocationList.value = it } @@ -415,10 +417,10 @@ class MainViewModel @Inject constructor( ) ) } - withContext(Dispatchers.Main){ - if(Constant.AUTO_LOCATION){ + withContext(Dispatchers.Main) { + if (Constant.AUTO_LOCATION) { mapController.mMapView.vtmMap.animator() - .animateTo(GeoPoint( location.longitude, location.latitude)) + .animateTo(GeoPoint(location.longitude, location.latitude)) } } } @@ -597,7 +599,7 @@ class MainViewModel @Inject constructor( }) } - private fun initCameraDialog(context:Context){ + private fun initCameraDialog(context: Context) { if (mCameraDialog == null) { mCameraDialog = CommonDialog( context, @@ -903,10 +905,10 @@ class MainViewModel @Inject constructor( * @param niLocation 轨迹点 */ fun setCurrentIndexNiLocation(niLocation: NiLocation) { - viewModelScope.launch ( Dispatchers.IO ){ - Log.e("qj","开始$currentIndexNiLocation") + viewModelScope.launch(Dispatchers.IO) { + Log.e("qj", "开始$currentIndexNiLocation") currentIndexNiLocation = mapController.markerHandle.getNILocationIndex(niLocation)!! - Log.e("qj","结束$currentIndexNiLocation") + Log.e("qj", "结束$currentIndexNiLocation") } } @@ -957,7 +959,7 @@ class MainViewModel @Inject constructor( if (mNiLocation != null) { setCurrentIndexNiLocation(mNiLocation) showMarker(mapController.mMapView.context, mNiLocation) - Log.e("qj","反向控制$currentIndexNiLocation") + Log.e("qj", "反向控制$currentIndexNiLocation") } else { BaseToast.makeText( mapController.mMapView.context, @@ -967,12 +969,12 @@ class MainViewModel @Inject constructor( } } - fun isAutoCamera():Boolean{ + fun isAutoCamera(): Boolean { return shareUtil?.connectstate == true } - fun autoCamera(){ + fun autoCamera() { if (shareUtil?.connectstate == true) { val hostBean1 = HostBean() hostBean1.ipAddress = shareUtil!!.takeCameraIP @@ -983,28 +985,30 @@ class MainViewModel @Inject constructor( } fun startTimer() { - if(timer!=null){ + if (timer != null) { cancelTrace() } timer = fixedRateTimer("", false, disTime, disTime) { - if(currentIndexNiLocation Date: Fri, 21 Jul 2023 15:50:44 +0800 Subject: [PATCH 36/40] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=9D=9E=E7=A9=BA?= =?UTF-8?q?=E5=88=A4=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/navinfo/omqs/ui/activity/map/MainViewModel.kt | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) 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 6f758a6f..39f416f8 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 @@ -262,7 +262,9 @@ class MainViewModel @Inject constructor( viewModelScope.launch(Dispatchers.IO) { getTaskBean() //初始化选中的任务高亮高亮 - mapController.lineHandler.showTaskLines(currentTaskBean?.hadLinkDvoList!!) + if (currentTaskBean != null) { + mapController.lineHandler.showTaskLines(currentTaskBean!!.hadLinkDvoList) + } initQsRecordData() initNoteData() initNILocationData() From b92110c78585fa6a4330dbc64c6ebe70834d14f1 Mon Sep 17 00:00:00 2001 From: qiji4215 Date: Mon, 24 Jul 2023 14:28:49 +0800 Subject: [PATCH 37/40] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=B8=B2=E6=9F=93?= =?UTF-8?q?=E7=AD=96=E7=95=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/omdb_config.json | 5 ++ .../omqs/ui/activity/map/MainViewModel.kt | 4 +- .../main/res/menu/personal_center_menu.xml | 2 +- .../src/main/assets/editormarker.xml | 87 ++++++++++--------- .../src/main/assets/omdb/icon_1012_0.svg | 1 + vtm | 2 +- 6 files changed, 59 insertions(+), 42 deletions(-) create mode 100644 collect-library/src/main/assets/omdb/icon_1012_0.svg diff --git a/app/src/main/assets/omdb_config.json b/app/src/main/assets/omdb_config.json index f523a811..1cf75acf 100644 --- a/app/src/main/assets/omdb_config.json +++ b/app/src/main/assets/omdb_config.json @@ -1,5 +1,10 @@ { "tableMap" : { + "1012": { + "table": "OMDB_CHECKPOINT", + "code": 1012, + "name": "检查点" + }, "2001": { "table": "OMDB_RD_LINK", "code": 2001, 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 58600d3d..577bfab2 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 @@ -262,7 +262,9 @@ class MainViewModel @Inject constructor( viewModelScope.launch(Dispatchers.IO) { getTaskBean() //初始化选中的任务高亮高亮 - mapController.lineHandler.showTaskLines(currentTaskBean?.hadLinkDvoList!!) + if(currentTaskBean!=null){ + mapController.lineHandler.showTaskLines(currentTaskBean?.hadLinkDvoList!!) + } initQsRecordData() initNoteData() initNILocationData() diff --git a/app/src/main/res/menu/personal_center_menu.xml b/app/src/main/res/menu/personal_center_menu.xml index e457c118..07e15bcc 100644 --- a/app/src/main/res/menu/personal_center_menu.xml +++ b/app/src/main/res/menu/personal_center_menu.xml @@ -38,7 +38,7 @@ + android:title="版本:ONE_QE_V1.4.0_20230721_A" /> diff --git a/collect-library/src/main/assets/editormarker.xml b/collect-library/src/main/assets/editormarker.xml index 73eaf196..04a8b27d 100644 --- a/collect-library/src/main/assets/editormarker.xml +++ b/collect-library/src/main/assets/editormarker.xml @@ -1603,6 +1603,13 @@ + + + + + + @@ -1702,7 +1709,7 @@ --> - + 0 @@ -1713,7 +1720,7 @@ - + - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + @@ -1815,7 +1824,7 @@ - + diff --git a/collect-library/src/main/assets/omdb/icon_1012_0.svg b/collect-library/src/main/assets/omdb/icon_1012_0.svg new file mode 100644 index 00000000..6445aca0 --- /dev/null +++ b/collect-library/src/main/assets/omdb/icon_1012_0.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/vtm b/vtm index 1ee201a4..dd13e533 160000 --- a/vtm +++ b/vtm @@ -1 +1 @@ -Subproject commit 1ee201a41f78f169873848209a3f3bdac36f185a +Subproject commit dd13e533c38b5738ab404c2737d7ccadeff01323 From 33cc1dc2433b0fa6709e21f336f05944177d0fb2 Mon Sep 17 00:00:00 2001 From: squallzhjch Date: Tue, 25 Jul 2023 10:37:06 +0800 Subject: [PATCH 38/40] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E5=88=B7=E6=96=B0=E4=B8=8D=E5=8F=8A=E6=97=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/navinfo/omqs/db/ImportOMDBHelper.kt | 43 +++++++++++-------- .../http/taskdownload/TaskDownloadScope.kt | 5 ++- .../omqs/ui/activity/map/MainViewModel.kt | 2 +- .../map/handler/LayerManagerHandler.kt | 7 +++ vtm | 2 +- 5 files changed, 39 insertions(+), 20 deletions(-) diff --git a/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt b/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt index 64ac2675..3ad9680c 100644 --- a/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt +++ b/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt @@ -5,23 +5,19 @@ import android.database.Cursor.* import android.os.Build import android.util.Log import androidx.annotation.RequiresApi -import androidx.core.database.getBlobOrNull -import androidx.core.database.getFloatOrNull -import androidx.core.database.getIntOrNull -import androidx.core.database.getStringOrNull import com.blankj.utilcode.util.FileIOUtils import com.blankj.utilcode.util.ZipUtils import com.google.gson.Gson import com.google.gson.reflect.TypeToken +import com.navinfo.collect.library.data.entity.ReferenceEntity import com.navinfo.collect.library.data.entity.RenderEntity import com.navinfo.omqs.Constant import com.navinfo.omqs.bean.ImportConfig -import com.navinfo.omqs.bean.Transform -import com.navinfo.omqs.hilt.ImportOMDBHiltFactory import com.navinfo.omqs.hilt.OMDBDataBaseHiltFactory import dagger.assisted.Assisted import dagger.assisted.AssistedInject import io.realm.Realm +import io.realm.RealmQuery import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.flow @@ -137,8 +133,9 @@ class ImportOMDBHelper @AssistedInject constructor( // 开始解压zip文件 val unZipFiles = ZipUtils.unzipFile(omdbZipFile, unZipFolder) // 将listResult数据插入到Realm数据库中 + val realm = Realm.getDefaultInstance() + realm.beginTransaction() try { - Realm.getDefaultInstance().beginTransaction() // 遍历解压后的文件,读取该数据返回 for ((index, currentEntry) in importConfig.tableMap.entries.withIndex()) { val currentConfig = currentEntry.value @@ -153,12 +150,16 @@ class ImportOMDBHelper @AssistedInject constructor( if (list != null) { // 将list数据转换为map for ((index, line) in list.withIndex()) { - Log.d("ImportOMDBHelper", "解析第:${index+1}行") - val map = gson.fromJson>(line, object:TypeToken>(){}.getType()) + Log.d("ImportOMDBHelper", "解析第:${index + 1}行") + val map = gson.fromJson>( + line, + object : TypeToken>() {}.getType() + ) .toMutableMap() map["qi_table"] = currentConfig.table map["qi_name"] = currentConfig.name - map["qi_code"] = if (currentConfig.code == 0) currentConfig.code else currentEntry.key + map["qi_code"] = + if (currentConfig.code == 0) currentConfig.code else currentEntry.key // 先查询这个mesh下有没有数据,如果有则跳过即可 // val meshEntity = Realm.getDefaultInstance().where(RenderEntity::class.java).equalTo("properties['mesh']", map["mesh"].toString()).findFirst() @@ -171,16 +172,22 @@ class ImportOMDBHelper @AssistedInject constructor( for ((key, value) in map) { when (value) { is String -> renderEntity.properties.put(key, value) - is Int -> renderEntity.properties.put(key, value.toInt().toString()) - is Double -> renderEntity.properties.put(key, value.toDouble().toString()) + is Int -> renderEntity.properties.put( + key, + value.toInt().toString() + ) + is Double -> renderEntity.properties.put( + key, + value.toDouble().toString() + ) else -> renderEntity.properties.put(key, value.toString()) } } listResult.add(renderEntity) // 对renderEntity做预处理后再保存 val resultEntity = importConfig.transformProperties(renderEntity) - if (resultEntity!=null) { - Realm.getDefaultInstance().insert(renderEntity) + if (resultEntity != null) { + realm.insert(renderEntity) } } } @@ -189,12 +196,14 @@ class ImportOMDBHelper @AssistedInject constructor( emit("${index + 1}/${importConfig.tableMap.size}") // 如果当前解析的是OMDB_RD_LINK数据,将其缓存在预处理类中,以便后续处理其他要素时使用 if (currentConfig.table == "OMDB_RD_LINK") { - importConfig.preProcess.cacheRdLink = listResult.associateBy { it.properties["linkPid"] } + importConfig.preProcess.cacheRdLink = + listResult.associateBy { it.properties["linkPid"] } } } - Realm.getDefaultInstance().commitTransaction() + realm.commitTransaction() + realm.close() } catch (e: Exception) { - Realm.getDefaultInstance().cancelTransaction() + realm.cancelTransaction() throw e } emit("finish") diff --git a/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadScope.kt b/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadScope.kt index 53e1d6da..60ff56fc 100644 --- a/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadScope.kt +++ b/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadScope.kt @@ -133,10 +133,13 @@ class TaskDownloadScope( importOMDBHelper.importOmdbZipFile(importOMDBHelper.omdbFile).collect { Log.e("jingo", "数据安装 $it") if (it == "finish") { - change(FileDownloadStatus.DONE) withContext(Dispatchers.Main) { + downloadManager.mapController.layerManagerHandler.omdbLayersUpdate() downloadManager.mapController.mMapView.updateMap(true) + Log.e("jingo", "数据安装结束,刷新地图") } + change(FileDownloadStatus.DONE) + } else { change(FileDownloadStatus.IMPORTING, it) } 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 39f416f8..a7381b8d 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 @@ -369,7 +369,7 @@ class MainViewModel @Inject constructor( GeometryToolsKt.getTileYByGeometry(geometry.toString(), tileY) //遍历存储tile对应的x与y的值 - tileX.forEach { x -> + tileX.forEach { x -> tileY.forEach { y -> location.tilex = x location.tiley = y diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt index e3e4f8fa..3fd83edb 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/handler/LayerManagerHandler.kt @@ -217,6 +217,13 @@ class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView, traceP vectorNiLocationTileLayer.isEnabled = false labelNiLocationLayer.isEnabled = false } + + fun omdbLayersUpdate(){ +// omdbVectorTileLayer +// omdbReferenceTileLayer. + omdbLabelLayer.update() + omdbReferenceLabelLayer.update() + } } diff --git a/vtm b/vtm index 1ee201a4..c74bcd29 160000 --- a/vtm +++ b/vtm @@ -1 +1 @@ -Subproject commit 1ee201a41f78f169873848209a3f3bdac36f185a +Subproject commit c74bcd29c24cddf395fa9654ef0b69d0c88ac3ad From 43bd63a397f6d5f6bc3798e137b2e06717ebf014 Mon Sep 17 00:00:00 2001 From: qiji4215 Date: Wed, 26 Jul 2023 10:21:50 +0800 Subject: [PATCH 39/40] =?UTF-8?q?=E6=B8=B2=E6=9F=93=E8=A1=A8=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E4=BB=BB=E5=8A=A1id=E5=92=8C=E6=98=BE=E7=A4=BA?= =?UTF-8?q?=E7=BC=A9=E6=94=BE=E7=BA=A7=E5=88=AB=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/omdb_config.json | 66 +- .../main/java/com/navinfo/omqs/Constant.kt | 5 + .../com/navinfo/omqs/bean/ImportConfig.kt | 2 + .../com/navinfo/omqs/db/ImportOMDBHelper.kt | 14 +- .../com/navinfo/omqs/db/ImportPreProcess.kt | 79 ++- .../http/taskdownload/TaskDownloadScope.kt | 26 +- .../omqs/ui/activity/map/MainActivity.kt | 3 +- .../personalcenter/PersonalCenterFragment.kt | 4 +- .../personalcenter/PersonalCenterViewModel.kt | 16 +- .../src/main/assets/editormarker.xml | 639 ++++++++++++------ .../src/main/assets/omdb/4601/bus/1301_0.svg | 16 + .../src/main/assets/omdb/4601/bus/1301_1.svg | 15 + .../main/assets/omdb/4601/bus/1301_1_2.svg | 16 + .../main/assets/omdb/4601/bus/1301_1_2_3.svg | 17 + .../assets/omdb/4601/bus/1301_1_2_3_4.svg | 21 + .../main/assets/omdb/4601/bus/1301_1_2_4.svg | 17 + .../main/assets/omdb/4601/bus/1301_1_2_5.svg | 17 + .../main/assets/omdb/4601/bus/1301_1_2_6.svg | 17 + .../main/assets/omdb/4601/bus/1301_1_3.svg | 16 + .../main/assets/omdb/4601/bus/1301_1_3_4.svg | 17 + .../main/assets/omdb/4601/bus/1301_1_3_5.svg | 17 + .../main/assets/omdb/4601/bus/1301_1_3_6.svg | 17 + .../main/assets/omdb/4601/bus/1301_1_4.svg | 16 + .../main/assets/omdb/4601/bus/1301_1_5.svg | 16 + .../main/assets/omdb/4601/bus/1301_1_6.svg | 16 + .../main/assets/omdb/4601/bus/1301_1_7.svg | 18 + .../src/main/assets/omdb/4601/bus/1301_2.svg | 16 + .../main/assets/omdb/4601/bus/1301_2_3.svg | 17 + .../main/assets/omdb/4601/bus/1301_2_3_4.svg | 18 + .../main/assets/omdb/4601/bus/1301_2_4.svg | 17 + .../main/assets/omdb/4601/bus/1301_2_5.svg | 17 + .../main/assets/omdb/4601/bus/1301_2_6.svg | 17 + .../src/main/assets/omdb/4601/bus/1301_3.svg | 16 + .../main/assets/omdb/4601/bus/1301_3_4.svg | 17 + .../main/assets/omdb/4601/bus/1301_3_5.svg | 17 + .../main/assets/omdb/4601/bus/1301_3_6.svg | 17 + .../src/main/assets/omdb/4601/bus/1301_4.svg | 15 + .../main/assets/omdb/4601/bus/1301_4_5.svg | 17 + .../main/assets/omdb/4601/bus/1301_4_6.svg | 17 + .../src/main/assets/omdb/4601/bus/1301_5.svg | 16 + .../main/assets/omdb/4601/bus/1301_5_6.svg | 17 + .../src/main/assets/omdb/4601/bus/1301_6.svg | 16 + .../src/main/assets/omdb/4601/bus/1301_7.svg | 17 + .../main/assets/omdb/4601/extend/1301_0.svg | 16 + .../main/assets/omdb/4601/extend/1301_1.svg | 15 + .../main/assets/omdb/4601/extend/1301_1_2.svg | 16 + .../assets/omdb/4601/extend/1301_1_2_3.svg | 17 + .../assets/omdb/4601/extend/1301_1_2_3_4.svg | 21 + .../assets/omdb/4601/extend/1301_1_2_4.svg | 17 + .../assets/omdb/4601/extend/1301_1_2_5.svg | 17 + .../assets/omdb/4601/extend/1301_1_2_6.svg | 17 + .../main/assets/omdb/4601/extend/1301_1_3.svg | 16 + .../assets/omdb/4601/extend/1301_1_3_4.svg | 17 + .../assets/omdb/4601/extend/1301_1_3_5.svg | 17 + .../assets/omdb/4601/extend/1301_1_3_6.svg | 17 + .../main/assets/omdb/4601/extend/1301_1_4.svg | 16 + .../main/assets/omdb/4601/extend/1301_1_5.svg | 16 + .../main/assets/omdb/4601/extend/1301_1_6.svg | 16 + .../main/assets/omdb/4601/extend/1301_1_7.svg | 18 + .../main/assets/omdb/4601/extend/1301_2.svg | 16 + .../main/assets/omdb/4601/extend/1301_2_3.svg | 17 + .../assets/omdb/4601/extend/1301_2_3_4.svg | 18 + .../main/assets/omdb/4601/extend/1301_2_4.svg | 17 + .../main/assets/omdb/4601/extend/1301_2_5.svg | 17 + .../main/assets/omdb/4601/extend/1301_2_6.svg | 17 + .../main/assets/omdb/4601/extend/1301_3.svg | 16 + .../main/assets/omdb/4601/extend/1301_3_4.svg | 17 + .../main/assets/omdb/4601/extend/1301_3_5.svg | 17 + .../main/assets/omdb/4601/extend/1301_3_6.svg | 17 + .../main/assets/omdb/4601/extend/1301_4.svg | 15 + .../main/assets/omdb/4601/extend/1301_4_5.svg | 17 + .../main/assets/omdb/4601/extend/1301_4_6.svg | 17 + .../main/assets/omdb/4601/extend/1301_5.svg | 16 + .../main/assets/omdb/4601/extend/1301_5_6.svg | 17 + .../main/assets/omdb/4601/extend/1301_6.svg | 16 + .../main/assets/omdb/4601/extend/1301_7.svg | 17 + .../main/assets/omdb/4601/normal/1301_1.svg | 15 + .../main/assets/omdb/4601/normal/1301_1_2.svg | 16 + .../assets/omdb/4601/normal/1301_1_2_3.svg | 17 + .../assets/omdb/4601/normal/1301_1_2_3_4.svg | 21 + .../assets/omdb/4601/normal/1301_1_2_4.svg | 17 + .../assets/omdb/4601/normal/1301_1_2_5.svg | 17 + .../assets/omdb/4601/normal/1301_1_2_6.svg | 17 + .../main/assets/omdb/4601/normal/1301_1_3.svg | 16 + .../assets/omdb/4601/normal/1301_1_3_4.svg | 17 + .../assets/omdb/4601/normal/1301_1_3_5.svg | 17 + .../assets/omdb/4601/normal/1301_1_3_6.svg | 17 + .../main/assets/omdb/4601/normal/1301_1_4.svg | 16 + .../main/assets/omdb/4601/normal/1301_1_5.svg | 16 + .../main/assets/omdb/4601/normal/1301_1_6.svg | 16 + .../main/assets/omdb/4601/normal/1301_1_7.svg | 18 + .../main/assets/omdb/4601/normal/1301_2.svg | 16 + .../main/assets/omdb/4601/normal/1301_2_3.svg | 17 + .../assets/omdb/4601/normal/1301_2_3_4.svg | 18 + .../main/assets/omdb/4601/normal/1301_2_4.svg | 17 + .../main/assets/omdb/4601/normal/1301_2_5.svg | 17 + .../main/assets/omdb/4601/normal/1301_2_6.svg | 17 + .../main/assets/omdb/4601/normal/1301_3.svg | 16 + .../main/assets/omdb/4601/normal/1301_3_4.svg | 17 + .../main/assets/omdb/4601/normal/1301_3_5.svg | 17 + .../main/assets/omdb/4601/normal/1301_3_6.svg | 17 + .../main/assets/omdb/4601/normal/1301_4.svg | 15 + .../main/assets/omdb/4601/normal/1301_4_5.svg | 17 + .../main/assets/omdb/4601/normal/1301_4_6.svg | 17 + .../main/assets/omdb/4601/normal/1301_5.svg | 16 + .../main/assets/omdb/4601/normal/1301_5_6.svg | 17 + .../main/assets/omdb/4601/normal/1301_6.svg | 16 + .../main/assets/omdb/4601/normal/1301_7.svg | 17 + .../library/data/entity/ReferenceEntity.kt | 3 + .../library/data/entity/RenderEntity.kt | 3 + .../collect/library/map/NIMapView.java | 10 +- .../library/map/source/OMDBDataDecoder.java | 11 +- .../map/source/OMDBReferenceDataSource.java | 2 +- .../map/source/OMDBReferenceDecoder.java | 11 +- .../map/source/OMDBTileDataSource.java | 3 +- .../collect/library/system/Constant.java | 2 +- vtm | 2 +- 117 files changed, 2268 insertions(+), 276 deletions(-) create mode 100644 collect-library/src/main/assets/omdb/4601/bus/1301_0.svg create mode 100644 collect-library/src/main/assets/omdb/4601/bus/1301_1.svg create mode 100644 collect-library/src/main/assets/omdb/4601/bus/1301_1_2.svg create mode 100644 collect-library/src/main/assets/omdb/4601/bus/1301_1_2_3.svg create mode 100644 collect-library/src/main/assets/omdb/4601/bus/1301_1_2_3_4.svg create mode 100644 collect-library/src/main/assets/omdb/4601/bus/1301_1_2_4.svg create mode 100644 collect-library/src/main/assets/omdb/4601/bus/1301_1_2_5.svg create mode 100644 collect-library/src/main/assets/omdb/4601/bus/1301_1_2_6.svg create mode 100644 collect-library/src/main/assets/omdb/4601/bus/1301_1_3.svg create mode 100644 collect-library/src/main/assets/omdb/4601/bus/1301_1_3_4.svg create mode 100644 collect-library/src/main/assets/omdb/4601/bus/1301_1_3_5.svg create mode 100644 collect-library/src/main/assets/omdb/4601/bus/1301_1_3_6.svg create mode 100644 collect-library/src/main/assets/omdb/4601/bus/1301_1_4.svg create mode 100644 collect-library/src/main/assets/omdb/4601/bus/1301_1_5.svg create mode 100644 collect-library/src/main/assets/omdb/4601/bus/1301_1_6.svg create mode 100644 collect-library/src/main/assets/omdb/4601/bus/1301_1_7.svg create mode 100644 collect-library/src/main/assets/omdb/4601/bus/1301_2.svg create mode 100644 collect-library/src/main/assets/omdb/4601/bus/1301_2_3.svg create mode 100644 collect-library/src/main/assets/omdb/4601/bus/1301_2_3_4.svg create mode 100644 collect-library/src/main/assets/omdb/4601/bus/1301_2_4.svg create mode 100644 collect-library/src/main/assets/omdb/4601/bus/1301_2_5.svg create mode 100644 collect-library/src/main/assets/omdb/4601/bus/1301_2_6.svg create mode 100644 collect-library/src/main/assets/omdb/4601/bus/1301_3.svg create mode 100644 collect-library/src/main/assets/omdb/4601/bus/1301_3_4.svg create mode 100644 collect-library/src/main/assets/omdb/4601/bus/1301_3_5.svg create mode 100644 collect-library/src/main/assets/omdb/4601/bus/1301_3_6.svg create mode 100644 collect-library/src/main/assets/omdb/4601/bus/1301_4.svg create mode 100644 collect-library/src/main/assets/omdb/4601/bus/1301_4_5.svg create mode 100644 collect-library/src/main/assets/omdb/4601/bus/1301_4_6.svg create mode 100644 collect-library/src/main/assets/omdb/4601/bus/1301_5.svg create mode 100644 collect-library/src/main/assets/omdb/4601/bus/1301_5_6.svg create mode 100644 collect-library/src/main/assets/omdb/4601/bus/1301_6.svg create mode 100644 collect-library/src/main/assets/omdb/4601/bus/1301_7.svg create mode 100644 collect-library/src/main/assets/omdb/4601/extend/1301_0.svg create mode 100644 collect-library/src/main/assets/omdb/4601/extend/1301_1.svg create mode 100644 collect-library/src/main/assets/omdb/4601/extend/1301_1_2.svg create mode 100644 collect-library/src/main/assets/omdb/4601/extend/1301_1_2_3.svg create mode 100644 collect-library/src/main/assets/omdb/4601/extend/1301_1_2_3_4.svg create mode 100644 collect-library/src/main/assets/omdb/4601/extend/1301_1_2_4.svg create mode 100644 collect-library/src/main/assets/omdb/4601/extend/1301_1_2_5.svg create mode 100644 collect-library/src/main/assets/omdb/4601/extend/1301_1_2_6.svg create mode 100644 collect-library/src/main/assets/omdb/4601/extend/1301_1_3.svg create mode 100644 collect-library/src/main/assets/omdb/4601/extend/1301_1_3_4.svg create mode 100644 collect-library/src/main/assets/omdb/4601/extend/1301_1_3_5.svg create mode 100644 collect-library/src/main/assets/omdb/4601/extend/1301_1_3_6.svg create mode 100644 collect-library/src/main/assets/omdb/4601/extend/1301_1_4.svg create mode 100644 collect-library/src/main/assets/omdb/4601/extend/1301_1_5.svg create mode 100644 collect-library/src/main/assets/omdb/4601/extend/1301_1_6.svg create mode 100644 collect-library/src/main/assets/omdb/4601/extend/1301_1_7.svg create mode 100644 collect-library/src/main/assets/omdb/4601/extend/1301_2.svg create mode 100644 collect-library/src/main/assets/omdb/4601/extend/1301_2_3.svg create mode 100644 collect-library/src/main/assets/omdb/4601/extend/1301_2_3_4.svg create mode 100644 collect-library/src/main/assets/omdb/4601/extend/1301_2_4.svg create mode 100644 collect-library/src/main/assets/omdb/4601/extend/1301_2_5.svg create mode 100644 collect-library/src/main/assets/omdb/4601/extend/1301_2_6.svg create mode 100644 collect-library/src/main/assets/omdb/4601/extend/1301_3.svg create mode 100644 collect-library/src/main/assets/omdb/4601/extend/1301_3_4.svg create mode 100644 collect-library/src/main/assets/omdb/4601/extend/1301_3_5.svg create mode 100644 collect-library/src/main/assets/omdb/4601/extend/1301_3_6.svg create mode 100644 collect-library/src/main/assets/omdb/4601/extend/1301_4.svg create mode 100644 collect-library/src/main/assets/omdb/4601/extend/1301_4_5.svg create mode 100644 collect-library/src/main/assets/omdb/4601/extend/1301_4_6.svg create mode 100644 collect-library/src/main/assets/omdb/4601/extend/1301_5.svg create mode 100644 collect-library/src/main/assets/omdb/4601/extend/1301_5_6.svg create mode 100644 collect-library/src/main/assets/omdb/4601/extend/1301_6.svg create mode 100644 collect-library/src/main/assets/omdb/4601/extend/1301_7.svg create mode 100644 collect-library/src/main/assets/omdb/4601/normal/1301_1.svg create mode 100644 collect-library/src/main/assets/omdb/4601/normal/1301_1_2.svg create mode 100644 collect-library/src/main/assets/omdb/4601/normal/1301_1_2_3.svg create mode 100644 collect-library/src/main/assets/omdb/4601/normal/1301_1_2_3_4.svg create mode 100644 collect-library/src/main/assets/omdb/4601/normal/1301_1_2_4.svg create mode 100644 collect-library/src/main/assets/omdb/4601/normal/1301_1_2_5.svg create mode 100644 collect-library/src/main/assets/omdb/4601/normal/1301_1_2_6.svg create mode 100644 collect-library/src/main/assets/omdb/4601/normal/1301_1_3.svg create mode 100644 collect-library/src/main/assets/omdb/4601/normal/1301_1_3_4.svg create mode 100644 collect-library/src/main/assets/omdb/4601/normal/1301_1_3_5.svg create mode 100644 collect-library/src/main/assets/omdb/4601/normal/1301_1_3_6.svg create mode 100644 collect-library/src/main/assets/omdb/4601/normal/1301_1_4.svg create mode 100644 collect-library/src/main/assets/omdb/4601/normal/1301_1_5.svg create mode 100644 collect-library/src/main/assets/omdb/4601/normal/1301_1_6.svg create mode 100644 collect-library/src/main/assets/omdb/4601/normal/1301_1_7.svg create mode 100644 collect-library/src/main/assets/omdb/4601/normal/1301_2.svg create mode 100644 collect-library/src/main/assets/omdb/4601/normal/1301_2_3.svg create mode 100644 collect-library/src/main/assets/omdb/4601/normal/1301_2_3_4.svg create mode 100644 collect-library/src/main/assets/omdb/4601/normal/1301_2_4.svg create mode 100644 collect-library/src/main/assets/omdb/4601/normal/1301_2_5.svg create mode 100644 collect-library/src/main/assets/omdb/4601/normal/1301_2_6.svg create mode 100644 collect-library/src/main/assets/omdb/4601/normal/1301_3.svg create mode 100644 collect-library/src/main/assets/omdb/4601/normal/1301_3_4.svg create mode 100644 collect-library/src/main/assets/omdb/4601/normal/1301_3_5.svg create mode 100644 collect-library/src/main/assets/omdb/4601/normal/1301_3_6.svg create mode 100644 collect-library/src/main/assets/omdb/4601/normal/1301_4.svg create mode 100644 collect-library/src/main/assets/omdb/4601/normal/1301_4_5.svg create mode 100644 collect-library/src/main/assets/omdb/4601/normal/1301_4_6.svg create mode 100644 collect-library/src/main/assets/omdb/4601/normal/1301_5.svg create mode 100644 collect-library/src/main/assets/omdb/4601/normal/1301_5_6.svg create mode 100644 collect-library/src/main/assets/omdb/4601/normal/1301_6.svg create mode 100644 collect-library/src/main/assets/omdb/4601/normal/1301_7.svg diff --git a/app/src/main/assets/omdb_config.json b/app/src/main/assets/omdb_config.json index 1cf75acf..0cf2e923 100644 --- a/app/src/main/assets/omdb_config.json +++ b/app/src/main/assets/omdb_config.json @@ -3,32 +3,44 @@ "1012": { "table": "OMDB_CHECKPOINT", "code": 1012, - "name": "检查点" + "name": "检查点", + "zoomMin": 18, + "zoomMax": 23 }, "2001": { "table": "OMDB_RD_LINK", "code": 2001, - "name": "道路线" + "name": "道路线", + "zoomMin": 18, + "zoomMax": 19 }, "2002": { "table": "OMDB_RD_LINK_FUNCTION_CLASS", "code": 2002, - "name": "道路功能等级" + "name": "道路功能等级", + "zoomMin": 18, + "zoomMax": 19 }, "2008": { "table": "OMDB_RD_LINK_KIND", "code": 2008, - "name": "道路种别" + "name": "道路种别", + "zoomMin": 18, + "zoomMax": 19 }, "2010": { "table": "OMDB_LINK_DIRECT", "code": 2010, - "name": "道路方向" + "name": "道路方向", + "zoomMin": 18, + "zoomMax": 19 }, "2011": { "table": "OMDB_LINK_NAME", "code": 2011, "name": "道路名", + "zoomMin": 18, + "zoomMax": 19, "transformer": [ { "k": "geometry", @@ -42,6 +54,8 @@ "table": "OMDB_LANE_MARK_BOUNDARYTYPE", "code": 2013, "name": "车道边界类型", + "zoomMin": 20, + "zoomMax": 23, "transformer": [ { "k": "geometry", @@ -54,17 +68,23 @@ "2019": { "table": "OMDB_LINK_SPEEDLIMIT", "code": 2019, - "name": "常规线限速" + "name": "常规线限速", + "zoomMin": 18, + "zoomMax": 19 }, "2020": { "table": "OMDB_LINK_SPEEDLIMIT_COND", "code": 2020, - "name": "条件线限速" + "name": "条件线限速", + "zoomMin": 18, + "zoomMax": 19 }, "2021": { "table": "OMDB_LINK_SPEEDLIMIT_VAR", "code": 2021, - "name": "可变线限速" + "name": "可变线限速", + "zoomMin": 18, + "zoomMax": 19 }, "2022": { "table": "OMDB_CON_ACCESS", @@ -89,7 +109,9 @@ "2083":{ "table": "OMDB_RDBOUND_BOUNDARYTYPE", "code": 2083, - "name": "道路边界类型" + "name": "道路边界类型", + "zoomMin": 20, + "zoomMax": 23 }, "2201":{ "table": "OMDB_BRIDGE", @@ -100,6 +122,8 @@ "table": "OMDB_TUNNEL", "code": 2202, "name": "隧道", + "zoomMin": 18, + "zoomMax": 23, "transformer": [ { "k": "geometry", @@ -113,6 +137,8 @@ "table": "OMDB_INTERSECTION", "code": 4001, "name": "路口", + "zoomMin": 18, + "zoomMax": 19, "transformer": [ { "k": "geometry", @@ -126,6 +152,8 @@ "table": "OMDB_SPEEDLIMIT", "code": 4002, "name": "常规点限速", + "zoomMin": 18, + "zoomMax": 23, "transformer": [ { "k": "maxSpeed", @@ -145,6 +173,8 @@ "table": "OMDB_SPEEDLIMIT_COND", "code": 4003, "name": "条件点限速", + "zoomMin": 18, + "zoomMax": 23, "transformer": [ { "k": "maxSpeed", @@ -158,6 +188,8 @@ "table": "OMDB_SPEEDLIMIT_VAR", "code": 4004, "name": "可变点限速", + "zoomMin": 18, + "zoomMax": 23, "transformer": [ { "k": "location", @@ -183,6 +215,8 @@ "table": "OMDB_RESTRICTION", "code": 4006, "name": "普通交限", + "zoomMin": 18, + "zoomMax": 23, "transformer": [ { "k": "geometry", @@ -220,6 +254,8 @@ "table": "OMDB_ELECTRONICEYE", "code": 4010, "name": "电子眼", + "zoomMin": 18, + "zoomMax": 23, "transformer": [ { "k": "geometry", @@ -251,6 +287,8 @@ "table": "OMDB_TRAFFICLIGHT", "code": 4022, "name": "交通灯", + "zoomMin": 18, + "zoomMax": 23, "transformer": [ ] }, @@ -258,24 +296,26 @@ "table": "OMDB_LANEINFO", "code": 4601, "name": "车信", + "zoomMin": 18, + "zoomMax": 19, "transformer": [ { "k": "geometry", "v": "~", "klib": "geometry", - "vlib": "translateBack()" + "vlib": "translateRight(direct=3)" }, { "k": "geometry", "v": "~", "klib": "geometry", - "vlib": "translateRight()" + "vlib": "unpackingLaneInfo()" }, { "k": "geometry", "v": "~", "klib": "geometry", - "vlib": "generateDirectReferenceLine()" + "vlib": "generateS2EReferenceLine()" } ] }, @@ -283,6 +323,8 @@ "table": "OMDB_LANE_LINK_LG", "code": 5001, "name": "车道中心线", + "zoomMin": 20, + "zoomMax": 23, "transformer": [ { "k": "geometry", diff --git a/app/src/main/java/com/navinfo/omqs/Constant.kt b/app/src/main/java/com/navinfo/omqs/Constant.kt index 5db3b683..30e53f7a 100644 --- a/app/src/main/java/com/navinfo/omqs/Constant.kt +++ b/app/src/main/java/com/navinfo/omqs/Constant.kt @@ -64,6 +64,11 @@ class Constant { const val DEBUG = true + /** + * 地图最多缩放级别23 + */ + const val MAX_ZOOM = 23 + /** * 是否自动定位 */ diff --git a/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt b/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt index 5c6683b2..4cbbb603 100644 --- a/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt +++ b/app/src/main/java/com/navinfo/omqs/bean/ImportConfig.kt @@ -115,6 +115,8 @@ class ImportConfig { class TableInfo { val table: String = "" val code: Int = 0 + val zoomMin: Int = 18 + val zoomMax: Int = 23 val name: String = "" var checked : Boolean = true var transformer: MutableList = mutableListOf() diff --git a/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt b/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt index 64ac2675..2cd3cb7f 100644 --- a/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt +++ b/app/src/main/java/com/navinfo/omqs/db/ImportOMDBHelper.kt @@ -5,10 +5,6 @@ import android.database.Cursor.* import android.os.Build import android.util.Log import androidx.annotation.RequiresApi -import androidx.core.database.getBlobOrNull -import androidx.core.database.getFloatOrNull -import androidx.core.database.getIntOrNull -import androidx.core.database.getStringOrNull import com.blankj.utilcode.util.FileIOUtils import com.blankj.utilcode.util.ZipUtils import com.google.gson.Gson @@ -16,8 +12,6 @@ import com.google.gson.reflect.TypeToken import com.navinfo.collect.library.data.entity.RenderEntity import com.navinfo.omqs.Constant import com.navinfo.omqs.bean.ImportConfig -import com.navinfo.omqs.bean.Transform -import com.navinfo.omqs.hilt.ImportOMDBHiltFactory import com.navinfo.omqs.hilt.OMDBDataBaseHiltFactory import dagger.assisted.Assisted import dagger.assisted.AssistedInject @@ -127,7 +121,7 @@ class ImportOMDBHelper @AssistedInject constructor( * @param omdbZipFile omdb数据抽取生成的Zip文件 * @param configFile 对应的配置文件 * */ - suspend fun importOmdbZipFile(omdbZipFile: File): Flow = withContext(Dispatchers.IO) { + suspend fun importOmdbZipFile(omdbZipFile: File, taskId: Int): Flow = withContext(Dispatchers.IO) { val unZipFolder = File(omdbZipFile.parentFile, "result") flow { if (unZipFolder.exists()) { @@ -159,6 +153,8 @@ class ImportOMDBHelper @AssistedInject constructor( map["qi_table"] = currentConfig.table map["qi_name"] = currentConfig.name map["qi_code"] = if (currentConfig.code == 0) currentConfig.code else currentEntry.key + map["qi_zoomMin"] = currentConfig.zoomMin + map["qi_zoomMax"] = currentConfig.zoomMax // 先查询这个mesh下有没有数据,如果有则跳过即可 // val meshEntity = Realm.getDefaultInstance().where(RenderEntity::class.java).equalTo("properties['mesh']", map["mesh"].toString()).findFirst() @@ -166,6 +162,10 @@ class ImportOMDBHelper @AssistedInject constructor( renderEntity.code = map["qi_code"].toString().toInt() renderEntity.name = map["qi_name"].toString() renderEntity.table = map["qi_table"].toString() + renderEntity.taskId = taskId + renderEntity.zoomMin = map["qi_zoomMin"].toString().toInt() + renderEntity.zoomMax = map["qi_zoomMax"].toString().toInt() + // 其他数据插入到Properties中 renderEntity.geometry = map["geometry"].toString() for ((key, value) in map) { diff --git a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt index d75f3e4a..cd06a105 100644 --- a/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt +++ b/app/src/main/java/com/navinfo/omqs/db/ImportPreProcess.kt @@ -16,6 +16,7 @@ import org.oscim.core.GeoPoint class ImportPreProcess { val code2NameMap = Code2NameMap() lateinit var cacheRdLink: Map + val defaultTranslateDistance = 3.0 fun checkCircleRoad(renderEntity: RenderEntity): Boolean { val linkInId = renderEntity.properties["linkIn"] @@ -50,9 +51,9 @@ class ImportPreProcess { } if (Geometry.TYPENAME_POINT == geometry?.geometryType) { // angle为与正北方向的顺时针夹角 var angle = if(renderEntity?.properties?.get("angle") == null) 0.0 else renderEntity?.properties?.get("angle")?.toDouble()!! - if (isReverse) { - angle += 180 - } +// if (isReverse) { +// angle += 180 +// } // angle角度为与正北方向的顺时针夹角,将其转换为与X轴正方向的逆时针夹角,即为正东方向的夹角 angle=(450-angle)%360 radian = Math.toRadians(angle) @@ -65,20 +66,26 @@ class ImportPreProcess { val p2: Coordinate = coordinates.get(coordinates.size - 1) // 计算线段的方向 radian = Angle.angle(p1, p2) - point = p2 + point = p1 } // 计算偏移距离 - val dx: Double = GeometryTools.convertDistanceToDegree(3.0, geometry?.coordinate?.y!!) * Math.cos(radian) - val dy: Double = GeometryTools.convertDistanceToDegree(3.0, geometry?.coordinate?.y!!) * Math.sin(radian) + val dx: Double = GeometryTools.convertDistanceToDegree(defaultTranslateDistance, geometry?.coordinate?.y!!) * Math.cos(radian) + val dy: Double = GeometryTools.convertDistanceToDegree(defaultTranslateDistance, geometry?.coordinate?.y!!) * Math.sin(radian) // 计算偏移后的点 val coord = Coordinate(point.getX() + dy, point.getY() - dx) - // 将这个点记录在数据中 - val geometryTranslate: Geometry = GeometryTools.createGeometry(doubleArrayOf(coord.x, coord.y)) - renderEntity.geometry = geometryTranslate.toString() + // 记录偏移后的点位或线数据,如果数据为线时,记录的偏移后数据为倒数第二个点右移后,方向与线的最后两个点平行同向的单位向量 + if (Geometry.TYPENAME_POINT == geometry?.geometryType) { + val geometryTranslate: Geometry = GeometryTools.createGeometry(doubleArrayOf(coord.x, coord.y)) + renderEntity.geometry = geometryTranslate.toString() + } else { + val coorEnd = Coordinate(coord.x+dx, coord.y+dy) + val geometryTranslate: Geometry = GeometryTools.createLineString(arrayOf(coord, coorEnd)) + renderEntity.geometry = geometryTranslate.toString() + } } /** @@ -145,6 +152,10 @@ class ImportPreProcess { startEndReference.renderEntityId = renderEntity.id startEndReference.name = "${renderEntity.name}参考线" startEndReference.table = renderEntity.table + startEndReference.zoomMin = renderEntity.zoomMin + startEndReference.zoomMax = renderEntity.zoomMax + startEndReference.taskId = renderEntity.taskId + // 起终点坐标组成的线 startEndReference.geometry = GeometryTools.createLineString(arrayOf(pointStart, pointEnd)).toString() startEndReference.properties["qi_table"] = renderEntity.table @@ -163,6 +174,10 @@ class ImportPreProcess { startReference.renderEntityId = renderEntity.id startReference.name = "${renderEntity.name}参考线" startReference.table = renderEntity.table + startReference.zoomMin = renderEntity.zoomMin + startReference.zoomMax = renderEntity.zoomMax + startReference.taskId = renderEntity.taskId + // 起点坐标 startReference.geometry = GeometryTools.createGeometry(GeoPoint(pointStart.y,pointStart.x)).toString() startReference.properties["qi_table"] = renderEntity.table @@ -173,6 +188,10 @@ class ImportPreProcess { endReference.renderEntityId = renderEntity.id endReference.name = "${renderEntity.name}参考线" endReference.table = renderEntity.table + endReference.zoomMin = renderEntity.zoomMin + endReference.zoomMax = renderEntity.zoomMax + endReference.taskId = renderEntity.taskId + // 终点坐标 endReference.geometry = GeometryTools.createGeometry(GeoPoint(pointEnd.y,pointEnd.x)).toString() endReference.properties["qi_table"] = renderEntity.table @@ -226,6 +245,9 @@ class ImportPreProcess { angleReference.renderEntityId = renderEntity.id angleReference.name = "${renderEntity.name}参考方向" angleReference.table = renderEntity.table + angleReference.zoomMin = renderEntity.zoomMin + angleReference.zoomMax = renderEntity.zoomMax + angleReference.taskId = renderEntity.taskId // 与原有方向指向平行的线 angleReference.geometry = GeometryTools.createLineString(arrayOf(point, coorEnd)).toString() angleReference.properties["qi_table"] = renderEntity.table @@ -282,7 +304,40 @@ class ImportPreProcess { } } + /** + * 解析车信数据二级属性 + * */ + fun unpackingLaneInfo(renderEntity: RenderEntity) { + if (renderEntity.code == 4601) { + if (!renderEntity.properties["laneinfoGroup"].isNullOrEmpty()&&renderEntity.properties["laneinfoGroup"]!="null") { + // 解析laneinfoGroup,将数组中的属性放会properties + val laneinfoGroup = JSONArray(renderEntity.properties["laneinfoGroup"].toString().replace("{", "[").replace("}", "]")) + // 分别获取两个数组中的数据,取第一个作为主数据,另外两个作为辅助渲染数据 + val laneInfoDirectArray = JSONArray(laneinfoGroup[0].toString()) + val laneInfoTypeArray = JSONArray(laneinfoGroup[1].toString()) + for (i in 0 until laneInfoDirectArray.length()) { + // 根据后续的数据生成辅助表数据 + val referenceEntity = ReferenceEntity() + referenceEntity.renderEntityId = renderEntity.id + referenceEntity.name = "${renderEntity.name}参考方向" + referenceEntity.table = renderEntity.table + referenceEntity.zoomMin = renderEntity.zoomMin + referenceEntity.zoomMax = renderEntity.zoomMax + referenceEntity.taskId = renderEntity.taskId + + // 与原数据使用相同的geometry + referenceEntity.geometry = renderEntity.geometry.toString() + referenceEntity.properties["qi_table"] = renderEntity.table + referenceEntity.properties["currentDirect"] = laneInfoDirectArray[i].toString().split(",").distinct().joinToString("_") + referenceEntity.properties["currentType"] = laneInfoTypeArray[i].toString().split(",").distinct().joinToString("_") + referenceEntity.properties["symbol"] = "assets:omdb/4601/bus/1301_"+referenceEntity.properties["currentDirect"]+".svg" + Log.d("unpackingLaneInfo", referenceEntity.properties["symbol"].toString()) + Realm.getDefaultInstance().insert(referenceEntity) + } + } + } + } /** * 生成默认道路名数据 @@ -339,6 +394,9 @@ class ImportPreProcess { angleReference.geometry = renderEntity.geometry angleReference.properties["qi_table"] = renderEntity.table angleReference.properties["width"] = "3" + angleReference.zoomMin = renderEntity.zoomMin + angleReference.zoomMax = renderEntity.zoomMax + angleReference.taskId = renderEntity.taskId Realm.getDefaultInstance().insert(angleReference) } @@ -356,6 +414,9 @@ class ImportPreProcess { intersectionReference.renderEntityId = renderEntity.id intersectionReference.name = "${renderEntity.name}参考点" intersectionReference.table = renderEntity.table + intersectionReference.zoomMin = renderEntity.zoomMin + intersectionReference.zoomMax = renderEntity.zoomMax + intersectionReference.taskId = renderEntity.taskId // 与原有方向指向平行的线 intersectionReference.geometry = GeometryTools.createGeometry(nodeJSONObject["geometry"].toString()).toString() intersectionReference.properties["qi_table"] = renderEntity.table diff --git a/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadScope.kt b/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadScope.kt index 53e1d6da..a405fcc8 100644 --- a/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadScope.kt +++ b/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadScope.kt @@ -71,7 +71,7 @@ class TaskDownloadScope( downloadJob = launch() { FileManager.checkOMDBFileInfo(taskBean) if (taskBean.status == FileDownloadStatus.IMPORT) { - importData() + importData(taskId = taskBean.id) } else { download() } @@ -119,7 +119,7 @@ class TaskDownloadScope( /** * 导入数据 */ - private suspend fun importData(file: File? = null) { + private suspend fun importData(file: File? = null, taskId: Int?=0) { try { Log.e("jingo", "importData SSS") change(FileDownloadStatus.IMPORTING) @@ -130,15 +130,17 @@ class TaskDownloadScope( downloadManager.context, fileNew ) - importOMDBHelper.importOmdbZipFile(importOMDBHelper.omdbFile).collect { - Log.e("jingo", "数据安装 $it") - if (it == "finish") { - change(FileDownloadStatus.DONE) - withContext(Dispatchers.Main) { - downloadManager.mapController.mMapView.updateMap(true) + if (taskId != null) { + importOMDBHelper.importOmdbZipFile(importOMDBHelper.omdbFile,taskId).collect { + Log.e("jingo", "数据安装 $it") + if (it == "finish") { + change(FileDownloadStatus.DONE) + withContext(Dispatchers.Main) { + downloadManager.mapController.mMapView.updateMap(true) + } + } else { + change(FileDownloadStatus.IMPORTING, it) } - } else { - change(FileDownloadStatus.IMPORTING, it) } } } catch (e: Exception) { @@ -177,7 +179,7 @@ class TaskDownloadScope( startPosition = 0 } if (fileTemp.length() > 0 && taskBean.fileSize > 0 && fileTemp.length() == taskBean.fileSize) { - importData(fileTemp) + importData(fileTemp,taskBean.id) return } @@ -218,7 +220,7 @@ class TaskDownloadScope( randomAccessFile?.close() inputStream = null randomAccessFile = null - importData() + importData(taskId = taskBean.id) } else { change(FileDownloadStatus.PAUSE) } 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 80e6f008..5d08ab26 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 @@ -20,6 +20,7 @@ import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import com.google.android.material.dialog.MaterialAlertDialogBuilder import com.navinfo.collect.library.map.NIMapController +import com.navinfo.collect.library.map.NIMapOptions import com.navinfo.omqs.Constant import com.navinfo.omqs.R import com.navinfo.omqs.bean.ImportConfig @@ -167,7 +168,7 @@ class MainActivity : BaseActivity() { viewModel.speakMode = SpeakMode(this) // 在mapController初始化前获取当前OMDB图层显隐 viewModel.refreshOMDBLayer(LayerConfigUtils.getLayerConfigList()) - mapController.mMapView.vtmMap.viewport().maxZoomLevel = 25 + mapController.mMapView.vtmMap.viewport().maxZoomLevel = Constant.MAX_ZOOM //关联生命周期 binding.lifecycleOwner = this //给xml转递对象 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 afedf335..692866c6 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 @@ -123,10 +123,10 @@ class PersonalCenterFragment(private var indoorDataListener: ((Boolean) -> Unit? } R.id.personal_center_menu_test -> { viewModel.readRealmData() - //108.90107116103331 34.29568928574205 + //116.25017070328308 40.061730653134696 // 定位到指定位置 niMapController.mMapView.vtmMap.animator() - .animateTo(GeoPoint( 34.29568928574205, 108.90107116103331)) + .animateTo(GeoPoint( 40.061730653134696, 116.25017070328308)) } // R.id.personal_center_menu_task_list -> { // findNavController().navigate(R.id.TaskManagerFragment) diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterViewModel.kt index aebf7569..04093b8f 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/personalcenter/PersonalCenterViewModel.kt @@ -1,8 +1,9 @@ package com.navinfo.omqs.ui.fragment.personalcenter import android.net.Uri +import android.os.Build import android.util.Log -import androidx.appcompat.app.AppCompatActivity +import androidx.annotation.RequiresApi import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope @@ -16,17 +17,13 @@ import com.navinfo.omqs.bean.ScRootCauseAnalysisBean import com.navinfo.omqs.db.ImportOMDBHelper import com.navinfo.omqs.db.RealmOperateHelper import com.navinfo.omqs.db.RoomAppDatabase -import com.navinfo.omqs.tools.MetadataUtils import com.navinfo.omqs.tools.MetadataUtils.Companion.ScProblemTypeTitle import com.navinfo.omqs.tools.MetadataUtils.Companion.ScRootCauseAnalysisTitle import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch -import kotlinx.coroutines.withContext import org.apache.commons.io.input.BOMInputStream import java.io.* -import java.nio.charset.Charset -import java.text.Normalizer import java.util.* import javax.inject.Inject @@ -43,6 +40,7 @@ class PersonalCenterViewModel @Inject constructor( /** * 导入OMDB数据 * */ + @RequiresApi(Build.VERSION_CODES.N) suspend fun obtainOMDBZipData(importOMDBHelper: ImportOMDBHelper) { Log.d("OMQSApplication", "开始生成数据") // Realm.getDefaultInstance().beginTransaction() @@ -164,11 +162,13 @@ class PersonalCenterViewModel @Inject constructor( /** * 导入OMDB数据 * */ - fun importOMDBData(importOMDBHelper: ImportOMDBHelper) { + fun importOMDBData(importOMDBHelper: ImportOMDBHelper,taskId:Int?=0) { viewModelScope.launch(Dispatchers.IO) { Log.d("OMQSApplication", "开始导入数据") - importOMDBHelper.importOmdbZipFile(importOMDBHelper.omdbFile).collect { - Log.d("importOMDBData", it) + if (taskId != null) { + importOMDBHelper.importOmdbZipFile(importOMDBHelper.omdbFile, taskId).collect { + Log.d("importOMDBData", it) + } } Log.d("OMQSApplication", "导入数据完成") } diff --git a/collect-library/src/main/assets/editormarker.xml b/collect-library/src/main/assets/editormarker.xml index 04a8b27d..9fb51e19 100644 --- a/collect-library/src/main/assets/editormarker.xml +++ b/collect-library/src/main/assets/editormarker.xml @@ -1479,133 +1479,19 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + @@ -1644,130 +1530,75 @@ - + - - - - - + - - - - - + - + - - - - - + - - - - + + + 0 + - - + + - + - + - - + + @@ -1797,22 +1628,22 @@ - + - + - + - + - + @@ -1824,12 +1655,12 @@ - + - + @@ -1847,22 +1678,22 @@ - - + - + + - + @@ -1878,11 +1709,7 @@ - - - - - + @@ -1893,8 +1720,9 @@ + - + @@ -1902,13 +1730,412 @@ + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/bus/1301_0.svg b/collect-library/src/main/assets/omdb/4601/bus/1301_0.svg new file mode 100644 index 00000000..11c4ad4a --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/bus/1301_0.svg @@ -0,0 +1,16 @@ + + + + 1301_1_o + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/bus/1301_1.svg b/collect-library/src/main/assets/omdb/4601/bus/1301_1.svg new file mode 100644 index 00000000..7fad797e --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/bus/1301_1.svg @@ -0,0 +1,15 @@ + + + + 1301_1_a + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/bus/1301_1_2.svg b/collect-library/src/main/assets/omdb/4601/bus/1301_1_2.svg new file mode 100644 index 00000000..ef978302 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/bus/1301_1_2.svg @@ -0,0 +1,16 @@ + + + + 1301_1_g + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/bus/1301_1_2_3.svg b/collect-library/src/main/assets/omdb/4601/bus/1301_1_2_3.svg new file mode 100644 index 00000000..7a4eaa39 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/bus/1301_1_2_3.svg @@ -0,0 +1,17 @@ + + + + 1301_1_h + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/bus/1301_1_2_3_4.svg b/collect-library/src/main/assets/omdb/4601/bus/1301_1_2_3_4.svg new file mode 100644 index 00000000..b083effc --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/bus/1301_1_2_3_4.svg @@ -0,0 +1,21 @@ + + + + 1 + Created with Sketch. + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/bus/1301_1_2_4.svg b/collect-library/src/main/assets/omdb/4601/bus/1301_1_2_4.svg new file mode 100644 index 00000000..f1783eb2 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/bus/1301_1_2_4.svg @@ -0,0 +1,17 @@ + + + + 1301_1_j + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/bus/1301_1_2_5.svg b/collect-library/src/main/assets/omdb/4601/bus/1301_1_2_5.svg new file mode 100644 index 00000000..41817043 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/bus/1301_1_2_5.svg @@ -0,0 +1,17 @@ + + + + 编组 13 + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/bus/1301_1_2_6.svg b/collect-library/src/main/assets/omdb/4601/bus/1301_1_2_6.svg new file mode 100644 index 00000000..1ae6c322 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/bus/1301_1_2_6.svg @@ -0,0 +1,17 @@ + + + + 1301_1_3 + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/bus/1301_1_3.svg b/collect-library/src/main/assets/omdb/4601/bus/1301_1_3.svg new file mode 100644 index 00000000..dbb3b0a8 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/bus/1301_1_3.svg @@ -0,0 +1,16 @@ + + + + 1301_1_f + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/bus/1301_1_3_4.svg b/collect-library/src/main/assets/omdb/4601/bus/1301_1_3_4.svg new file mode 100644 index 00000000..95890b21 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/bus/1301_1_3_4.svg @@ -0,0 +1,17 @@ + + + + 1301_1_i + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/bus/1301_1_3_5.svg b/collect-library/src/main/assets/omdb/4601/bus/1301_1_3_5.svg new file mode 100644 index 00000000..a5f97b40 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/bus/1301_1_3_5.svg @@ -0,0 +1,17 @@ + + + + 1301_1_4 + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/bus/1301_1_3_6.svg b/collect-library/src/main/assets/omdb/4601/bus/1301_1_3_6.svg new file mode 100644 index 00000000..7746a04e --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/bus/1301_1_3_6.svg @@ -0,0 +1,17 @@ + + + + 1301_1_5 + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/bus/1301_1_4.svg b/collect-library/src/main/assets/omdb/4601/bus/1301_1_4.svg new file mode 100644 index 00000000..e102cc2e --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/bus/1301_1_4.svg @@ -0,0 +1,16 @@ + + + + 1301_1_e + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/bus/1301_1_5.svg b/collect-library/src/main/assets/omdb/4601/bus/1301_1_5.svg new file mode 100644 index 00000000..2ea27c43 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/bus/1301_1_5.svg @@ -0,0 +1,16 @@ + + + + 1301_1_t + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/bus/1301_1_6.svg b/collect-library/src/main/assets/omdb/4601/bus/1301_1_6.svg new file mode 100644 index 00000000..79506a9e --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/bus/1301_1_6.svg @@ -0,0 +1,16 @@ + + + + 1301_1_x + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/bus/1301_1_7.svg b/collect-library/src/main/assets/omdb/4601/bus/1301_1_7.svg new file mode 100644 index 00000000..a168c5fe --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/bus/1301_1_7.svg @@ -0,0 +1,18 @@ + + + + 提示前方可自行或右后方掉头 + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/bus/1301_2.svg b/collect-library/src/main/assets/omdb/4601/bus/1301_2.svg new file mode 100644 index 00000000..ec913bb4 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/bus/1301_2.svg @@ -0,0 +1,16 @@ + + + + 1301_1_b + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/bus/1301_2_3.svg b/collect-library/src/main/assets/omdb/4601/bus/1301_2_3.svg new file mode 100644 index 00000000..2239d079 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/bus/1301_2_3.svg @@ -0,0 +1,17 @@ + + + + 1301_1_k + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/bus/1301_2_3_4.svg b/collect-library/src/main/assets/omdb/4601/bus/1301_2_3_4.svg new file mode 100644 index 00000000..20da2578 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/bus/1301_2_3_4.svg @@ -0,0 +1,18 @@ + + + + 1301_1_m + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/bus/1301_2_4.svg b/collect-library/src/main/assets/omdb/4601/bus/1301_2_4.svg new file mode 100644 index 00000000..1eba8f6b --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/bus/1301_2_4.svg @@ -0,0 +1,17 @@ + + + + 1301_1_l + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/bus/1301_2_5.svg b/collect-library/src/main/assets/omdb/4601/bus/1301_2_5.svg new file mode 100644 index 00000000..d5171f4b --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/bus/1301_2_5.svg @@ -0,0 +1,17 @@ + + + + 1301_1_u + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/bus/1301_2_6.svg b/collect-library/src/main/assets/omdb/4601/bus/1301_2_6.svg new file mode 100644 index 00000000..51a11221 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/bus/1301_2_6.svg @@ -0,0 +1,17 @@ + + + + 1301_1_y + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/bus/1301_3.svg b/collect-library/src/main/assets/omdb/4601/bus/1301_3.svg new file mode 100644 index 00000000..d2da475a --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/bus/1301_3.svg @@ -0,0 +1,16 @@ + + + + 1301_1_c + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/bus/1301_3_4.svg b/collect-library/src/main/assets/omdb/4601/bus/1301_3_4.svg new file mode 100644 index 00000000..c2ccda33 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/bus/1301_3_4.svg @@ -0,0 +1,17 @@ + + + + 1301_1_n + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/bus/1301_3_5.svg b/collect-library/src/main/assets/omdb/4601/bus/1301_3_5.svg new file mode 100644 index 00000000..54be427f --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/bus/1301_3_5.svg @@ -0,0 +1,17 @@ + + + + 1301_1_v + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/bus/1301_3_6.svg b/collect-library/src/main/assets/omdb/4601/bus/1301_3_6.svg new file mode 100644 index 00000000..cff1424a --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/bus/1301_3_6.svg @@ -0,0 +1,17 @@ + + + + 1301_1_z + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/bus/1301_4.svg b/collect-library/src/main/assets/omdb/4601/bus/1301_4.svg new file mode 100644 index 00000000..ec270561 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/bus/1301_4.svg @@ -0,0 +1,15 @@ + + + + 1301_1_d + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/bus/1301_4_5.svg b/collect-library/src/main/assets/omdb/4601/bus/1301_4_5.svg new file mode 100644 index 00000000..8d88db55 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/bus/1301_4_5.svg @@ -0,0 +1,17 @@ + + + + 1301_1_w + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/bus/1301_4_6.svg b/collect-library/src/main/assets/omdb/4601/bus/1301_4_6.svg new file mode 100644 index 00000000..3dda5a65 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/bus/1301_4_6.svg @@ -0,0 +1,17 @@ + + + + 1301_1_0 + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/bus/1301_5.svg b/collect-library/src/main/assets/omdb/4601/bus/1301_5.svg new file mode 100644 index 00000000..c3bdba5f --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/bus/1301_5.svg @@ -0,0 +1,16 @@ + + + + 1301_1_r + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/bus/1301_5_6.svg b/collect-library/src/main/assets/omdb/4601/bus/1301_5_6.svg new file mode 100644 index 00000000..e230cdf6 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/bus/1301_5_6.svg @@ -0,0 +1,17 @@ + + + + 1301_1_1 + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/bus/1301_6.svg b/collect-library/src/main/assets/omdb/4601/bus/1301_6.svg new file mode 100644 index 00000000..0452c08c --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/bus/1301_6.svg @@ -0,0 +1,16 @@ + + + + 1301_1_s + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/bus/1301_7.svg b/collect-library/src/main/assets/omdb/4601/bus/1301_7.svg new file mode 100644 index 00000000..6c966615 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/bus/1301_7.svg @@ -0,0 +1,17 @@ + + + + 提示右后方掉头 + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/extend/1301_0.svg b/collect-library/src/main/assets/omdb/4601/extend/1301_0.svg new file mode 100644 index 00000000..31181865 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/extend/1301_0.svg @@ -0,0 +1,16 @@ + + + + 1301_2_o + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/extend/1301_1.svg b/collect-library/src/main/assets/omdb/4601/extend/1301_1.svg new file mode 100644 index 00000000..2432424e --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/extend/1301_1.svg @@ -0,0 +1,15 @@ + + + + 1301_2_a + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/extend/1301_1_2.svg b/collect-library/src/main/assets/omdb/4601/extend/1301_1_2.svg new file mode 100644 index 00000000..54900d75 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/extend/1301_1_2.svg @@ -0,0 +1,16 @@ + + + + 1301_2_g + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/extend/1301_1_2_3.svg b/collect-library/src/main/assets/omdb/4601/extend/1301_1_2_3.svg new file mode 100644 index 00000000..824e6503 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/extend/1301_1_2_3.svg @@ -0,0 +1,17 @@ + + + + 1301_2_h + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/extend/1301_1_2_3_4.svg b/collect-library/src/main/assets/omdb/4601/extend/1301_1_2_3_4.svg new file mode 100644 index 00000000..9aae9284 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/extend/1301_1_2_3_4.svg @@ -0,0 +1,21 @@ + + + + 2 + Created with Sketch. + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/extend/1301_1_2_4.svg b/collect-library/src/main/assets/omdb/4601/extend/1301_1_2_4.svg new file mode 100644 index 00000000..6e952eab --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/extend/1301_1_2_4.svg @@ -0,0 +1,17 @@ + + + + 1301_2_j + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/extend/1301_1_2_5.svg b/collect-library/src/main/assets/omdb/4601/extend/1301_1_2_5.svg new file mode 100644 index 00000000..028e0281 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/extend/1301_1_2_5.svg @@ -0,0 +1,17 @@ + + + + 1301_2_2 + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/extend/1301_1_2_6.svg b/collect-library/src/main/assets/omdb/4601/extend/1301_1_2_6.svg new file mode 100644 index 00000000..d79bb956 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/extend/1301_1_2_6.svg @@ -0,0 +1,17 @@ + + + + 1301_2_3 + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/extend/1301_1_3.svg b/collect-library/src/main/assets/omdb/4601/extend/1301_1_3.svg new file mode 100644 index 00000000..9c121433 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/extend/1301_1_3.svg @@ -0,0 +1,16 @@ + + + + 1301_2_f + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/extend/1301_1_3_4.svg b/collect-library/src/main/assets/omdb/4601/extend/1301_1_3_4.svg new file mode 100644 index 00000000..b25a0cad --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/extend/1301_1_3_4.svg @@ -0,0 +1,17 @@ + + + + 1301_2_i + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/extend/1301_1_3_5.svg b/collect-library/src/main/assets/omdb/4601/extend/1301_1_3_5.svg new file mode 100644 index 00000000..e6b10741 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/extend/1301_1_3_5.svg @@ -0,0 +1,17 @@ + + + + 1301_2_4 + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/extend/1301_1_3_6.svg b/collect-library/src/main/assets/omdb/4601/extend/1301_1_3_6.svg new file mode 100644 index 00000000..3ff7e8b5 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/extend/1301_1_3_6.svg @@ -0,0 +1,17 @@ + + + + 1301_2_5 + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/extend/1301_1_4.svg b/collect-library/src/main/assets/omdb/4601/extend/1301_1_4.svg new file mode 100644 index 00000000..32b6d317 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/extend/1301_1_4.svg @@ -0,0 +1,16 @@ + + + + 1301_2_e + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/extend/1301_1_5.svg b/collect-library/src/main/assets/omdb/4601/extend/1301_1_5.svg new file mode 100644 index 00000000..acb3d7ff --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/extend/1301_1_5.svg @@ -0,0 +1,16 @@ + + + + 1301_2_t + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/extend/1301_1_6.svg b/collect-library/src/main/assets/omdb/4601/extend/1301_1_6.svg new file mode 100644 index 00000000..0ec4d847 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/extend/1301_1_6.svg @@ -0,0 +1,16 @@ + + + + 1301_2_x + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/extend/1301_1_7.svg b/collect-library/src/main/assets/omdb/4601/extend/1301_1_7.svg new file mode 100644 index 00000000..e707aec2 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/extend/1301_1_7.svg @@ -0,0 +1,18 @@ + + + + 提示前方可自行或右后方掉头复制 + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/extend/1301_2.svg b/collect-library/src/main/assets/omdb/4601/extend/1301_2.svg new file mode 100644 index 00000000..ad77a66d --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/extend/1301_2.svg @@ -0,0 +1,16 @@ + + + + 1301_2_b + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/extend/1301_2_3.svg b/collect-library/src/main/assets/omdb/4601/extend/1301_2_3.svg new file mode 100644 index 00000000..f8f2c938 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/extend/1301_2_3.svg @@ -0,0 +1,17 @@ + + + + 1301_2_k + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/extend/1301_2_3_4.svg b/collect-library/src/main/assets/omdb/4601/extend/1301_2_3_4.svg new file mode 100644 index 00000000..d073873d --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/extend/1301_2_3_4.svg @@ -0,0 +1,18 @@ + + + + 1301_2_m + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/extend/1301_2_4.svg b/collect-library/src/main/assets/omdb/4601/extend/1301_2_4.svg new file mode 100644 index 00000000..3f2f9707 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/extend/1301_2_4.svg @@ -0,0 +1,17 @@ + + + + 1301_2_l + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/extend/1301_2_5.svg b/collect-library/src/main/assets/omdb/4601/extend/1301_2_5.svg new file mode 100644 index 00000000..d843eb38 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/extend/1301_2_5.svg @@ -0,0 +1,17 @@ + + + + 1301_2_u + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/extend/1301_2_6.svg b/collect-library/src/main/assets/omdb/4601/extend/1301_2_6.svg new file mode 100644 index 00000000..bdb8fff7 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/extend/1301_2_6.svg @@ -0,0 +1,17 @@ + + + + 1301_2_y + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/extend/1301_3.svg b/collect-library/src/main/assets/omdb/4601/extend/1301_3.svg new file mode 100644 index 00000000..df172c9c --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/extend/1301_3.svg @@ -0,0 +1,16 @@ + + + + 1301_2_c + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/extend/1301_3_4.svg b/collect-library/src/main/assets/omdb/4601/extend/1301_3_4.svg new file mode 100644 index 00000000..acb9ae05 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/extend/1301_3_4.svg @@ -0,0 +1,17 @@ + + + + 1301_2_n + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/extend/1301_3_5.svg b/collect-library/src/main/assets/omdb/4601/extend/1301_3_5.svg new file mode 100644 index 00000000..069cbd0b --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/extend/1301_3_5.svg @@ -0,0 +1,17 @@ + + + + 1301_2_v + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/extend/1301_3_6.svg b/collect-library/src/main/assets/omdb/4601/extend/1301_3_6.svg new file mode 100644 index 00000000..79d5c087 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/extend/1301_3_6.svg @@ -0,0 +1,17 @@ + + + + 1301_2_z + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/extend/1301_4.svg b/collect-library/src/main/assets/omdb/4601/extend/1301_4.svg new file mode 100644 index 00000000..b6e1d0db --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/extend/1301_4.svg @@ -0,0 +1,15 @@ + + + + 1301_2_d + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/extend/1301_4_5.svg b/collect-library/src/main/assets/omdb/4601/extend/1301_4_5.svg new file mode 100644 index 00000000..81af0ab8 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/extend/1301_4_5.svg @@ -0,0 +1,17 @@ + + + + 1301_2_w + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/extend/1301_4_6.svg b/collect-library/src/main/assets/omdb/4601/extend/1301_4_6.svg new file mode 100644 index 00000000..57990202 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/extend/1301_4_6.svg @@ -0,0 +1,17 @@ + + + + 1301_2_0 + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/extend/1301_5.svg b/collect-library/src/main/assets/omdb/4601/extend/1301_5.svg new file mode 100644 index 00000000..aba27872 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/extend/1301_5.svg @@ -0,0 +1,16 @@ + + + + 1301_2_r + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/extend/1301_5_6.svg b/collect-library/src/main/assets/omdb/4601/extend/1301_5_6.svg new file mode 100644 index 00000000..572458f7 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/extend/1301_5_6.svg @@ -0,0 +1,17 @@ + + + + 1301_2_1 + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/extend/1301_6.svg b/collect-library/src/main/assets/omdb/4601/extend/1301_6.svg new file mode 100644 index 00000000..b33898a2 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/extend/1301_6.svg @@ -0,0 +1,16 @@ + + + + 1301_2_s + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/extend/1301_7.svg b/collect-library/src/main/assets/omdb/4601/extend/1301_7.svg new file mode 100644 index 00000000..eed6f75f --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/extend/1301_7.svg @@ -0,0 +1,17 @@ + + + + 提示右后方掉头复制 + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/normal/1301_1.svg b/collect-library/src/main/assets/omdb/4601/normal/1301_1.svg new file mode 100644 index 00000000..eee46b0a --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/normal/1301_1.svg @@ -0,0 +1,15 @@ + + + + 1301_0_a + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/normal/1301_1_2.svg b/collect-library/src/main/assets/omdb/4601/normal/1301_1_2.svg new file mode 100644 index 00000000..a17714ac --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/normal/1301_1_2.svg @@ -0,0 +1,16 @@ + + + + 1301_0_g + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/normal/1301_1_2_3.svg b/collect-library/src/main/assets/omdb/4601/normal/1301_1_2_3.svg new file mode 100644 index 00000000..15b4e042 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/normal/1301_1_2_3.svg @@ -0,0 +1,17 @@ + + + + 1301_0_h + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/normal/1301_1_2_3_4.svg b/collect-library/src/main/assets/omdb/4601/normal/1301_1_2_3_4.svg new file mode 100644 index 00000000..7e376960 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/normal/1301_1_2_3_4.svg @@ -0,0 +1,21 @@ + + + + 3 + Created with Sketch. + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/normal/1301_1_2_4.svg b/collect-library/src/main/assets/omdb/4601/normal/1301_1_2_4.svg new file mode 100644 index 00000000..54172a31 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/normal/1301_1_2_4.svg @@ -0,0 +1,17 @@ + + + + 1301_0_j + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/normal/1301_1_2_5.svg b/collect-library/src/main/assets/omdb/4601/normal/1301_1_2_5.svg new file mode 100644 index 00000000..389ab0ab --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/normal/1301_1_2_5.svg @@ -0,0 +1,17 @@ + + + + 1301_0_2 + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/normal/1301_1_2_6.svg b/collect-library/src/main/assets/omdb/4601/normal/1301_1_2_6.svg new file mode 100644 index 00000000..a42e748c --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/normal/1301_1_2_6.svg @@ -0,0 +1,17 @@ + + + + 1301_0_3 + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/normal/1301_1_3.svg b/collect-library/src/main/assets/omdb/4601/normal/1301_1_3.svg new file mode 100644 index 00000000..98d227b3 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/normal/1301_1_3.svg @@ -0,0 +1,16 @@ + + + + 1301_0_f + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/normal/1301_1_3_4.svg b/collect-library/src/main/assets/omdb/4601/normal/1301_1_3_4.svg new file mode 100644 index 00000000..a790d632 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/normal/1301_1_3_4.svg @@ -0,0 +1,17 @@ + + + + 1301_0_i + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/normal/1301_1_3_5.svg b/collect-library/src/main/assets/omdb/4601/normal/1301_1_3_5.svg new file mode 100644 index 00000000..91980137 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/normal/1301_1_3_5.svg @@ -0,0 +1,17 @@ + + + + 1301_0_4 + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/normal/1301_1_3_6.svg b/collect-library/src/main/assets/omdb/4601/normal/1301_1_3_6.svg new file mode 100644 index 00000000..a8eb644b --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/normal/1301_1_3_6.svg @@ -0,0 +1,17 @@ + + + + 1301_0_5 + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/normal/1301_1_4.svg b/collect-library/src/main/assets/omdb/4601/normal/1301_1_4.svg new file mode 100644 index 00000000..002e5954 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/normal/1301_1_4.svg @@ -0,0 +1,16 @@ + + + + 1301_0_e + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/normal/1301_1_5.svg b/collect-library/src/main/assets/omdb/4601/normal/1301_1_5.svg new file mode 100644 index 00000000..a57d2197 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/normal/1301_1_5.svg @@ -0,0 +1,16 @@ + + + + 1301_0_t + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/normal/1301_1_6.svg b/collect-library/src/main/assets/omdb/4601/normal/1301_1_6.svg new file mode 100644 index 00000000..44e65ef4 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/normal/1301_1_6.svg @@ -0,0 +1,16 @@ + + + + 1301_0_x + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/normal/1301_1_7.svg b/collect-library/src/main/assets/omdb/4601/normal/1301_1_7.svg new file mode 100644 index 00000000..9e84d3c8 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/normal/1301_1_7.svg @@ -0,0 +1,18 @@ + + + + 提示前方可自行或右后方掉头复制 + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/normal/1301_2.svg b/collect-library/src/main/assets/omdb/4601/normal/1301_2.svg new file mode 100644 index 00000000..5301bd45 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/normal/1301_2.svg @@ -0,0 +1,16 @@ + + + + 1301_0_b + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/normal/1301_2_3.svg b/collect-library/src/main/assets/omdb/4601/normal/1301_2_3.svg new file mode 100644 index 00000000..a12e77c3 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/normal/1301_2_3.svg @@ -0,0 +1,17 @@ + + + + 1301_0_k + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/normal/1301_2_3_4.svg b/collect-library/src/main/assets/omdb/4601/normal/1301_2_3_4.svg new file mode 100644 index 00000000..c65f71cb --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/normal/1301_2_3_4.svg @@ -0,0 +1,18 @@ + + + + 1301_0_m + Created with Sketch. + + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/normal/1301_2_4.svg b/collect-library/src/main/assets/omdb/4601/normal/1301_2_4.svg new file mode 100644 index 00000000..84f7e390 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/normal/1301_2_4.svg @@ -0,0 +1,17 @@ + + + + 1301_0_l + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/normal/1301_2_5.svg b/collect-library/src/main/assets/omdb/4601/normal/1301_2_5.svg new file mode 100644 index 00000000..8b28100c --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/normal/1301_2_5.svg @@ -0,0 +1,17 @@ + + + + 1301_0_u + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/normal/1301_2_6.svg b/collect-library/src/main/assets/omdb/4601/normal/1301_2_6.svg new file mode 100644 index 00000000..11521180 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/normal/1301_2_6.svg @@ -0,0 +1,17 @@ + + + + 1301_0_y + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/normal/1301_3.svg b/collect-library/src/main/assets/omdb/4601/normal/1301_3.svg new file mode 100644 index 00000000..aa94ed6e --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/normal/1301_3.svg @@ -0,0 +1,16 @@ + + + + 1301_0_c + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/normal/1301_3_4.svg b/collect-library/src/main/assets/omdb/4601/normal/1301_3_4.svg new file mode 100644 index 00000000..178daa1f --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/normal/1301_3_4.svg @@ -0,0 +1,17 @@ + + + + 1301_0_n + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/normal/1301_3_5.svg b/collect-library/src/main/assets/omdb/4601/normal/1301_3_5.svg new file mode 100644 index 00000000..0a722d82 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/normal/1301_3_5.svg @@ -0,0 +1,17 @@ + + + + 1301_0_v + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/normal/1301_3_6.svg b/collect-library/src/main/assets/omdb/4601/normal/1301_3_6.svg new file mode 100644 index 00000000..70057c1c --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/normal/1301_3_6.svg @@ -0,0 +1,17 @@ + + + + 1301_0_z + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/normal/1301_4.svg b/collect-library/src/main/assets/omdb/4601/normal/1301_4.svg new file mode 100644 index 00000000..8e5aeea7 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/normal/1301_4.svg @@ -0,0 +1,15 @@ + + + + 1301_0_d + Created with Sketch. + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/normal/1301_4_5.svg b/collect-library/src/main/assets/omdb/4601/normal/1301_4_5.svg new file mode 100644 index 00000000..8dbbcd42 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/normal/1301_4_5.svg @@ -0,0 +1,17 @@ + + + + 1301_0_w + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/normal/1301_4_6.svg b/collect-library/src/main/assets/omdb/4601/normal/1301_4_6.svg new file mode 100644 index 00000000..1d34c49d --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/normal/1301_4_6.svg @@ -0,0 +1,17 @@ + + + + 1301_0_0 + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/normal/1301_5.svg b/collect-library/src/main/assets/omdb/4601/normal/1301_5.svg new file mode 100644 index 00000000..ab0df392 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/normal/1301_5.svg @@ -0,0 +1,16 @@ + + + + 1301_0_r + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/normal/1301_5_6.svg b/collect-library/src/main/assets/omdb/4601/normal/1301_5_6.svg new file mode 100644 index 00000000..4fcaeb4e --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/normal/1301_5_6.svg @@ -0,0 +1,17 @@ + + + + 1301_0_1 + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/normal/1301_6.svg b/collect-library/src/main/assets/omdb/4601/normal/1301_6.svg new file mode 100644 index 00000000..b1061c69 --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/normal/1301_6.svg @@ -0,0 +1,16 @@ + + + + 1301_0_s + Created with Sketch. + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/assets/omdb/4601/normal/1301_7.svg b/collect-library/src/main/assets/omdb/4601/normal/1301_7.svg new file mode 100644 index 00000000..ab543afa --- /dev/null +++ b/collect-library/src/main/assets/omdb/4601/normal/1301_7.svg @@ -0,0 +1,17 @@ + + + + 提示右后方掉头复制 + Created with Sketch. + + + + + + + + + + + + \ No newline at end of file diff --git a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/ReferenceEntity.kt b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/ReferenceEntity.kt index 5697cd25..78fb98a7 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/ReferenceEntity.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/ReferenceEntity.kt @@ -23,6 +23,9 @@ open class ReferenceEntity() : RealmObject() { lateinit var name: String //要素名 lateinit var table: String //要素表名 var code: Int = 0 // 要素编码 + var zoomMin: Int = 18 //显示最小级别 + var zoomMax: Int = 23 //显示最大级别 + var taskId: Int = 0 //任务ID var geometry: String = "" // 要素渲染参考的geometry,该数据可能会在导入预处理环节被修改,原始geometry会保存在properties的geometry字段下 get() { wkt = GeometryTools.createGeometry(field) diff --git a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/RenderEntity.kt b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/RenderEntity.kt index f0cbe8f5..2d2c0f81 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/data/entity/RenderEntity.kt +++ b/collect-library/src/main/java/com/navinfo/collect/library/data/entity/RenderEntity.kt @@ -59,6 +59,9 @@ open class RenderEntity() : RealmObject(), Parcelable { var properties: RealmDictionary = RealmDictionary() var tileX: RealmSet = RealmSet() // x方向的tile编码 var tileY: RealmSet = RealmSet() // y方向的tile编码 + var taskId: Int = 0 //任务ID + var zoomMin: Int = 18 //显示最小级别 + var zoomMax: Int = 23 //显示最大级别 constructor(name: String) : this() { this.name = name diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapView.java b/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapView.java index f07e6217..b98aa4a3 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapView.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/NIMapView.java @@ -177,11 +177,11 @@ public final class NIMapView extends RelativeLayout { } -// public NIMapView(Context context, NIMapOptions options) { -// this(context, null, 0); -// this.options = options; -// initOptions(); -// } +/* public NIMapView(Context context, NIMapOptions options) { + this(context, null, 0); + this.options = options; + initOptions(); + }*/ /** * 地图的单击事件监听 diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBDataDecoder.java b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBDataDecoder.java index 65fb92fc..9e377480 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBDataDecoder.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBDataDecoder.java @@ -64,7 +64,7 @@ public class OMDBDataDecoder extends TileDecoder { } @RequiresApi(api = Build.VERSION_CODES.N) - public boolean decode(Tile tile, ITileDataSink sink, List listResult) { + public boolean decode(int zoomLevel,Tile tile, ITileDataSink sink, List listResult) { mTileDataSink = sink; mTileScale = 1 << tile.zoomLevel; mTileX = tile.tileX / mTileScale; @@ -74,10 +74,11 @@ public class OMDBDataDecoder extends TileDecoder { listResult.stream().iterator().forEachRemaining(new Consumer() { @Override public void accept(RenderEntity renderEntity) { -// Log.d("RealmDBTileDataSource", renderEntity.getGeometry()); - Map properties= new HashMap<>(renderEntity.getProperties().size()); - properties.putAll(renderEntity.getProperties()); - parseGeometry(renderEntity.getTable(), renderEntity.getWkt(), properties); + if(zoomLevel>=renderEntity.getZoomMin()&&zoomLevel<=renderEntity.getZoomMax()){ + Map properties= new HashMap<>(renderEntity.getProperties().size()); + properties.putAll(renderEntity.getProperties()); + parseGeometry(renderEntity.getTable(), renderEntity.getWkt(), properties); + } } }); return true; diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDataSource.java b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDataSource.java index 917f632e..652d9694 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDataSource.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDataSource.java @@ -48,7 +48,7 @@ public class OMDBReferenceDataSource implements ITileDataSource { } List listResult = realmQuery/*.distinct("id")*/.findAll(); if (!listResult.isEmpty()) { - mThreadLocalDecoders.get().decode(tile, mapDataSink, listResult); + mThreadLocalDecoders.get().decode(tile.zoomLevel,tile, mapDataSink, listResult); } mapDataSink.completed(QueryResult.SUCCESS); // Log.d("RealmDBTileDataSource", "tile:"+tile.getBoundingBox().toString()); diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDecoder.java b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDecoder.java index d859fde9..0596ffb5 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDecoder.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBReferenceDecoder.java @@ -60,7 +60,7 @@ public class OMDBReferenceDecoder extends TileDecoder { } @RequiresApi(api = Build.VERSION_CODES.N) - public boolean decode(Tile tile, ITileDataSink sink, List listResult) { + public boolean decode(int mapLevel,Tile tile, ITileDataSink sink, List listResult) { mTileDataSink = sink; mTileScale = 1 << tile.zoomLevel; mTileX = tile.tileX / mTileScale; @@ -70,10 +70,11 @@ public class OMDBReferenceDecoder extends TileDecoder { listResult.stream().iterator().forEachRemaining(new Consumer() { @Override public void accept(ReferenceEntity renderEntity) { -// Log.d("RealmDBTileDataSource", renderEntity.getGeometry()); - Map properties= new HashMap<>(renderEntity.getProperties().size()); - properties.putAll(renderEntity.getProperties()); - parseGeometry(renderEntity.getTable(), renderEntity.getWkt(), properties); + if(mapLevel>=renderEntity.getZoomMin()&&mapLevel<=renderEntity.getZoomMax()){ + Map properties= new HashMap<>(renderEntity.getProperties().size()); + properties.putAll(renderEntity.getProperties()); + parseGeometry(renderEntity.getTable(), renderEntity.getWkt(), properties); + } } }); return true; diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileDataSource.java b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileDataSource.java index eb42d21b..1a0aea1c 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileDataSource.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/source/OMDBTileDataSource.java @@ -50,7 +50,8 @@ public class OMDBTileDataSource implements ITileDataSource { } List listResult = realmQuery/*.distinct("id")*/.findAll(); if (!listResult.isEmpty()) { - mThreadLocalDecoders.get().decode(tile, mapDataSink, listResult); + Log.e("qj","查询数据=="+listResult.size()+"==地图级别"+tile.zoomLevel); + mThreadLocalDecoders.get().decode(tile.zoomLevel,tile, mapDataSink, listResult); } mapDataSink.completed(QueryResult.SUCCESS); // Log.d("RealmDBTileDataSource", "tile:"+tile.getBoundingBox().toString()); diff --git a/collect-library/src/main/java/com/navinfo/collect/library/system/Constant.java b/collect-library/src/main/java/com/navinfo/collect/library/system/Constant.java index 8b4011f0..a228f9bd 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/system/Constant.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/system/Constant.java @@ -30,7 +30,7 @@ public class Constant { } public static String[] HAD_LAYER_INVISIABLE_ARRAY; public static final int OVER_ZOOM = 21; - public static final int MAX_ZOOM = 25; + public static final int MAX_ZOOM = 23; public static final int OMDB_MIN_ZOOM = 18; /** diff --git a/vtm b/vtm index dd13e533..d7552c34 160000 --- a/vtm +++ b/vtm @@ -1 +1 @@ -Subproject commit dd13e533c38b5738ab404c2737d7ccadeff01323 +Subproject commit d7552c34ffdff6724b5e4ddcec461f81f1e0b669 From e69b6fca0338d7829504ff8a2d60222e6bc82d7d Mon Sep 17 00:00:00 2001 From: squallzhjch Date: Wed, 26 Jul 2023 10:49:23 +0800 Subject: [PATCH 40/40] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?=E4=B8=8B=E8=BD=BD=E6=8C=89=E9=92=AE=E5=88=B7=E6=96=B0=E4=B8=8D?= =?UTF-8?q?=E5=8F=8A=E6=97=B6=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../http/taskdownload/TaskDownloadManager.kt | 8 +++-- .../http/taskdownload/TaskDownloadScope.kt | 33 ++++++++++++------- .../omqs/ui/fragment/tasklist/TaskAdapter.kt | 4 +-- .../omqs/ui/fragment/tasklist/TaskFragment.kt | 2 +- .../ui/fragment/tasklist/TaskListAdapter.kt | 31 ++++++++++++++--- .../ui/fragment/tasklist/TaskViewModel.kt | 2 +- .../navinfo/omqs/ui/other/BaseViewHolder.kt | 18 +++++++++- .../main/res/layout/fragment_task_list.xml | 2 +- 8 files changed, 75 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadManager.kt b/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadManager.kt index bfd74d35..4a0a95e8 100644 --- a/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadManager.kt +++ b/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadManager.kt @@ -1,6 +1,7 @@ package com.navinfo.omqs.http.taskdownload import android.content.Context +import android.util.Log import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.Observer import com.navinfo.collect.library.map.NIMapController @@ -17,7 +18,7 @@ import java.util.concurrent.ConcurrentHashMap class TaskDownloadManager constructor( val importFactory: ImportOMDBHiltFactory, val netApi: RetrofitNetworkServiceAPI, - val mapController:NIMapController + val mapController: NIMapController ) { lateinit var context: Context @@ -41,6 +42,7 @@ class TaskDownloadManager constructor( ConcurrentHashMap() } + fun init(context: Context) { this.context = context } @@ -102,8 +104,9 @@ class TaskDownloadManager constructor( fun addTask(taskBean: TaskBean) { + Log.e("jingo", "下载线程 ${taskBean.id}") if (!scopeMap.containsKey(taskBean.id)) { - scopeMap[taskBean.id] = TaskDownloadScope( this, taskBean) + scopeMap[taskBean.id] = TaskDownloadScope(this, taskBean) } } @@ -111,6 +114,7 @@ class TaskDownloadManager constructor( fun observer( id: Int, lifecycleOwner: LifecycleOwner, observer: Observer ) { + Log.e("jingo", "监听线程 ${id}") if (scopeMap.containsKey(id)) { scopeMap[id]!!.observer(lifecycleOwner, observer) } diff --git a/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadScope.kt b/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadScope.kt index 60ff56fc..b2ce36ab 100644 --- a/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadScope.kt +++ b/app/src/main/java/com/navinfo/omqs/http/taskdownload/TaskDownloadScope.kt @@ -1,14 +1,16 @@ package com.navinfo.omqs.http.taskdownload import android.util.Log +import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.MutableLiveData import androidx.lifecycle.Observer -import com.navinfo.omqs.Constant import com.navinfo.collect.library.data.entity.TaskBean +import com.navinfo.omqs.Constant import com.navinfo.omqs.db.ImportOMDBHelper import com.navinfo.omqs.tools.FileManager import com.navinfo.omqs.tools.FileManager.Companion.FileDownloadStatus +import com.navinfo.omqs.ui.other.BaseViewHolder import com.navinfo.omqs.util.DateTimeUtil import io.realm.Realm import kotlinx.coroutines.* @@ -21,7 +23,7 @@ class TaskDownloadScope( private val downloadManager: TaskDownloadManager, val taskBean: TaskBean, ) : - CoroutineScope by CoroutineScope(Dispatchers.IO + CoroutineName("OfflineMapDownLoad")) { + CoroutineScope by CoroutineScope(Dispatchers.IO + CoroutineName("TaskMapDownLoad")) { /** *下载任务,用来取消的 @@ -31,8 +33,8 @@ class TaskDownloadScope( /** * 管理观察者,同时只有一个就行了 */ - private val observer = Observer {} -// private var lifecycleOwner: LifecycleOwner? = null +// private val observer = Observer {} + private var lifecycleOwner: LifecycleOwner? = null /** *通知UI更新 @@ -92,6 +94,7 @@ class TaskDownloadScope( * @param status [OfflineMapCityBean.Status] */ private suspend fun change(status: Int, message: String = "") { + if (taskBean.status != status || status == FileDownloadStatus.LOADING || status == FileDownloadStatus.IMPORTING) { taskBean.status = status taskBean.message = message @@ -111,8 +114,9 @@ class TaskDownloadScope( * 添加下载任务观察者 */ fun observer(owner: LifecycleOwner, ob: Observer) { + removeObserver() -// this.lifecycleOwner = owner + this.lifecycleOwner = owner downloadData.observe(owner, ob) } @@ -134,9 +138,7 @@ class TaskDownloadScope( Log.e("jingo", "数据安装 $it") if (it == "finish") { withContext(Dispatchers.Main) { - downloadManager.mapController.layerManagerHandler.omdbLayersUpdate() downloadManager.mapController.mMapView.updateMap(true) - Log.e("jingo", "数据安装结束,刷新地图") } change(FileDownloadStatus.DONE) @@ -235,10 +237,17 @@ class TaskDownloadScope( } fun removeObserver() { - downloadData.observeForever(observer) -// lifecycleOwner?.let { - downloadData.removeObserver(observer) -// null -// } +// downloadData.observeForever(observer) +//// lifecycleOwner?.let { +// downloadData.removeObserver(observer) +//// null +//// } + if (lifecycleOwner != null) { + Log.e( + "jingo", + "移除的上一个监听者 ${lifecycleOwner.hashCode()} ${(lifecycleOwner as BaseViewHolder).tag}" + ) + downloadData.removeObservers(lifecycleOwner!!) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskAdapter.kt index ee7ec323..8c164c07 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskAdapter.kt @@ -11,7 +11,7 @@ import com.navinfo.omqs.ui.other.BaseViewHolder interface TaskAdapterCallback { fun itemOnClick(bean: HadLinkDvoBean) - fun editOnclick(position: Int, bean: HadLinkDvoBean) + fun editOnClick(position: Int, bean: HadLinkDvoBean) } /** @@ -54,7 +54,7 @@ class TaskAdapter( } binding.taskEdit.isSelected = bean.reason != "" binding.taskEdit.setOnClickListener { - callback.editOnclick(position, bean) + callback.editOnClick(position, bean) } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskFragment.kt index 9312378b..e053d264 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskFragment.kt @@ -45,7 +45,7 @@ class TaskFragment : BaseFragment() { } } - override fun editOnclick(position: Int, bean: HadLinkDvoBean) { + override fun editOnClick(position: Int, bean: HadLinkDvoBean) { showLinkEditDialog(position, bean) } }) diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt index f7f7e3a8..9d450b60 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskListAdapter.kt @@ -7,6 +7,10 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.Toast +import androidx.lifecycle.DefaultLifecycleObserver +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleEventObserver +import androidx.lifecycle.LifecycleOwner import androidx.lifecycle.Observer import androidx.recyclerview.widget.RecyclerView import com.navinfo.collect.library.data.entity.TaskBean @@ -19,6 +23,7 @@ import com.navinfo.omqs.tools.FileManager.Companion.FileDownloadStatus import com.navinfo.omqs.tools.FileManager.Companion.FileUploadStatus import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter import com.navinfo.omqs.ui.other.BaseViewHolder +import com.navinfo.omqs.ui.other.OnLifecycleStateListener import com.navinfo.omqs.ui.widget.LeftDeleteView /** @@ -115,6 +120,7 @@ class TaskListAdapter( override fun onViewRecycled(holder: BaseViewHolder) { super.onViewRecycled(holder) //页面滑动时会用holder重构页面,但是对进度条的监听回调会一直返回,扰乱UI,所以当当前holder去重构的时候,移除监听 + //这里 BaseViewHolder 的LifecycleOwner 状态很早就DESTROYED 了,这个回调比较晚,起到的作用很小 downloadManager.removeObserver(holder.tag.toInt()) } @@ -122,7 +128,7 @@ class TaskListAdapter( holder: BaseViewHolder, @SuppressLint("RecyclerView") position: Int ) { - Log.e("jingo", "TaskListAdapter onBindViewHolder $position ") + val binding: AdapterTaskListBinding = holder.viewBinding as AdapterTaskListBinding val taskBean = data[position] @@ -141,8 +147,22 @@ class TaskListAdapter( //tag 方便onclick里拿到数据 holder.tag = taskBean.id.toString() changeViews(binding, taskBean) + holder.addObserver(object : OnLifecycleStateListener { + override fun onState(tag: String, state: Lifecycle.State) { + when (state) { + Lifecycle.State.STARTED -> + downloadManager.observer( + taskBean.id, + holder, + DownloadObserver(taskBean.id, holder) + ) + Lifecycle.State.DESTROYED -> + downloadManager.removeObserver(tag.toInt()) + else -> {} + } + } + }) downloadManager.addTask(taskBean) - downloadManager.observer(taskBean.id, holder, DownloadObserver(taskBean.id, holder)) uploadManager.addTask(taskBean) uploadManager.observer(taskBean.id, holder, UploadObserver(taskBean.id, binding)) if (taskBean.status == FileDownloadStatus.NONE) { @@ -195,9 +215,10 @@ class TaskListAdapter( binding.taskDeleteLayout.setOnClickListener { //重置状态 leftDeleteView?.resetDeleteStatus() - if(taskBean.syncStatus != FileUploadStatus.DONE){ - Toast.makeText(binding.taskUploadBtn.context, "数据未上传,不允许关闭!", Toast.LENGTH_SHORT).show() - }else{ + if (taskBean.syncStatus != FileUploadStatus.DONE) { + Toast.makeText(binding.taskUploadBtn.context, "数据未上传,不允许关闭!", Toast.LENGTH_SHORT) + .show() + } else { itemListener?.invoke(position, ItemClickStatus.DELETE_LAYOUT_CLICK, taskBean) } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt index b6f25996..e646eba1 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/tasklist/TaskViewModel.kt @@ -160,7 +160,7 @@ class TaskViewModel @Inject constructor( val objects = realm.where(TaskBean::class.java).notEqualTo("syncStatus", syncUpload).or() .between("operationTime", beginNowTime, nowTime) - .equalTo("syncStatus", syncUpload).findAll() + .equalTo("syncStatus", syncUpload).findAll().sort("id") val taskList = realm.copyFromRealm(objects) for (item in taskList) { FileManager.checkOMDBFileInfo(item) diff --git a/app/src/main/java/com/navinfo/omqs/ui/other/BaseViewHolder.kt b/app/src/main/java/com/navinfo/omqs/ui/other/BaseViewHolder.kt index 2544a7c0..7127a482 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/other/BaseViewHolder.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/other/BaseViewHolder.kt @@ -16,6 +16,8 @@ open class BaseViewHolder(val viewBinding: ViewBinding) : private val lifecycleRegistry = LifecycleRegistry(this) var tag = "" + private var listener: OnLifecycleStateListener? = null + init { // dataBinding.lifecycleOwner = this lifecycleRegistry.currentState = Lifecycle.State.INITIALIZED @@ -37,19 +39,33 @@ open class BaseViewHolder(val viewBinding: ViewBinding) : fun onStart() { lifecycleRegistry.currentState = Lifecycle.State.STARTED // lifecycleRegistry.currentState = Lifecycle.State.RESUMED // ON_RESUME EVENT + listener?.onState(tag,Lifecycle.State.STARTED) } fun onStop() { lifecycleRegistry.currentState = Lifecycle.State.STARTED // - lifecycleRegistry.currentState = Lifecycle.State.CREATED // ON_STOP EVENT + lifecycleRegistry.currentState = Lifecycle.State.CREATED // +// listener?.onState(tag,Lifecycle.State.STARTED)// ON_STOP EVENT } fun onDestroy() { lifecycleRegistry.currentState = Lifecycle.State.DESTROYED /// ON_DESTROY EVENT + listener?.onState(tag,Lifecycle.State.DESTROYED) } override fun getLifecycle(): Lifecycle { return lifecycleRegistry } + + fun addObserver(listener: OnLifecycleStateListener) { + this.listener = listener + } +} + +/** + * 生命周期变化 + */ +interface OnLifecycleStateListener { + fun onState(tag:String,state: Lifecycle.State) } \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_task_list.xml b/app/src/main/res/layout/fragment_task_list.xml index 3fe6330f..6f62c900 100644 --- a/app/src/main/res/layout/fragment_task_list.xml +++ b/app/src/main/res/layout/fragment_task_list.xml @@ -41,7 +41,7 @@ app:layout_constraintRight_toRightOf="@id/task_list_search" app:layout_constraintTop_toTopOf="@id/task_list_search" /> -