feat: 增加图层管理功能

This commit is contained in:
xiaoyan 2023-05-05 10:58:16 +08:00
parent 7de2a930db
commit d926a147f3
25 changed files with 348 additions and 50 deletions

View File

@ -62,8 +62,6 @@ class Constant {
const val MESSAGE_PAGE_SIZE = 30 //消息列表一页最多数量 const val MESSAGE_PAGE_SIZE = 30 //消息列表一页最多数量
lateinit var realm: Realm
//选择相机默认或者外设 //选择相机默认或者外设
const val SELECT_CAMERA_STATE = "select_camera_state" const val SELECT_CAMERA_STATE = "select_camera_state"
@ -86,6 +84,10 @@ class Constant {
const val OMDB_CONFIG = "omdb.config" const val OMDB_CONFIG = "omdb.config"
const val OTHER_CONFIG = "other.config" const val OTHER_CONFIG = "other.config"
const val LAYER_MANAGER_CONFIG = "LAYER_MANAGER_CONFIG" // 图层管理界面缓存的key const val LAYER_MANAGER_CONFIG = "LAYER_MANAGER_CONFIG" // 图层管理界面缓存的key
val OMDB_LAYER_VISIBLE_LIST: MutableList<String> = mutableListOf() // 记录OMDB数据显示的图层名称列表
const val EVENT_LAYER_MANAGER_CHANGE = "EVENT_LAYER_MANAGER_CHANGE" // 图层管理中的配置修改
} }

View File

@ -9,17 +9,18 @@ import androidx.activity.viewModels
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import androidx.core.view.WindowCompat import androidx.core.view.WindowCompat
import androidx.databinding.DataBindingUtil import androidx.databinding.DataBindingUtil
import androidx.navigation.findNavController import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.LinearLayoutManager
import com.blankj.utilcode.util.ToastUtils
import com.navinfo.collect.library.map.NIMapController import com.navinfo.collect.library.map.NIMapController
import com.navinfo.collect.library.map.handler.NiLocationListener
import com.navinfo.omqs.Constant import com.navinfo.omqs.Constant
import com.navinfo.omqs.R import com.navinfo.omqs.R
import com.navinfo.omqs.bean.ImportConfig
import com.navinfo.omqs.databinding.ActivityMainBinding import com.navinfo.omqs.databinding.ActivityMainBinding
import com.navinfo.omqs.http.offlinemapdownload.OfflineMapDownloadManager import com.navinfo.omqs.http.offlinemapdownload.OfflineMapDownloadManager
import com.navinfo.omqs.ui.activity.BaseActivity import com.navinfo.omqs.ui.activity.BaseActivity
import com.navinfo.omqs.util.FlowEventBus
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.launch
import javax.inject.Inject import javax.inject.Inject
/** /**
@ -88,6 +89,23 @@ class MainActivity : BaseActivity() {
viewModel.liveDataSignList.observe(this) { viewModel.liveDataSignList.observe(this) {
signAdapter.refreshData(it) signAdapter.refreshData(it)
} }
lifecycleScope.launch {
// 初始化地图图层控制接收器
FlowEventBus.subscribe<List<ImportConfig>>(lifecycle, Constant.EVENT_LAYER_MANAGER_CHANGE) {
// 根据获取到的配置信息,筛选未勾选的图层名称
val omdbVisibleList = it.filter { importConfig->
importConfig.tableGroupName == "OMDB数据"
}.first().tables.filter { tableInfo ->
!tableInfo.checked
}.map {
tableInfo -> tableInfo.table
}.toList()
com.navinfo.collect.library.system.Constant.HAD_LAYER_INVISIABLE_ARRAY = omdbVisibleList.toTypedArray()
// 刷新地图
mapController.mMapView.vtmMap.clearMap()
}
}
} }
override fun onStart() { override fun onStart() {

View File

@ -29,15 +29,18 @@ import com.navinfo.collect.library.utils.GeometryTools
import com.navinfo.collect.library.utils.GeometryToolsKt import com.navinfo.collect.library.utils.GeometryToolsKt
import com.navinfo.omqs.Constant import com.navinfo.omqs.Constant
import com.navinfo.omqs.R import com.navinfo.omqs.R
import com.navinfo.omqs.bean.ImportConfig
import com.navinfo.omqs.db.RealmOperateHelper import com.navinfo.omqs.db.RealmOperateHelper
import com.navinfo.omqs.ui.dialog.CommonDialog import com.navinfo.omqs.ui.dialog.CommonDialog
import com.navinfo.omqs.ui.manager.TakePhotoManager import com.navinfo.omqs.ui.manager.TakePhotoManager
import com.navinfo.omqs.util.DateTimeUtil import com.navinfo.omqs.util.DateTimeUtil
import com.navinfo.omqs.util.FlowEventBus
import com.navinfo.omqs.util.SoundMeter import com.navinfo.omqs.util.SoundMeter
import com.navinfo.omqs.util.SpeakMode import com.navinfo.omqs.util.SpeakMode
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import io.realm.RealmSet import io.realm.RealmSet
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.collect
import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import org.oscim.core.GeoPoint import org.oscim.core.GeoPoint
@ -88,7 +91,6 @@ class MainViewModel @Inject constructor(
testPoint = it testPoint = it
} }
} }
} }
private fun initLocation() { private fun initLocation() {

View File

@ -4,13 +4,12 @@ import android.content.Context
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.BaseExpandableListAdapter import android.widget.*
import android.widget.CheckBox
import com.navinfo.omqs.R import com.navinfo.omqs.R
import com.navinfo.omqs.bean.ImportConfig import com.navinfo.omqs.bean.ImportConfig
import com.navinfo.omqs.bean.TableInfo import com.navinfo.omqs.bean.TableInfo
class LayerManagerExpandableListAdapter(private val context: Context, private val parentItems: List<ImportConfig>) : class LayerManagerExpandableListAdapter(private val context: Context, val parentItems: List<ImportConfig>) :
BaseExpandableListAdapter() { BaseExpandableListAdapter() {
override fun getGroupCount(): Int { override fun getGroupCount(): Int {
@ -30,7 +29,6 @@ class LayerManagerExpandableListAdapter(private val context: Context, private va
return parentItems[groupPosition].tables[childPosition] return parentItems[groupPosition].tables[childPosition]
} }
override fun getGroupId(groupPosition: Int): Long = groupPosition.toLong() override fun getGroupId(groupPosition: Int): Long = groupPosition.toLong()
override fun getChildId(groupPosition: Int, childPosition: Int): Long = childPosition.toLong() override fun getChildId(groupPosition: Int, childPosition: Int): Long = childPosition.toLong()
@ -56,14 +54,18 @@ class LayerManagerExpandableListAdapter(private val context: Context, private va
} }
val parentItem = getGroup(groupPosition) as ImportConfig val parentItem = getGroup(groupPosition) as ImportConfig
viewHolder.parentCheckBox.text = parentItem.tableGroupName viewHolder.parentName.text = parentItem.tableGroupName
viewHolder.parentCheckBox.isChecked = parentItem.checked viewHolder.parentCheckBox.isChecked = parentItem.checked
viewHolder.parentCheckBox.setOnCheckedChangeListener { _, isChecked -> viewHolder.parentCheckBox.setOnClickListener {
parentItem.checked = isChecked parentItem.checked = !parentItem.checked
parentItem.tables.forEach { it.checked = isChecked } parentItem.tables.forEach { it.checked = parentItem.checked }
notifyDataSetChanged() notifyDataSetChanged()
} }
if (isExpanded) {
viewHolder.imgGroupIndicator.setImageResource(R.drawable.ic_baseline_keyboard_arrow_down_24)
} else {
viewHolder.imgGroupIndicator.setImageResource(R.drawable.ic_baseline_keyboard_arrow_right_24)
}
return view!! return view!!
} }
@ -87,10 +89,10 @@ class LayerManagerExpandableListAdapter(private val context: Context, private va
} }
val childItem = getChild(groupPosition, childPosition) as TableInfo val childItem = getChild(groupPosition, childPosition) as TableInfo
viewHolder.childCheckBox.text = childItem.name viewHolder.childName.text = childItem.name
viewHolder.childCheckBox.isChecked = childItem.checked viewHolder.childCheckBox.isChecked = childItem.checked
viewHolder.childCheckBox.setOnCheckedChangeListener { _, isChecked -> viewHolder.childCheckBox.setOnClickListener {
childItem.checked = isChecked childItem.checked = !childItem.checked
parentItems[groupPosition].checked = parentItems[groupPosition].tables.all { it.checked } parentItems[groupPosition].checked = parentItems[groupPosition].tables.all { it.checked }
notifyDataSetChanged() notifyDataSetChanged()
} }
@ -102,9 +104,12 @@ class LayerManagerExpandableListAdapter(private val context: Context, private va
internal class ParentViewHolder(view: View) { internal class ParentViewHolder(view: View) {
val parentCheckBox: CheckBox = view.findViewById(R.id.chk_layermanager_parent) val parentCheckBox: CheckBox = view.findViewById(R.id.chk_layermanager_parent)
val parentName: TextView = view.findViewById(R.id.tv_layermanager_parent_name)
val imgGroupIndicator: ImageView = view.findViewById(R.id.img_group_indicator)
} }
internal class ChildViewHolder(view: View) { internal class ChildViewHolder(view: View) {
val childCheckBox: CheckBox = view.findViewById(R.id.chk_layermanager_child) val childCheckBox: CheckBox = view.findViewById(R.id.chk_layermanager_child)
val childName: TextView = view.findViewById(R.id.tv_layermanager_child_name)
} }
} }

View File

@ -1,12 +1,15 @@
package com.navinfo.omqs.ui.fragment.layermanager package com.navinfo.omqs.ui.fragment.layermanager
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.blankj.utilcode.util.FileIOUtils import com.blankj.utilcode.util.FileIOUtils
import com.blankj.utilcode.util.SPStaticUtils import com.blankj.utilcode.util.SPStaticUtils
import com.google.gson.Gson import com.google.gson.Gson
import com.google.gson.reflect.TypeToken import com.google.gson.reflect.TypeToken
import com.navinfo.omqs.Constant import com.navinfo.omqs.Constant
import com.navinfo.omqs.bean.ImportConfig import com.navinfo.omqs.bean.ImportConfig
import com.navinfo.omqs.util.FlowEventBus
import kotlinx.coroutines.launch
import java.io.File import java.io.File
class LayerManagerViewModel(): ViewModel() { class LayerManagerViewModel(): ViewModel() {
@ -16,7 +19,7 @@ class LayerManagerViewModel(): ViewModel() {
fun getLayerConfigList(): List<ImportConfig> { fun getLayerConfigList(): List<ImportConfig> {
// 首先读取Shared文件如果存在则直接返回否则读取config文件 // 首先读取Shared文件如果存在则直接返回否则读取config文件
val importConfigList = with(SPStaticUtils.getString(Constant.LAYER_MANAGER_CONFIG, null)) { val importConfigList: List<ImportConfig>? = SPStaticUtils.getString(Constant.LAYER_MANAGER_CONFIG, null).run {
if (this!=null) { if (this!=null) {
gson.fromJson(this, object : TypeToken<List<ImportConfig>>(){}.type) gson.fromJson(this, object : TypeToken<List<ImportConfig>>(){}.type)
} else { } else {
@ -30,6 +33,14 @@ class LayerManagerViewModel(): ViewModel() {
} }
} }
fun saveLayerConfigList(listData: List<ImportConfig>) {
SPStaticUtils.put(Constant.EVENT_LAYER_MANAGER_CHANGE, gson.toJson(listData))
// 发送新的配置数据
viewModelScope.launch {
FlowEventBus.post(Constant.EVENT_LAYER_MANAGER_CHANGE, listData)
}
}
private fun getLayerConfigListFromAssetsFile(): List<ImportConfig> { private fun getLayerConfigListFromAssetsFile(): List<ImportConfig> {
val resultList = mutableListOf<ImportConfig>() val resultList = mutableListOf<ImportConfig>()
if (omdbConfigFile.exists()) { if (omdbConfigFile.exists()) {

View File

@ -6,11 +6,15 @@ import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.navigation.fragment.findNavController
import com.blankj.utilcode.util.SPStaticUtils
import com.navinfo.omqs.Constant
import com.navinfo.omqs.databinding.FragmentEmptyBinding import com.navinfo.omqs.databinding.FragmentEmptyBinding
import com.navinfo.omqs.databinding.FragmentLayerManagerBinding import com.navinfo.omqs.databinding.FragmentLayerManagerBinding
import com.navinfo.omqs.ui.fragment.BaseFragment
import com.navinfo.omqs.ui.fragment.offlinemap.OfflineMapCityListViewModel import com.navinfo.omqs.ui.fragment.offlinemap.OfflineMapCityListViewModel
class LayermanagerFragment :Fragment(){ class LayermanagerFragment : BaseFragment(){
private var _binding: FragmentLayerManagerBinding? = null private var _binding: FragmentLayerManagerBinding? = null
private val binding get() = _binding!! private val binding get() = _binding!!
@ -28,6 +32,26 @@ class LayermanagerFragment :Fragment(){
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
val adapter = LayerManagerExpandableListAdapter(requireContext(), viewModel.getLayerConfigList()) val adapter = LayerManagerExpandableListAdapter(requireContext(), viewModel.getLayerConfigList())
binding.elvLayerManager.setAdapter(adapter) binding.elvLayerManager.setAdapter(adapter)
// 默认显示第一个父项下的子类
binding.elvLayerManager.expandGroup(0)
binding.elvLayerManager.setGroupIndicator(null)
binding.elvLayerManager.setOnGroupClickListener { expandableListView, view, groupPosition, l ->
if (expandableListView.isGroupExpanded(groupPosition)) {
binding.elvLayerManager.collapseGroup(groupPosition)
} else {
binding.elvLayerManager.expandGroup(groupPosition)
}
}
binding.imgBack.setOnClickListener {
findNavController().navigateUp()
}
binding.tvTitle.text = findNavController().currentDestination?.label
binding.imgConfirm.setOnClickListener { // 用户点击确认,重新设置当前的图层显隐控制
viewModel.saveLayerConfigList(adapter.parentItems)
}
} }
override fun onDestroyView() { override fun onDestroyView() {

View File

@ -0,0 +1,73 @@
package com.navinfo.omqs.util
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.repeatOnLifecycle
import kotlinx.coroutines.flow.MutableSharedFlow
import kotlinx.coroutines.flow.SharedFlow
object FlowEventBus {
private val bus: HashMap<String, MutableSharedFlow<out Any>> = hashMapOf()
private fun <T : Any> with(key: String): MutableSharedFlow<T> {
if (!bus.containsKey(key)) {
val flow = MutableSharedFlow<T>()
bus[key] = flow
}
return bus[key] as MutableSharedFlow<T>
}
/**
* 对外只暴露SharedFlow
* @param action String
* @return SharedFlow<T>
*/
fun <T> getFlow(action: String): SharedFlow<T> {
return with(action)
}
/**
* 挂起函数
* @param action String
* @param data T
*/
suspend fun <T : Any> post(action: String, data: T) {
with<T>(action).emit(data)
}
/**
* 详见tryEmit和emit的区别
* @param action String
* @param data T
* @return Boolean
*/
fun <T : Any> tryPost(action: String, data: T): Boolean {
return with<T>(action).tryEmit(data)
}
/**
* sharedFlow会长久持有所以要加声明周期限定不然会出现内存溢出
* @param lifecycle Lifecycle
* @param action String
* @param block Function1<T, Unit>
*/
suspend fun <T : Any> subscribe(lifecycle: Lifecycle, action: String, block: (T) -> Unit) {
lifecycle.repeatOnLifecycle(Lifecycle.State.CREATED) {
with<T>(action).collect {
block(it)
}
}
}
/**
* 注意使用这个方法需要将协程在合适的时候取消否则会导致内存溢出
* @param action String
* @param block Function1<T, Unit>
*/
suspend fun <T : Any> subscribe(action: String, block: (T) -> Unit) {
with<T>(action).collect {
block(it)
}
}
}

View File

@ -1,6 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"> <selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false" android:color="@color/line_gray" /> <item android:state_enabled="false" android:color="@color/line_gray" />
<item android:state_pressed="true" android:color="@color/line_gray" />
<item android:state_selected="true" android:color="@color/line_gray" />
<item android:state_checked="true" android:color="@color/line_gray" />
<item android:color="@color/white" /> <item android:color="@color/white" />
</selector> </selector>

View File

@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#2C2C2C"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M9,16.17L4.83,12l-1.42,1.41L9,19 21,7l-1.41,-1.41z"/>
</vector>

View File

@ -0,0 +1,5 @@
<vector android:height="24dp" android:tint="#2C2C2C"
android:viewportHeight="24" android:viewportWidth="24"
android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M7.41,8.59L12,13.17l4.59,-4.58L18,10l-6,6 -6,-6 1.41,-1.41z"/>
</vector>

View File

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:tint="#2C2C2C" android:viewportHeight="24"
android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M15.41,16.59L10.83,12l4.58,-4.59L14,6l-6,6 6,6 1.41,-1.41z"/>
</vector>

View File

@ -0,0 +1,5 @@
<vector android:autoMirrored="true" android:height="24dp"
android:tint="#2C2C2C" android:viewportHeight="24"
android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android">
<path android:fillColor="@android:color/white" android:pathData="M8.59,16.59L13.17,12 8.59,7.41 10,6l6,6 -6,6 -1.41,-1.41z"/>
</vector>

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="false" android:drawable="@drawable/shape_round_btn_press"></item>
<item android:state_checked="true" android:drawable="@drawable/shape_round_btn_press"/>
<item android:state_pressed="true" android:drawable="@drawable/shape_round_btn_press"/>
<item android:state_selected="true" android:drawable="@drawable/shape_round_btn_press"></item>
<item android:drawable="@drawable/shape_round_btn_normal"/>
</selector>

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_expanded="true"
android:drawable="@drawable/ic_baseline_keyboard_arrow_down_24"/>
<item android:drawable="@drawable/ic_baseline_keyboard_arrow_right_24"/>
</selector>

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<corners android:radius="@dimen/default_widget_padding"></corners>
<padding
android:bottom="@dimen/nimap_defalut_padding"
android:left="@dimen/nimap_defalut_padding"
android:right="@dimen/nimap_defalut_padding"
android:top="@dimen/nimap_defalut_padding"></padding>
<solid android:color="@color/colorSurface"></solid>
</shape>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="@color/colorSurface" />
</shape>

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval">
<solid android:color="@color/colorOnSurface" />
</shape>

View File

@ -1,12 +1,64 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:background="@color/bg_left_pannel"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:id="@+id/title_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
style="@style/left_pannel_title_layout">
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/img_back"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
tools:context=".ui.fragment.empty.EmptyFragment"> app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="5dp"
app:layout_constraintBottom_toBottomOf="parent"
android:background="@drawable/selector_bg_round_button"
android:foreground="@drawable/ripple_btn_press"
style="@style/btn_round"
android:src="@drawable/ic_baseline_keyboard_arrow_left_24"></androidx.appcompat.widget.AppCompatImageView>
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="@dimen/left_pannel_title_font"
android:textStyle="bold"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"></androidx.appcompat.widget.AppCompatTextView>
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/img_confirm"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:layout_marginTop="5dp"
app:layout_constraintBottom_toBottomOf="parent"
android:background="@drawable/selector_bg_round_button"
android:foreground="@drawable/ripple_btn_press"
style="@style/btn_round"
android:src="@drawable/ic_baseline_check_24"></androidx.appcompat.widget.AppCompatImageView>
</androidx.constraintlayout.widget.ConstraintLayout>
<androidx.cardview.widget.CardView
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_constraintTop_toBottomOf="@id/title_layout"
style="@style/default_card_view">
<ExpandableListView <ExpandableListView
android:id="@+id/elv_layer_manager" android:id="@+id/elv_layer_manager"
android:divider="@android:drawable/divider_horizontal_dim_dark"
android:dividerHeight="0.1dp"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"/> android:layout_height="match_parent"/>
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.cardview.widget.CardView>
</LinearLayout>

View File

@ -1,10 +1,21 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:paddingLeft="@dimen/default_widget_padding"
android:gravity="center_vertical"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="wrap_content">
<androidx.appcompat.widget.AppCompatCheckBox
<CheckBox
android:id="@+id/chk_layermanager_child" android:id="@+id/chk_layermanager_child"
android:layout_width="match_parent" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:checked="true"></androidx.appcompat.widget.AppCompatCheckBox> android:paddingVertical="0dp"
android:paddingHorizontal="@dimen/default_widget_padding"
android:checked="true"></CheckBox>
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_layermanager_child_name"
android:textSize="@dimen/default_font_size"
android:layout_width="wrap_content"
android:layout_height="wrap_content"></androidx.appcompat.widget.AppCompatTextView>
</LinearLayout> </LinearLayout>

View File

@ -1,11 +1,32 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.appcompat.widget.AppCompatCheckBox
android:id="@+id/chk_layermanager_parent"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:textStyle="bold" android:orientation="horizontal">
<androidx.appcompat.widget.AppCompatCheckBox
android:id="@+id/chk_layermanager_parent"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:focusable="false"
android:focusableInTouchMode="false"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true"
android:checked="true"></androidx.appcompat.widget.AppCompatCheckBox> android:checked="true"></androidx.appcompat.widget.AppCompatCheckBox>
</LinearLayout> <androidx.appcompat.widget.AppCompatImageView
android:id="@+id/img_group_indicator"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_centerVertical="true"
android:src="@drawable/selector_img_expand"></androidx.appcompat.widget.AppCompatImageView>
<androidx.appcompat.widget.AppCompatTextView
android:id="@+id/tv_layermanager_parent_name"
android:textStyle="bold"
android:textSize="@dimen/default_font_size"
android:layout_width="match_parent"
android:layout_toLeftOf="@id/img_group_indicator"
android:layout_toRightOf="@id/chk_layermanager_parent"
android:layout_centerVertical="true"
android:layout_height="wrap_content"></androidx.appcompat.widget.AppCompatTextView>
</RelativeLayout>

View File

@ -2,11 +2,12 @@
<resources> <resources>
<color name="transp">#00000000</color> <color name="transp">#00000000</color>
<color name="line_gray" comment="轻度灰色,一般用于下划线,不可点击按钮的边框">#dadade</color> <color name="line_gray" comment="轻度灰色,一般用于下划线,不可点击按钮的边框">#dadade</color>
<color name="bg_left_pannel" comment="左侧弹出框背景颜色">#f4f4fc</color>
<color name="colorPrimary">#6c14c4</color> <color name="colorPrimary">#6c14c4</color>
<color name="colorSecondary">#4c54ec</color> <color name="colorSecondary">#4c54ec</color>
<color name="colorAccent">#c42cd4</color> <color name="colorAccent">#c42cd4</color>
<color name="colorSurface">#FFFFFF</color> <color name="colorSurface">#FFFFFF</color>
<color name="colorOnSurface">#4263EB</color> <color name="colorOnSurface">#3c3c44</color>
<color name="colorPrimarySurface">#aa342c4c</color> <color name="colorPrimarySurface">#aa342c4c</color>
<color name="colorOnPrimarySurface">#FFFFFF</color> <color name="colorOnPrimarySurface">#FFFFFF</color>
<color name="colorError">#e74c3c</color> <color name="colorError">#e74c3c</color>

View File

@ -6,6 +6,7 @@
<dimen name="nav_header_vertical_spacing">8dp</dimen> <dimen name="nav_header_vertical_spacing">8dp</dimen>
<dimen name="nav_header_height">176dp</dimen> <dimen name="nav_header_height">176dp</dimen>
<dimen name="default_widget_padding">10dp</dimen> <dimen name="default_widget_padding">10dp</dimen>
<dimen name="left_pannel_title_font" comment="左侧弹出框顶部标题字体大小">22sp</dimen>
<dimen name="default_font_size" comment="默认字体大小style中父最顶层">15sp</dimen> <dimen name="default_font_size" comment="默认字体大小style中父最顶层">15sp</dimen>
<dimen name="card_title_font_2size">13sp</dimen> <dimen name="card_title_font_2size">13sp</dimen>
<dimen name="card_title_font_3size">10sp</dimen> <dimen name="card_title_font_3size">10sp</dimen>

View File

@ -76,7 +76,7 @@
</style> </style>
<style name="btn_gradient_color" parent="TextAppearance.AppCompat.Button"> <style name="btn_gradient_color" parent="TextAppearance.AppCompat.Button">
<item name="android:textColor">@color/btn_select_color</item> <item name="android:textColor">@color/selector_default_text_color_white_enable_gray</item>
<item name="android:background">@drawable/selector_bg_default_button</item> <item name="android:background">@drawable/selector_bg_default_button</item>
<item name="android:clickable">true</item> <item name="android:clickable">true</item>
<item name="android:focusable">true</item> <item name="android:focusable">true</item>
@ -102,4 +102,23 @@
<item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowBackground">@android:color/transparent</item>
<item name="android:windowNoTitle">true</item> <item name="android:windowNoTitle">true</item>
</style> </style>
<!-- 左侧弹出框顶部标题栏样式 -->
<style name="left_pannel_title_layout" parent="TextAppearance.AppCompat">
<item name="android:textSize">@dimen/left_pannel_title_font</item>
<item name="android:textColor">@color/black</item>
<item name="android:paddingHorizontal">@dimen/default_widget_padding</item>
</style>
<!--圆形按钮的样式-->
<style name="btn_round">
<item name="background">@drawable/selector_bg_round_button</item>
<item name="android:padding">@dimen/default_widget_padding</item>
</style>
<style name="default_card_view" parent="@style/CardView">
<item name="background">@drawable/shape_card_bg_default</item>
<item name="android:layout_margin">@dimen/default_widget_padding</item>
<item name="cardCornerRadius">@dimen/default_widget_padding</item>
</style>
</resources> </resources>

View File

@ -47,6 +47,8 @@ class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView,tracePa
private lateinit var omdbVectorTileLayer: VectorTileLayer private lateinit var omdbVectorTileLayer: VectorTileLayer
private lateinit var omdbLabelLayer: LabelLayer private lateinit var omdbLabelLayer: LabelLayer
private val omdbTileSource by lazy { OMDBTileSource() }
init { init {
initMap() initMap()
} }
@ -97,7 +99,6 @@ class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView,tracePa
} }
private fun initOMDBVectorTileLayer() { private fun initOMDBVectorTileLayer() {
val omdbTileSource: OMDBTileSource = OMDBTileSource()
omdbVectorTileLayer = VectorTileLayer(mMapView.vtmMap, omdbTileSource) omdbVectorTileLayer = VectorTileLayer(mMapView.vtmMap, omdbTileSource)
omdbLabelLayer = LabelLayer(mMapView.vtmMap, omdbVectorTileLayer, LabelTileLoaderHook(), Constant.OMDB_MIN_ZOOM) omdbLabelLayer = LabelLayer(mMapView.vtmMap, omdbVectorTileLayer, LabelTileLoaderHook(), Constant.OMDB_MIN_ZOOM)
if(omdbVectorTileLayer!=null){ if(omdbVectorTileLayer!=null){

View File

@ -41,14 +41,14 @@ public class OMDBTileDataSource implements ITileDataSource {
RealmQuery<RenderEntity> realmQuery = Realm.getDefaultInstance().where(RenderEntity.class) RealmQuery<RenderEntity> realmQuery = Realm.getDefaultInstance().where(RenderEntity.class)
.rawPredicate("tileX>="+xStart+" and tileX<="+xEnd+" and tileY>="+yStart+" and tileY<="+yEnd); .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) { if (Constant.HAD_LAYER_INVISIABLE_ARRAY!=null&&Constant.HAD_LAYER_INVISIABLE_ARRAY.length>0) {
// realmQuery.beginGroup(); realmQuery.beginGroup();
// for (String type: Constant.HAD_LAYER_INVISIABLE_ARRAY) { for (String type: Constant.HAD_LAYER_INVISIABLE_ARRAY) {
// realmQuery.notEqualTo("name", type); realmQuery.notEqualTo("table", type);
// } }
// realmQuery.endGroup(); realmQuery.endGroup();
// } }
List<RenderEntity> listResult = realmQuery/*.distinct("id")*/.findAll(); List<RenderEntity> listResult = realmQuery/*.distinct("id")*/.findAll();
if (!listResult.isEmpty()) { if (!listResult.isEmpty()) {
mThreadLocalDecoders.get().decode(tile, mapDataSink, listResult); mThreadLocalDecoders.get().decode(tile, mapDataSink, listResult);