From 8f3bd1926a358267edf2b3aa449907859fcf3fdf Mon Sep 17 00:00:00 2001 From: squallzhjch Date: Fri, 4 Aug 2023 10:11:29 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=A6=81=E7=B4=A0=E6=8D=95?= =?UTF-8?q?=E6=8D=89=E5=8A=9F=E8=83=BD=EF=BC=8C=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E6=B5=8B=E9=87=8F=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/navinfo/omqs/db/RealmOperateHelper.kt | 77 ++++---- .../omqs/ui/activity/login/LoginViewModel.kt | 3 + .../omqs/ui/activity/map/MainViewModel.kt | 10 +- .../signMoreInfo/LaneBoundaryAdapter.kt | 103 +++++++++++ .../signMoreInfo/SignMoreInfoFragment.kt | 23 ++- ...nicEyeInfoAdapter.kt => TwoItemAdapter.kt} | 13 +- .../tasklink/TaskLinkMiddleAdapter.kt | 3 - .../ui/fragment/tasklist/TaskListAdapter.kt | 6 +- .../ui/fragment/tasklist/TaskViewModel.kt | 11 +- .../navinfo/omqs/ui/other/BaseViewHolder.kt | 1 - .../other/anim/ExpandableViewHoldersUtil.kt | 119 +++++++++++++ .../omqs/ui/other/anim/LayoutAnimator.kt | 22 +++ .../omqs/ui/other/anim/ViewHolderAnimator.kt | 60 +++++++ .../com/navinfo/omqs/ui/widget/SignUtil.kt | 166 +++++++++++++++--- .../baseline_arrow_drop_down_24.xml | 5 + .../drawable-v24/baseline_arrow_left_24.xml | 5 + .../drawable-xxhdpi/measuring_tool_angle.png | Bin 0 -> 1326 bytes .../drawable-xxhdpi/measuring_tool_area.png | Bin 0 -> 1621 bytes .../measuring_tool_distance.png | Bin 0 -> 1771 bytes .../measuring_tool_select_point.png | Bin 0 -> 1548 bytes .../shape_rect_transparent_blue_6dp_bg.xml | 14 ++ app/src/main/res/layout/activity_main.xml | 2 +- .../main/res/layout/adapter_lane_boundary.xml | 36 ++++ ...lectronic_eye.xml => adapter_two_item.xml} | 2 +- .../main/res/layout/main_measuring_tool.xml | 119 +++++++++++++ .../library/data/entity/ReferenceEntity.kt | 3 - .../map/handler/LayerManagerHandler.kt | 8 +- .../map/source/OMDBReferenceDataSource.java | 24 +-- .../map/source/OMDBTileDataSource.java | 9 +- .../map/source/RealmDBTileDataSource.java | 2 +- .../collect/library/system/Constant.java | 8 +- 31 files changed, 732 insertions(+), 122 deletions(-) create mode 100644 app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/LaneBoundaryAdapter.kt rename app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/{ElectronicEyeInfoAdapter.kt => TwoItemAdapter.kt} (58%) create mode 100644 app/src/main/java/com/navinfo/omqs/ui/other/anim/ExpandableViewHoldersUtil.kt create mode 100644 app/src/main/java/com/navinfo/omqs/ui/other/anim/LayoutAnimator.kt create mode 100644 app/src/main/java/com/navinfo/omqs/ui/other/anim/ViewHolderAnimator.kt create mode 100644 app/src/main/res/drawable-v24/baseline_arrow_drop_down_24.xml create mode 100644 app/src/main/res/drawable-v24/baseline_arrow_left_24.xml create mode 100644 app/src/main/res/drawable-xxhdpi/measuring_tool_angle.png create mode 100644 app/src/main/res/drawable-xxhdpi/measuring_tool_area.png create mode 100644 app/src/main/res/drawable-xxhdpi/measuring_tool_distance.png create mode 100644 app/src/main/res/drawable-xxhdpi/measuring_tool_select_point.png create mode 100644 app/src/main/res/drawable/shape_rect_transparent_blue_6dp_bg.xml create mode 100644 app/src/main/res/layout/adapter_lane_boundary.xml rename app/src/main/res/layout/{adapter_electronic_eye.xml => adapter_two_item.xml} (90%) create mode 100644 app/src/main/res/layout/main_measuring_tool.xml 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 a1a02fd4..59206b0c 100644 --- a/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt +++ b/app/src/main/java/com/navinfo/omqs/db/RealmOperateHelper.kt @@ -121,16 +121,14 @@ class RealmOperateHelper() { suspend fun queryLink(linkPid: String): RenderEntity? { var link: RenderEntity? = null - withContext(Dispatchers.IO) { - val realm = Realm.getDefaultInstance() - val realmR = realm.where(RenderEntity::class.java) - .equalTo("table", "OMDB_RD_LINK") - .and() - .equalTo("properties['${LinkTable.linkPid}']", linkPid) - .findFirst() - if (realmR != null) { - link = realm.copyFromRealm(realmR) - } + val realm = Realm.getDefaultInstance() + val realmR = realm.where(RenderEntity::class.java) + .equalTo("table", "OMDB_RD_LINK") + .and() + .equalTo("properties['${LinkTable.linkPid}']", linkPid) + .findFirst() + if (realmR != null) { + link = realm.copyFromRealm(realmR) } return link } @@ -150,38 +148,38 @@ class RealmOperateHelper() { sort: Boolean = true ): MutableList { val result = mutableListOf() - withContext(Dispatchers.IO) { - val polygon = getPolygonFromPoint(point, buffer, bufferType) - // 根据polygon查询相交的tile号 - val tileXSet = mutableSetOf() - tileXSet.toString() - GeometryToolsKt.getTileXByGeometry(polygon.toString(), tileXSet) - val tileYSet = mutableSetOf() - GeometryToolsKt.getTileYByGeometry(polygon.toString(), tileYSet) + val polygon = getPolygonFromPoint(point, buffer, bufferType) + // 根据polygon查询相交的tile号 + val tileXSet = mutableSetOf() + tileXSet.toString() + GeometryToolsKt.getTileXByGeometry(polygon.toString(), tileXSet) + val tileYSet = mutableSetOf() + GeometryToolsKt.getTileYByGeometry(polygon.toString(), tileYSet) - // 对tileXSet和tileYSet查询最大最小值 - val xStart = tileXSet.stream().min(Comparator.naturalOrder()).orElse(null) - val xEnd = tileXSet.stream().max(Comparator.naturalOrder()).orElse(null) - val yStart = tileYSet.stream().min(Comparator.naturalOrder()).orElse(null) - val yEnd = tileYSet.stream().max(Comparator.naturalOrder()).orElse(null) - // 查询realm中对应tile号的数据 - val realmList = Realm.getDefaultInstance().where(RenderEntity::class.java) - .notEqualTo("table", "OMDB_RD_LINK") - .and() - .rawPredicate("tileX>=$xStart and tileX<=$xEnd and tileY>=$yStart and tileY<=$yEnd") - .findAll() - // 将获取到的数据和查询的polygon做相交,只返回相交的数据 - val queryResult = realmList?.stream()?.filter { - polygon.intersects(it.wkt) - }?.toList() - queryResult?.let { - result.addAll(queryResult) - } + // 对tileXSet和tileYSet查询最大最小值 + val xStart = tileXSet.stream().min(Comparator.naturalOrder()).orElse(null) + val xEnd = tileXSet.stream().max(Comparator.naturalOrder()).orElse(null) + val yStart = tileYSet.stream().min(Comparator.naturalOrder()).orElse(null) + val yEnd = tileYSet.stream().max(Comparator.naturalOrder()).orElse(null) + val realm = Realm.getDefaultInstance() + // 查询realm中对应tile号的数据 + val realmList = realm.where(RenderEntity::class.java) + .notEqualTo("table", "OMDB_RD_LINK") + .and() + .rawPredicate("tileX>=$xStart and tileX<=$xEnd and tileY>=$yStart and tileY<=$yEnd") + .findAll() + // 将获取到的数据和查询的polygon做相交,只返回相交的数据 + val queryResult = realmList?.stream()?.filter { + polygon.intersects(it.wkt) + }?.toList() + queryResult?.let { if (sort) { - result.clear() - result.addAll(sortRenderEntity(point, result)) + result.addAll(sortRenderEntity(point, realm.copyFromRealm(it))) + } else { + result.addAll(realm.copyFromRealm(it)) } } + return result } @@ -213,8 +211,7 @@ class RealmOperateHelper() { @RequiresApi(Build.VERSION_CODES.N) fun sortRenderEntity(point: Point, unSortList: List): List { val sortList = unSortList.stream().sorted { renderEntity, renderEntity2 -> - val near = point.distance(renderEntity.wkt) - point.distance(renderEntity2.wkt) - if (near < 0) -1 else 1 + point.distance(renderEntity.wkt).compareTo(point.distance(renderEntity2.wkt)) }.toList() return sortList } 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 f167d595..52582359 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 @@ -281,6 +281,9 @@ class LoginViewModel @Inject constructor( task.operationTime = DateTimeUtil.getNowDate().time } } else { + for (hadLink in task.hadLinkDvoList) { + hadLink.taskId = task.id + } //赋值时间,用于查询过滤 task.operationTime = DateTimeUtil.getNowDate().time } 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 a3860287..58602999 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 @@ -199,7 +199,7 @@ class MainViewModel @Inject constructor( Map.SCALE_EVENT, Map.MOVE_EVENT, Map.ROTATE_EVENT -> liveDataCenterPoint.value = mapPosition } - if(mapController.mMapView.vtmMap.mapPosition.zoomLevel>=16){ + if (mapController.mMapView.vtmMap.mapPosition.zoomLevel >= 16) { } currentMapZoomLevel = mapController.mMapView.vtmMap.mapPosition.zoomLevel @@ -219,7 +219,7 @@ class MainViewModel @Inject constructor( object : OnGeoPointClickListener { override fun onMapClick(tag: String, point: GeoPoint) { if (tag == TAG) { - viewModelScope.launch(Dispatchers.Default) { + viewModelScope.launch(Dispatchers.IO) { //线选择状态 if (bSelectRoad) { captureLink(point) @@ -280,6 +280,8 @@ class MainViewModel @Inject constructor( initNILocationData() } sharedPreferences.registerOnSharedPreferenceChangeListener(this) + com.navinfo.collect.library.system.Constant.TASK_ID = + sharedPreferences.getInt(Constant.SELECT_TASK_ID, -1) socketServer = SocketServer(mapController, traceDataBase, sharedPreferences) } @@ -455,8 +457,8 @@ class MainViewModel @Inject constructor( ) ) - if(itemList.size == 1){ - SignUtil.getSignNameText(itemList[0]) + if (itemList.size > 0) { + liveDataSignMoreInfo.postValue(itemList[0]) } } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/LaneBoundaryAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/LaneBoundaryAdapter.kt new file mode 100644 index 00000000..59f8bddc --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/LaneBoundaryAdapter.kt @@ -0,0 +1,103 @@ +package com.navinfo.omqs.ui.fragment.signMoreInfo + +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.TextView +import androidx.recyclerview.widget.RecyclerView +import androidx.recyclerview.widget.RecyclerView.ViewHolder +import com.navinfo.omqs.R +import com.navinfo.omqs.databinding.AdapterLaneBoundaryBinding +import com.navinfo.omqs.databinding.AdapterTwoItemBinding +import com.navinfo.omqs.ui.other.BaseViewHolder +import com.navinfo.omqs.ui.other.anim.ExpandableViewHoldersUtil +import com.navinfo.omqs.ui.other.anim.ExpandableViewHoldersUtil.Expandable + + +data class LaneBoundaryItem( + val title: String, val text: String?, val itemList: MutableList? +) + +class LaneBoundaryAdapter : RecyclerView.Adapter() { + private val keepOne: ExpandableViewHoldersUtil.KeepOneH = + ExpandableViewHoldersUtil.KeepOneH() + + private var dataList = mutableListOf() + + class ExpandViewHolder( + val viewBinding: AdapterLaneBoundaryBinding, + private val keepOne: ExpandableViewHoldersUtil.KeepOneH + ) : ViewHolder(viewBinding.root), + View.OnClickListener, Expandable { + + init { + viewBinding.root.setOnClickListener(this) + } + + fun bind(pos: Int, laneBoundaryItem: LaneBoundaryItem) { + viewBinding.contactName.text = laneBoundaryItem.title + if (laneBoundaryItem.itemList != null) { + for (item in laneBoundaryItem.itemList) { + var view = LayoutInflater.from(viewBinding.root.context) + .inflate(R.layout.adapter_two_item, null, false) + view.findViewById(R.id.title).text = item.title + view.findViewById(R.id.text).text = item.text + viewBinding.infos.addView(view) + } + } + keepOne.bind(this, pos) + } + + override fun onClick(v: View) { + keepOne.toggle(this,viewBinding.expandIcon) + } + + override val expandView: View + get() = viewBinding.infos + + } + + override + + fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { + return if (viewType == 1) { + val viewBinding = AdapterLaneBoundaryBinding.inflate( + LayoutInflater.from(parent.context), parent, false + ) + ExpandViewHolder(viewBinding, keepOne) + } else { + val viewBinding = + AdapterTwoItemBinding.inflate(LayoutInflater.from(parent.context), parent, false) + BaseViewHolder(viewBinding) + } + } + + override fun getItemCount(): Int { + return dataList.size + } + + override fun onBindViewHolder(holder: ViewHolder, position: Int) { + if (holder is ExpandViewHolder) { + holder.bind(position, dataList[position]) + } else if (holder is BaseViewHolder) { + val binding: AdapterTwoItemBinding = holder.viewBinding as AdapterTwoItemBinding + val item = dataList[position] + binding.title.text = item.title + binding.text.text = item.text + } + } + + override fun getItemViewType(position: Int): Int { + return if (dataList[position].itemList != null) 1 + else 0 + } + + fun refreshData(list: List) { + dataList.clear() + dataList.addAll(list) + notifyDataSetChanged() + } +} + + + diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/SignMoreInfoFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/SignMoreInfoFragment.kt index 3a77f5c8..67d73a25 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/SignMoreInfoFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/SignMoreInfoFragment.kt @@ -55,15 +55,27 @@ class SignMoreInfoFragment : BaseFragment() { binding.signInfoRecyclerview.adapter = adapter adapter.refreshData(SignUtil.getRoadNameList(it)) } + //车道边界类型 + 2013 -> { + val adapter = LaneBoundaryAdapter() + binding.signInfoRecyclerview.adapter = adapter + adapter.refreshData(SignUtil.getLaneBoundaryTypeInfo(it)) + } + //可变点限速 + 2021 -> { + val adapter = TwoItemAdapter() + binding.signInfoRecyclerview.adapter = adapter + adapter.refreshData(SignUtil.getChangeLimitSpeedInfo(it)) + } //常规点限速 4002 -> { - val adapter = ElectronicEyeInfoAdapter() + val adapter = TwoItemAdapter() binding.signInfoRecyclerview.adapter = adapter adapter.refreshData(SignUtil.getSpeedLimitMoreInfoText(it)) } //条件点限速 4003 -> { - val adapter = ElectronicEyeInfoAdapter() + val adapter = TwoItemAdapter() binding.signInfoRecyclerview.adapter = adapter adapter.refreshData(SignUtil.getConditionLimitMoreInfoText(it)) } @@ -80,11 +92,14 @@ class SignMoreInfoFragment : BaseFragment() { binding.signInfoTitle.setCompoundDrawables( drawable, null, null, null ) - val adapter = ElectronicEyeInfoAdapter() + val adapter = TwoItemAdapter() binding.signInfoRecyclerview.adapter = adapter adapter.refreshData(SignUtil.getElectronicEyeMoreInfo(it)) } - + else -> { + val adapter = TwoItemAdapter() + binding.signInfoRecyclerview.adapter = adapter + } } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/ElectronicEyeInfoAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/TwoItemAdapter.kt similarity index 58% rename from app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/ElectronicEyeInfoAdapter.kt rename to app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/TwoItemAdapter.kt index 50a95962..516644b2 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/ElectronicEyeInfoAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/signMoreInfo/TwoItemAdapter.kt @@ -2,27 +2,26 @@ package com.navinfo.omqs.ui.fragment.signMoreInfo import android.view.LayoutInflater import android.view.ViewGroup -import com.navinfo.omqs.R -import com.navinfo.omqs.databinding.AdapterElectronicEyeBinding +import com.navinfo.omqs.databinding.AdapterTwoItemBinding import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter import com.navinfo.omqs.ui.other.BaseViewHolder -data class ElectronicEyeMoreInfoAdapterItem( +data class TwoItemAdapterItem( val title: String, val text: String ) -class ElectronicEyeInfoAdapter : BaseRecyclerViewAdapter() { +class TwoItemAdapter : BaseRecyclerViewAdapter() { override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { val viewBinding = - AdapterElectronicEyeBinding.inflate(LayoutInflater.from(parent.context), parent, false) + AdapterTwoItemBinding.inflate(LayoutInflater.from(parent.context), parent, false) return BaseViewHolder(viewBinding) } override fun onBindViewHolder(holder: BaseViewHolder, position: Int) { - val binding: AdapterElectronicEyeBinding = - holder.viewBinding as AdapterElectronicEyeBinding + val binding: AdapterTwoItemBinding = + holder.viewBinding as AdapterTwoItemBinding val item = data[position] binding.title.text = item.title binding.text.text = item.text 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 2536192a..ce1b2ffa 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 @@ -1,11 +1,8 @@ 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 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 9f017d33..351b6000 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 @@ -180,10 +180,10 @@ class TaskListAdapter( binding.taskUploadBtn.visibility = View.INVISIBLE } if (taskBean.syncStatus == FileUploadStatus.DONE) { - binding.taskUploadBtn.setProgress(0) +// binding.taskUploadBtn.setProgress(0) binding.taskUploadBtn.setBackgroundColor(binding.root.resources.getColor(R.color.ripple_end_color)) } else { - binding.taskUploadBtn.setProgress(100) +// binding.taskUploadBtn.setProgress(100) binding.taskUploadBtn.setBackgroundColor(Color.parseColor("#888FB3")) } binding.taskDownloadBtn.tag = position @@ -301,7 +301,7 @@ class TaskListAdapter( binding.taskDownloadBtn.setTextColor(Color.WHITE) } - if (taskBean.fileSize > 0L) { + if (taskBean.fileSize > 0L && taskBean.status != FileDownloadStatus.DONE) { val progress = (taskBean.currentSize * 100 / taskBean.fileSize).toInt() binding.taskProgressText.text = "$progress%" 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 d9fcb382..dd38fd43 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 @@ -5,7 +5,6 @@ import android.content.SharedPreferences import android.content.SharedPreferences.OnSharedPreferenceChangeListener import android.os.Build import android.view.View -import android.widget.Toast import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope @@ -19,7 +18,6 @@ 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 import com.navinfo.omqs.ui.dialog.FirstDialog @@ -27,7 +25,6 @@ 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 @@ -144,6 +141,10 @@ class TaskViewModel @Inject constructor( liveDataTaskLinks.value = taskBean.hadLinkDvoList showTaskLinks(taskBean) + com.navinfo.collect.library.system.Constant.TASK_ID = taskBean.id + mapController.layerManagerHandler.omdbLayersClear() + mapController.mMapView.updateMap(true) + } private fun showTaskLinks(taskBean: TaskBean) { @@ -475,8 +476,8 @@ class TaskViewModel @Inject constructor( .equalTo("linkId", hadLinkDvoBean.linkPid) .and().equalTo("taskId", hadLinkDvoBean.taskId) .findAll() - if(markers != null){ - for(marker in markers){ + if (markers != null) { + for (marker in markers) { mapController.markerHandle.removeQsRecordMark(marker) } markers.deleteAllFromRealm() 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 35e78452..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 @@ -1,6 +1,5 @@ package com.navinfo.omqs.ui.other -import android.util.Log import android.view.View import androidx.lifecycle.Lifecycle import androidx.lifecycle.LifecycleOwner diff --git a/app/src/main/java/com/navinfo/omqs/ui/other/anim/ExpandableViewHoldersUtil.kt b/app/src/main/java/com/navinfo/omqs/ui/other/anim/ExpandableViewHoldersUtil.kt new file mode 100644 index 00000000..4db8463f --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/other/anim/ExpandableViewHoldersUtil.kt @@ -0,0 +1,119 @@ +package com.navinfo.omqs.ui.other.anim + +import android.R.attr.animation +import android.animation.Animator +import android.animation.AnimatorListenerAdapter +import android.animation.ObjectAnimator +import android.animation.ValueAnimator +import android.os.Build +import android.view.View +import android.view.animation.DecelerateInterpolator +import android.widget.ImageView +import androidx.recyclerview.widget.RecyclerView +import com.navinfo.omqs.ui.other.anim.ViewHolderAnimator.ViewHolderAnimatorListener + + +object ExpandableViewHoldersUtil { + + //自定义处理列表中右侧图标,这里是一个旋转动画 + fun rotateExpandIcon(mImage: ImageView, from: Float, to: Float) { + val valueAnimator: ValueAnimator = ValueAnimator.ofFloat(from, to) //属性动画 + valueAnimator.duration = 500 + valueAnimator.interpolator = DecelerateInterpolator() + valueAnimator.addUpdateListener { valueAnimator -> + mImage.rotation = valueAnimator.animatedValue as Float + } + valueAnimator.start() + } + + //参数介绍:1、holder对象 2、展开部分的View,由holder.getExpandView()方法获取 3、animate参数为true,则有动画效果 + fun openH(holder: RecyclerView.ViewHolder, expandView: View, animate: Boolean) { + if (animate) { + expandView.visibility = View.VISIBLE + //改变高度的动画 + val animator = ViewHolderAnimator.ofItemViewHeight(holder) + //扩展的动画,结束后透明度动画开始 + animator!!.addListener(object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator) { + val alphaAnimator = ObjectAnimator.ofFloat(expandView, View.ALPHA, 1f) + alphaAnimator.addListener(ViewHolderAnimatorListener(holder)) + alphaAnimator.start() + } + }) + animator.start() + } else {//为false时直接显示 + expandView.visibility = View.VISIBLE + expandView.alpha = 1f + } + } + + //类似于打开的方法 + fun closeH(holder: RecyclerView.ViewHolder, expandView: View, animate: Boolean) { + if (animate) { + expandView.visibility = View.GONE + val animator = ViewHolderAnimator.ofItemViewHeight(holder) + expandView.visibility = View.VISIBLE + animator!!.addListener(object : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator) { + expandView.visibility = View.GONE + expandView.alpha = 0f + } + + override fun onAnimationCancel(animation: Animator) { + expandView.visibility = View.GONE + expandView.alpha = 0f + } + }) + animator.start() + } else { + expandView.visibility = View.GONE + expandView.alpha = 0f + } + } + + //获取展开部分的View + interface Expandable { + val expandView: View + } + + class KeepOneH where VH : RecyclerView.ViewHolder, VH : Expandable? { + //-1表示所有item是关闭状态,opend为pos值的表示pos位置的item为展开的状态 + private var _opened = -1 + + /** + * 此方法是在Adapter的onBindViewHolder()方法中调用 + * + * @param holder holder对象 + * @param pos 下标 + */ + fun bind(holder: VH, pos: Int) { + if (pos == _opened) openH(holder, holder!!.expandView, false) else closeH( + holder, + holder!!.expandView, + false + ) + } + + /** + * 响应ViewHolder的点击事件 + * + * @param holder holder对象 + * @param imageView 这里我传入了一个ImageView对象,为了处理图片旋转的动画,为了处理内部业务 + */ + fun toggle(holder: VH, imageView: ImageView) { + if (_opened == holder!!.position) { + _opened = -1 + rotateExpandIcon(imageView, 180F, 0F); + closeH(holder, holder.expandView, true) + } else { + val previous = _opened + _opened = holder.position + rotateExpandIcon(imageView, 0F, 180F); + openH(holder, holder.expandView, true) + val oldHolder = + (holder.itemView.parent as RecyclerView).findViewHolderForPosition(previous) as VH? + if (oldHolder != null) closeH(oldHolder, oldHolder.expandView, true) + } + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/other/anim/LayoutAnimator.kt b/app/src/main/java/com/navinfo/omqs/ui/other/anim/LayoutAnimator.kt new file mode 100644 index 00000000..214bec0c --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/other/anim/LayoutAnimator.kt @@ -0,0 +1,22 @@ +package com.navinfo.omqs.ui.other.anim + +import android.animation.Animator +import android.animation.ValueAnimator +import android.view.View + +object LayoutAnimator { + fun ofHeight(view: View, start: Int, end: Int): Animator { + val animator = ValueAnimator.ofInt(start, end) + animator.addUpdateListener(LayoutHeightUpdateListener(view)) + return animator + } + + class LayoutHeightUpdateListener(private val _view: View) : + ValueAnimator.AnimatorUpdateListener { + override fun onAnimationUpdate(animation: ValueAnimator) { + val lp = _view.layoutParams + lp.height = animation.animatedValue as Int + _view.layoutParams = lp + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/other/anim/ViewHolderAnimator.kt b/app/src/main/java/com/navinfo/omqs/ui/other/anim/ViewHolderAnimator.kt new file mode 100644 index 00000000..9bda09ab --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/other/anim/ViewHolderAnimator.kt @@ -0,0 +1,60 @@ +package com.navinfo.omqs.ui.other.anim + +import android.animation.Animator +import android.animation.AnimatorListenerAdapter +import android.view.View +import android.view.ViewGroup +import androidx.recyclerview.widget.RecyclerView + +object ViewHolderAnimator { + fun ofItemViewHeight(holder: RecyclerView.ViewHolder): Animator? { + val parent = holder.itemView.parent as View + ?: throw IllegalStateException("Cannot animate the layout of a view that has no parent") + val start = holder.itemView.measuredHeight + holder.itemView.measure( + View.MeasureSpec.makeMeasureSpec( + parent.measuredWidth, + View.MeasureSpec.AT_MOST + ), View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED) + ) + val end = holder.itemView.measuredHeight + val animator = LayoutAnimator.ofHeight(holder.itemView, start, end) + animator!!.addListener(ViewHolderAnimatorListener(holder)) + animator.addListener( + LayoutParamsAnimatorListener( + holder.itemView, + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.WRAP_CONTENT + ) + ) + return animator + } + + class ViewHolderAnimatorListener(private val _holder: RecyclerView.ViewHolder) : + AnimatorListenerAdapter() { + override fun onAnimationStart(animation: Animator) { + _holder.setIsRecyclable(false) + } + + override fun onAnimationEnd(animation: Animator) { + _holder.setIsRecyclable(true) + } + + override fun onAnimationCancel(animation: Animator) { + _holder.setIsRecyclable(true) + } + } + + class LayoutParamsAnimatorListener( + private val _view: View, + private val _paramsWidth: Int, + private val _paramsHeight: Int + ) : AnimatorListenerAdapter() { + override fun onAnimationEnd(animation: Animator) { + val params = _view.layoutParams + params.width = _paramsWidth + params.height = _paramsHeight + _view.layoutParams = params + } + } +} \ No newline at end of file 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 7be5686c..f0b50afc 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 @@ -6,8 +6,10 @@ import com.navinfo.omqs.R import com.navinfo.omqs.bean.RoadNameBean import com.navinfo.omqs.bean.SignBean import com.navinfo.omqs.ui.activity.map.LaneInfoItem -import com.navinfo.omqs.ui.fragment.signMoreInfo.ElectronicEyeMoreInfoAdapterItem +import com.navinfo.omqs.ui.fragment.signMoreInfo.LaneBoundaryItem +import com.navinfo.omqs.ui.fragment.signMoreInfo.TwoItemAdapterItem import org.json.JSONArray +import org.json.JSONObject import java.lang.reflect.Field class SignUtil { @@ -104,6 +106,96 @@ class SignUtil { } } + /** + * 获取车道边界类型详细信息 + */ + + fun getLaneBoundaryTypeInfo(renderEntity: RenderEntity): List { + val list = mutableListOf() + list.add(LaneBoundaryItem("车道边界线ID", "${renderEntity.properties["featurePid"]}", null)) + val type = renderEntity.properties["boundaryType"] + if (type != null) { + val typeStr = when (type.toInt()) { + 0 -> "不应用" + 1 -> "无标线无可区分边界" + 2 -> "标线" + 3 -> "路牙" + 4 -> "护栏" + 5 -> "墙" + 6 -> "铺设路面边缘" + 7 -> "虚拟三角岛" + 8 -> "障碍物" + 9 -> "杆状障碍物" + else -> "" + } + list.add(LaneBoundaryItem("边界类型", typeStr, null)) + } + try { + val shapeList = renderEntity.properties["shapeList"] + if (shapeList != null && shapeList != "" && shapeList != "null") { + val itemList = mutableListOf() + val jsonArray = JSONArray(shapeList) + for (i in 0 until jsonArray.length()) { + val arrayObject: JSONObject = jsonArray[i] as JSONObject + var markType = when (arrayObject.getInt("markType")) { + 0 -> "其他" + 1 -> "实线" + 2 -> "虚线" + 4 -> "Gore(导流区边线)" + 5 -> "铺设路面边缘(标线)" + 6 -> "菱形减速标线" + 7 -> "可变导向标线" + 8 -> "短粗虚线" + else -> "" + } + itemList.add(TwoItemAdapterItem("车道标线类型", markType)) + + val markColor = when (arrayObject.getInt("markColor")) { + 0 -> "不应用" + 1 -> "白色" + 2 -> "黄色" + 6 -> "蓝色" + 7 -> "绿色" + 9 -> "其他" + else -> "" + } + itemList.add(TwoItemAdapterItem("车道标线颜色", markColor)) + itemList.add( + TwoItemAdapterItem( + "车道标线宽度(mm)", + "${arrayObject.getInt("markWidth")}" + ) + ) + + val markMaterial = when (arrayObject.getInt("markMaterial")) { + 0 -> "不应用" + 1 -> "油漆" + 2 -> "突起" + 3 -> "油漆和突起" + else -> "" + } + itemList.add(TwoItemAdapterItem("车道标线材质", markMaterial)) + itemList.add( + TwoItemAdapterItem( + "横向偏移(mm)", + "${arrayObject.getInt("lateralOffset")}" + ) + ) + list.add( + LaneBoundaryItem( + "车道标线序号${arrayObject.getInt("markSeqNum")}", + null, + itemList + ) + ) + } + } + } catch (e: Exception) { + + } + return list + } + /** * 右下角文字 */ @@ -121,26 +213,26 @@ class SignUtil { /** * 条件点限速更多信息 */ - fun getConditionLimitMoreInfoText(renderEntity: RenderEntity): List { + fun getConditionLimitMoreInfoText(renderEntity: RenderEntity): List { - val list = mutableListOf() + val list = mutableListOf() val maxSpeed = renderEntity.properties["maxSpeed"] if (maxSpeed != null) { list.add( - ElectronicEyeMoreInfoAdapterItem( + TwoItemAdapterItem( title = "最高限速值(km/h)", text = maxSpeed ) ) } list.add( - ElectronicEyeMoreInfoAdapterItem( + TwoItemAdapterItem( title = "限速条件", text = getConditionLimitText(renderEntity) ) ) val carType = renderEntity.properties["vehicleType"] if (carType != "0") { list.add( - ElectronicEyeMoreInfoAdapterItem( + TwoItemAdapterItem( title = "车辆类型", text = getElectronicEyeVehicleType(carType!!.toInt()) ) ) @@ -148,7 +240,7 @@ class SignUtil { val time = renderEntity.properties["validPeriod"] if (time?.isNotEmpty() == true) { list.add( - ElectronicEyeMoreInfoAdapterItem( + TwoItemAdapterItem( title = "时间段", text = time ) ) @@ -241,16 +333,16 @@ class SignUtil { /** * 常规点限速更多信息 */ - fun getSpeedLimitMoreInfoText(renderEntity: RenderEntity): List { + fun getSpeedLimitMoreInfoText(renderEntity: RenderEntity): List { - val list = mutableListOf() + val list = mutableListOf() list.add( - ElectronicEyeMoreInfoAdapterItem( + TwoItemAdapterItem( title = "最高限速值(km/h)", text = getSpeedLimitMaxText(renderEntity) ) ) list.add( - ElectronicEyeMoreInfoAdapterItem( + TwoItemAdapterItem( title = "最低限速值(km/h)", text = getSpeedLimitMinText(renderEntity) ) ) @@ -406,13 +498,6 @@ class SignUtil { return stringBuffer.toString() } - /** - * 获取车道边界线详细信息 - */ - fun getLaneBoundaryInfo(data:RenderEntity){ - - } - /** * 获取道路名列表 */ @@ -466,21 +551,49 @@ class SignUtil { return isMore } + /** + * 可变点限速详细信息 + */ + fun getChangeLimitSpeedInfo(renderEntity: RenderEntity): List { + val list = mutableListOf() + val kindCode = renderEntity.properties["location"] + if (kindCode != null) { + when (kindCode.toInt()) { + 1 -> list.add( + TwoItemAdapterItem( + title = "标牌位置", text = "左" + ) + ) + 2 -> list.add( + TwoItemAdapterItem( + title = "标牌位置", text = "右" + ) + ) + 3 -> list.add( + TwoItemAdapterItem( + title = "标牌位置", text = "上" + ) + ) + } + } + return list + + } /** * 获取电子眼详细信息 */ - fun getElectronicEyeMoreInfo(renderEntity: RenderEntity): List { - val list = mutableListOf() + fun getElectronicEyeMoreInfo(renderEntity: RenderEntity): List { + val list = mutableListOf() val kindCode = renderEntity.properties["kind"]!!.toInt() - val kind = ElectronicEyeMoreInfoAdapterItem( + val kind = TwoItemAdapterItem( title = "电子眼类型", text = getElectronicEyeKindType(kindCode) ) list.add(kind) when (kindCode) { 1, 2, 3, 4, 5, 6, 20, 21 -> { list.add( - ElectronicEyeMoreInfoAdapterItem( + TwoItemAdapterItem( title = "限速值(km/h)", text = renderEntity.properties["speedLimit"].toString() ) @@ -490,23 +603,22 @@ class SignUtil { val carType = renderEntity.properties["vehicleType"] if (carType != null && carType != "0") { list.add( - ElectronicEyeMoreInfoAdapterItem( - title = "车辆类型", - text = getElectronicEyeVehicleType(carType.toInt()) + TwoItemAdapterItem( + title = "车辆类型", text = getElectronicEyeVehicleType(carType.toInt()) ) ) } val time = renderEntity.properties["validPeriod"] if (time?.isNotEmpty() == true) { list.add( - ElectronicEyeMoreInfoAdapterItem( + TwoItemAdapterItem( title = "时间段", text = time ) ) } if (kindCode == 20 || kindCode == 21) { list.add( - ElectronicEyeMoreInfoAdapterItem( + TwoItemAdapterItem( title = "区间测试配对", text = renderEntity.properties["pairEleceyeId"].toString() ) ) diff --git a/app/src/main/res/drawable-v24/baseline_arrow_drop_down_24.xml b/app/src/main/res/drawable-v24/baseline_arrow_drop_down_24.xml new file mode 100644 index 00000000..3dbfedba --- /dev/null +++ b/app/src/main/res/drawable-v24/baseline_arrow_drop_down_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable-v24/baseline_arrow_left_24.xml b/app/src/main/res/drawable-v24/baseline_arrow_left_24.xml new file mode 100644 index 00000000..2f4e0f27 --- /dev/null +++ b/app/src/main/res/drawable-v24/baseline_arrow_left_24.xml @@ -0,0 +1,5 @@ + + + diff --git a/app/src/main/res/drawable-xxhdpi/measuring_tool_angle.png b/app/src/main/res/drawable-xxhdpi/measuring_tool_angle.png new file mode 100644 index 0000000000000000000000000000000000000000..239603b021bdaf44d6b887646a0981600b2ca7f2 GIT binary patch literal 1326 zcmV+}1=0G6P)Px(=t)FDRA@u(mtAZWRTO~Fxp#KEguhbz03?N-DLe@N0A+VYB#I=61dD;rR!cA{ ziN2_bXd=cKst@>}Vhm66Kv1G-W+*fz1`-o#jK%J@Ybd6T#CCVv8iNS(6JWdDx%Ze^ z`hX4F%uZ)5jh*Lv&i%f7&YYWzFvUNd;`}fzFxeHHuE77I0yW#x3lxRE2E_FsadpgG zobXD#^exm#EZj42kTJdsfB?wa*I{VyO&NiZp4!B@|0Kx~0Ki*l;l_?*i`%D!z;b=4 zVveF*mSPx?DIkT|A2)+om2EUc#47ps|sK zdUoz*$leD)1frzE`MUO|MSt8W5UL*xp|td2OMY_h_>zlm5yR zlP(a})2{*2=Lo<6Kv*QTgjqf42Fz)UXa7J={b02sMGO${10W)RJ#j<**e--q7&q%Y z6Nu=k1ajXhAYtRT$Bf`(#Q?3*hn7gNS|mce(@%HO=Q_qtFFt`TAjpCSRfKjZw7!?0J2A>kOW&gP4$$M&Hr^LM3c`T z;TMQ7#4U=RIi?Lb$uS{;wY9&_w#ou$0YS^(S3(?!AJyJ)vhmn8x=y?g`YI@=dP3B`LD@etlNP|FGL}=oEPDI@bc>X#bmvZ|;7PyJ3$RiGr_;HCLT; z3oB%0dC_>6a@$k;hAAcHj>O=^0g;CIHa)|0gi@Et_xvdV*RCk|rH6M=}HtV5=l zL;@85T*zdvZ}`~^e(xpx?OcRwYcI|6U9ZfvwV^d$e#b2o(o^#p(s{e@nf*W!BOi8} z>R#{Ri_7Rpz@E{AFwg`Db+^;YcB@=nKVE5z!zjFZmEO06ODgMZUfOfFRgMHgda9mt zf79s0{3Z$UM7+7W%PYu2c_Q2UmjY+@K7JwL>8_({ThaGGs9`|kQt7wh5jjYr#<;Qg zgHprW`NPrFQ(T#G3Wz|8?5>y*JXDlG{?&x|BO-r*@c@XCn@0SoR{vkX+j}h2$v+#? zdkAor81^^b?UpaxLb}1j82$_aULOVS<+;H6GsowMYxY)fXr>Tpj9B2KsfQN_aD%EraTpgQ-LDLoR k@GxDany!GWWAiZRADAEIKwr#@hX4Qo07*qoM6N<$f^Ua{L;wH) literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/measuring_tool_area.png b/app/src/main/res/drawable-xxhdpi/measuring_tool_area.png new file mode 100644 index 0000000000000000000000000000000000000000..2ced646a6e81a9a66a3af8f65d311074ff85a6d7 GIT binary patch literal 1621 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 N002ovPDHLkV1k}nVs-!k literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/measuring_tool_select_point.png b/app/src/main/res/drawable-xxhdpi/measuring_tool_select_point.png new file mode 100644 index 0000000000000000000000000000000000000000..ba5f1d1cd45df4d3cc706601f13935e5923f72b9 GIT binary patch literal 1548 zcmV+n2J`ueP)Px)#z{m$RA@u(m|JXARTPH*wfC8+Eyzs*A!%u+13^)Vv2~`RF-;TkWOsRk&Y316&%sG3RGt&wK z19NGot;l*kYwi7iXRp2X+M93(7~KI3xC=2@R`Kpi{BKvH>ZRy7A-SHx#~8f7*{Hk# z5clSX^h-Kb%{u9A-Zs9)5n8QBd@ijxB(!2!S2|9RqE`=Y^@IjBgf9?XLf|>K%aw9q`+@A1uKKuf)#Wns`QTGF4=XCRV*r4 zo7QNQok$fHlt94t>n%?TZRn56?gGGIKmnK&4tlm_15!{3zuvkO#4A|YtHN8ni*6;z zA23ZKQNiqJ2S{jOWo@=bw7=fGwmO~(q`(m7QUeh)fay zzaE({-NV+{@k?+TA%cWLyguAe`9^v`U?)F3MKDho&z{wWL3Xxc^7ShSM7HNc zzM^l8DS_uEl$k-TS@|SP!Kb?7qYaaf(lhZAwjx>K+apwBCs(GhJLs`R{ z8n_J&cp}8LC@3I3-twBml4zw zR%-R_8o_+wQXp#PMrTO(i0#(ZWUnS&!(dq#7K9r-Yi>6|jc(3Wz-9tj#MaD%TPEyC zg)kRM;r`HRvRTDDm7>=a*?XD|@A-U%UmuqO;R~3JLTELttb|W@Bi0%+JQa`3GDo=G zm?3~k47derpEeq0ryM_Dz^o_c^~{(b-cq^lMq$3XmKUU}_*-RPb^2@wc@J#sa+6}L zJ7iR@?JYFY^CDLWE2JYN5t$P`H0MZ!H+x`x8)YJWDgrE-@ez)8ak zV_PR4ZYcjfUB_B8$MmzHA3$7kO>kmr8&IYaazWGP@;&*&+yD{%j)d!ZRe{aC_`6LHPdJX{ zl)N2fX(&FSxC2JcJem{1vRZH=>0y+@zT0YnSEkRu_kweFy&U`2;qjUVpj>+ zKsMIr@_2AliLH6r^eg3D;@Kq`s~e4q1DP&0nE-V?DBFZ@Co`v1t#omTeaO}Y27+hL z(!%JzL2shrG)_`*x*+HlNx@Y1bf`|ZT;J}Z_vTP<4<$Iq!` z%If+9z{eNSwJ{w`P6OsL`ORfEqLZM8Tp^Mbh5)531|5;mo@g}6oVT5St=}N3^~fYi zbj??I&PN*{RWZP+&FE=sk{h=OwiTNiHYytb8xVo$`$872RCe-F&v~v?Dz+vZ^e)I3ATdsF zf^&_ns*6l7D!O-P;*l(Ae<|B~rfKWMqq&YXARF76v{Y{^E-xC|X~oVZx>>OGSt#gz zvo`?!z7mPe9WY}=nv2;w9ST;I0l77MX{%dr|3a?uK0VSTT|=vtefjZFgXdtb@q+^5 yvAXC=5?me*dg}WEU_jETuY?cS#x4YaGv+_jrb$fRIq$##0000 + + + + + + + + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 08648202..6d4cda09 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -90,7 +90,7 @@ + + + + + + + + + diff --git a/app/src/main/res/layout/adapter_electronic_eye.xml b/app/src/main/res/layout/adapter_two_item.xml similarity index 90% rename from app/src/main/res/layout/adapter_electronic_eye.xml rename to app/src/main/res/layout/adapter_two_item.xml index ecd17bd3..d6fe4328 100644 --- a/app/src/main/res/layout/adapter_electronic_eye.xml +++ b/app/src/main/res/layout/adapter_two_item.xml @@ -5,7 +5,7 @@ android:layout_height="wrap_content" android:paddingTop="5dp" android:paddingBottom="5dp" - tools:context="com.navinfo.omqs.ui.fragment.signMoreInfo.ElectronicEyeInfoAdapter"> + tools:context="com.navinfo.omqs.ui.fragment.signMoreInfo.TwoItemAdapter"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ 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 78fb98a7..70c0d2af 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 @@ -1,6 +1,5 @@ package com.navinfo.collect.library.data.entity -import com.navinfo.collect.library.system.Constant import com.navinfo.collect.library.utils.GeometryTools import com.navinfo.collect.library.utils.GeometryToolsKt import io.realm.RealmDictionary @@ -8,9 +7,7 @@ import io.realm.RealmObject import io.realm.RealmSet import io.realm.annotations.Ignore import io.realm.annotations.PrimaryKey -import org.locationtech.jts.geom.Coordinate import org.locationtech.jts.geom.Geometry -import org.oscim.core.MercatorProjection import java.util.* /** 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 3fd83edb..8ed6a99d 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 @@ -218,11 +218,11 @@ class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView, traceP labelNiLocationLayer.isEnabled = false } - fun omdbLayersUpdate(){ -// omdbVectorTileLayer + fun omdbLayersClear(){ +// omdbVectorTileLayer. // omdbReferenceTileLayer. - omdbLabelLayer.update() - omdbReferenceLabelLayer.update() + omdbLabelLayer.clearLabels() + omdbReferenceLabelLayer.clearLabels() } } 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 652d9694..4d36963d 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 @@ -1,6 +1,7 @@ package com.navinfo.collect.library.map.source; import android.os.Build; +import android.util.Log; import androidx.annotation.RequiresApi; @@ -29,27 +30,28 @@ public class OMDBReferenceDataSource implements ITileDataSource { @Override public void query(MapTile tile, ITileDataSink mapDataSink) { // 获取tile对应的坐标范围 - if (tile.zoomLevel>=Constant.OMDB_MIN_ZOOM&&tile.zoomLevel<=Constant.OVER_ZOOM) { - int m = Constant.OVER_ZOOM-tile.zoomLevel; - int xStart = (int)tile.tileX<= Constant.OMDB_MIN_ZOOM && tile.zoomLevel <= Constant.OVER_ZOOM) { + int m = Constant.OVER_ZOOM - tile.zoomLevel; + int xStart = (int) tile.tileX << m; + int xEnd = (int) ((tile.tileX + 1) << m); + int yStart = (int) tile.tileY << m; + int yEnd = (int) ((tile.tileY + 1) << m); + Log.e("jingo", Constant.TASK_ID + " " + xStart + " " + xEnd + " " + yStart + " " + yEnd); RealmQuery realmQuery = Realm.getDefaultInstance().where(ReferenceEntity.class) - .rawPredicate("tileX>="+xStart+" and tileX<="+xEnd+" and tileY>="+yStart+" and tileY<="+yEnd); + .rawPredicate("taskId=" + Constant.TASK_ID + " and tileX>=" + xStart + " and tileX<=" + xEnd + " and tileY>=" + yStart + " and tileY<=" + yEnd); // 筛选不显示的数据 - if (Constant.HAD_LAYER_INVISIABLE_ARRAY!=null&&Constant.HAD_LAYER_INVISIABLE_ARRAY.length>0) { + if (Constant.HAD_LAYER_INVISIABLE_ARRAY != null && Constant.HAD_LAYER_INVISIABLE_ARRAY.length > 0) { realmQuery.beginGroup(); - for (String type: Constant.HAD_LAYER_INVISIABLE_ARRAY) { + for (String type : Constant.HAD_LAYER_INVISIABLE_ARRAY) { realmQuery.notEqualTo("table", type); } realmQuery.endGroup(); } List listResult = realmQuery/*.distinct("id")*/.findAll(); if (!listResult.isEmpty()) { - mThreadLocalDecoders.get().decode(tile.zoomLevel,tile, mapDataSink, listResult); + mThreadLocalDecoders.get().decode(tile.zoomLevel, tile, mapDataSink, listResult); } + Log.e("jingo",listResult.size() + "条数据"); mapDataSink.completed(QueryResult.SUCCESS); // Log.d("RealmDBTileDataSource", "tile:"+tile.getBoundingBox().toString()); } else { 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 1a0aea1c..f8825957 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 @@ -38,8 +38,8 @@ public class OMDBTileDataSource implements ITileDataSource { int xEnd = (int) ((tile.tileX + 1) << m); int yStart = (int) tile.tileY << m; int yEnd = (int) ((tile.tileY + 1) << m); - - RealmQuery realmQuery = Realm.getDefaultInstance().where(RenderEntity.class).rawPredicate("tileX>=" + xStart + " and tileX<=" + xEnd + " and tileY>=" + yStart + " and tileY<=" + yEnd); + Log.e("jingo", Constant.TASK_ID + " " + xStart + " " + xEnd + " " + yStart + " " + yEnd); + RealmQuery realmQuery = Realm.getDefaultInstance().where(RenderEntity.class).rawPredicate("taskId=" + Constant.TASK_ID + " and tileX>=" + xStart + " and tileX<=" + xEnd + " and tileY>=" + yStart + " and tileY<=" + yEnd); // 筛选不显示的数据 if (Constant.HAD_LAYER_INVISIABLE_ARRAY != null && Constant.HAD_LAYER_INVISIABLE_ARRAY.length > 0) { realmQuery.beginGroup(); @@ -50,9 +50,10 @@ public class OMDBTileDataSource implements ITileDataSource { } List listResult = realmQuery/*.distinct("id")*/.findAll(); if (!listResult.isEmpty()) { - Log.e("qj","查询数据=="+listResult.size()+"==地图级别"+tile.zoomLevel); - mThreadLocalDecoders.get().decode(tile.zoomLevel,tile, mapDataSink, listResult); + Log.e("qj", "查询数据==" + listResult.size() + "==地图级别" + tile.zoomLevel); + mThreadLocalDecoders.get().decode(tile.zoomLevel, tile, mapDataSink, listResult); } + Log.e("jingo",listResult.size() + "条数据 主"); mapDataSink.completed(QueryResult.SUCCESS); // Log.d("RealmDBTileDataSource", "tile:"+tile.getBoundingBox().toString()); } else { diff --git a/collect-library/src/main/java/com/navinfo/collect/library/map/source/RealmDBTileDataSource.java b/collect-library/src/main/java/com/navinfo/collect/library/map/source/RealmDBTileDataSource.java index 5c91adc8..fe5546b3 100644 --- a/collect-library/src/main/java/com/navinfo/collect/library/map/source/RealmDBTileDataSource.java +++ b/collect-library/src/main/java/com/navinfo/collect/library/map/source/RealmDBTileDataSource.java @@ -41,7 +41,7 @@ public class RealmDBTileDataSource implements ITileDataSource { int yStart = (int)tile.tileY< realmQuery = Realm.getInstance(RealmUtils.getInstance().getRealmConfiguration()).where(GeometryFeatureEntity.class) + RealmQuery realmQuery = Realm.getDefaultInstance().where(GeometryFeatureEntity.class) .rawPredicate("tileX>="+xStart+" and tileX<="+xEnd+" and tileY>="+yStart+" and tileY<="+yEnd); // 筛选不显示的数据 if (Constant.HAD_LAYER_INVISIABLE_ARRAY!=null&&Constant.HAD_LAYER_INVISIABLE_ARRAY.length>0) { 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 a09727ba..d81dbe73 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 @@ -17,10 +17,10 @@ public class Constant { public static String MAP_PATH = Environment.getExternalStorageDirectory() + "/map/"; public static void setVisibleTypeMap(Map visibleTypeMap) { - Map HD_LAYER_VISIABLE_MAP= new HashMap<>(); + Map HD_LAYER_VISIABLE_MAP = new HashMap<>(); // 只记录不显示的类型 - if (visibleTypeMap!=null&&!visibleTypeMap.isEmpty()) { - for (Map.Entry e:visibleTypeMap.entrySet()) { + if (visibleTypeMap != null && !visibleTypeMap.isEmpty()) { + for (Map.Entry e : visibleTypeMap.entrySet()) { if (!e.getValue()) { HD_LAYER_VISIABLE_MAP.put(e.getKey(), e.getValue()); } @@ -28,11 +28,13 @@ public class Constant { } HAD_LAYER_INVISIABLE_ARRAY = HD_LAYER_VISIABLE_MAP.keySet().toArray(new String[HD_LAYER_VISIABLE_MAP.keySet().size()]); } + public static String[] HAD_LAYER_INVISIABLE_ARRAY; public static final int OVER_ZOOM = 21; public static final int MAX_ZOOM = 23; public static final int OMDB_MIN_ZOOM = 16; + public static int TASK_ID = -1; /** * 服务器地址 */