From d926a147f340ab0756b28f8b660a5bbefa78de8a Mon Sep 17 00:00:00 2001 From: xiaoyan <xiaoyan159@163.com> Date: Fri, 5 May 2023 10:58:16 +0800 Subject: [PATCH 1/2] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E5=9B=BE?= =?UTF-8?q?=E5=B1=82=E7=AE=A1=E7=90=86=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 | 6 +- .../omqs/ui/activity/map/MainActivity.kt | 24 +++++- .../omqs/ui/activity/map/MainViewModel.kt | 4 +- .../LayerManagerExpandableListAdapter.kt | 29 +++++--- .../layermanager/LayerManagerViewModel.kt | 13 +++- .../layermanager/LayermanagerFragment.kt | 26 ++++++- .../com/navinfo/omqs/util/FlowEventBus.kt | 73 +++++++++++++++++++ ...r_default_text_color_white_enable_gray.xml | 4 +- .../res/drawable/ic_baseline_check_24.xml | 5 ++ .../ic_baseline_keyboard_arrow_down_24.xml | 5 ++ .../ic_baseline_keyboard_arrow_left_24.xml | 5 ++ .../ic_baseline_keyboard_arrow_right_24.xml | 5 ++ .../res/drawable/selector_bg_round_button.xml | 8 ++ .../main/res/drawable/selector_img_expand.xml | 6 ++ .../res/drawable/shape_card_bg_default.xml | 11 +++ .../res/drawable/shape_round_btn_normal.xml | 5 ++ .../res/drawable/shape_round_btn_press.xml | 5 ++ .../res/layout/fragment_layer_manager.xml | 70 +++++++++++++++--- .../layout/layer_manager_checked_child.xml | 19 ++++- .../layout/layer_manager_checked_parent.xml | 31 ++++++-- app/src/main/res/values/colors.xml | 3 +- app/src/main/res/values/dimens.xml | 1 + app/src/main/res/values/styles.xml | 21 +++++- .../map/handler/LayerManagerHandler.kt | 3 +- .../map/source/OMDBTileDataSource.java | 16 ++-- 25 files changed, 348 insertions(+), 50 deletions(-) create mode 100644 app/src/main/java/com/navinfo/omqs/util/FlowEventBus.kt create mode 100644 app/src/main/res/drawable/ic_baseline_check_24.xml create mode 100644 app/src/main/res/drawable/ic_baseline_keyboard_arrow_down_24.xml create mode 100644 app/src/main/res/drawable/ic_baseline_keyboard_arrow_left_24.xml create mode 100644 app/src/main/res/drawable/ic_baseline_keyboard_arrow_right_24.xml create mode 100644 app/src/main/res/drawable/selector_bg_round_button.xml create mode 100644 app/src/main/res/drawable/selector_img_expand.xml create mode 100644 app/src/main/res/drawable/shape_card_bg_default.xml create mode 100644 app/src/main/res/drawable/shape_round_btn_normal.xml create mode 100644 app/src/main/res/drawable/shape_round_btn_press.xml diff --git a/app/src/main/java/com/navinfo/omqs/Constant.kt b/app/src/main/java/com/navinfo/omqs/Constant.kt index b3bd4539..0df2e6d9 100644 --- a/app/src/main/java/com/navinfo/omqs/Constant.kt +++ b/app/src/main/java/com/navinfo/omqs/Constant.kt @@ -62,8 +62,6 @@ class Constant { const val MESSAGE_PAGE_SIZE = 30 //消息列表一页最多数量 - lateinit var realm: Realm - //选择相机默认或者外设 const val SELECT_CAMERA_STATE = "select_camera_state" @@ -86,6 +84,10 @@ class Constant { const val OMDB_CONFIG = "omdb.config" const val OTHER_CONFIG = "other.config" 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" // 图层管理中的配置修改 } 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 620a0ece..73e3ec2b 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 @@ -9,17 +9,18 @@ import androidx.activity.viewModels import androidx.annotation.RequiresApi import androidx.core.view.WindowCompat import androidx.databinding.DataBindingUtil -import androidx.navigation.findNavController +import androidx.lifecycle.lifecycleScope import androidx.recyclerview.widget.LinearLayoutManager -import com.blankj.utilcode.util.ToastUtils import com.navinfo.collect.library.map.NIMapController -import com.navinfo.collect.library.map.handler.NiLocationListener import com.navinfo.omqs.Constant import com.navinfo.omqs.R +import com.navinfo.omqs.bean.ImportConfig import com.navinfo.omqs.databinding.ActivityMainBinding import com.navinfo.omqs.http.offlinemapdownload.OfflineMapDownloadManager import com.navinfo.omqs.ui.activity.BaseActivity +import com.navinfo.omqs.util.FlowEventBus import dagger.hilt.android.AndroidEntryPoint +import kotlinx.coroutines.launch import javax.inject.Inject /** @@ -88,6 +89,23 @@ class MainActivity : BaseActivity() { viewModel.liveDataSignList.observe(this) { 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() { 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 39a9f952..21201bf5 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 @@ -29,15 +29,18 @@ import com.navinfo.collect.library.utils.GeometryTools 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.db.RealmOperateHelper import com.navinfo.omqs.ui.dialog.CommonDialog import com.navinfo.omqs.ui.manager.TakePhotoManager import com.navinfo.omqs.util.DateTimeUtil +import com.navinfo.omqs.util.FlowEventBus import com.navinfo.omqs.util.SoundMeter import com.navinfo.omqs.util.SpeakMode import dagger.hilt.android.lifecycle.HiltViewModel import io.realm.RealmSet import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.flow.collect import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.launch import org.oscim.core.GeoPoint @@ -88,7 +91,6 @@ class MainViewModel @Inject constructor( testPoint = it } } - } private fun initLocation() { diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/layermanager/LayerManagerExpandableListAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/layermanager/LayerManagerExpandableListAdapter.kt index aeacc1b4..9e6c267a 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/layermanager/LayerManagerExpandableListAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/layermanager/LayerManagerExpandableListAdapter.kt @@ -4,13 +4,12 @@ import android.content.Context import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import android.widget.BaseExpandableListAdapter -import android.widget.CheckBox +import android.widget.* import com.navinfo.omqs.R import com.navinfo.omqs.bean.ImportConfig 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() { override fun getGroupCount(): Int { @@ -30,7 +29,6 @@ class LayerManagerExpandableListAdapter(private val context: Context, private va return parentItems[groupPosition].tables[childPosition] } - override fun getGroupId(groupPosition: Int): Long = groupPosition.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 - viewHolder.parentCheckBox.text = parentItem.tableGroupName + viewHolder.parentName.text = parentItem.tableGroupName viewHolder.parentCheckBox.isChecked = parentItem.checked - viewHolder.parentCheckBox.setOnCheckedChangeListener { _, isChecked -> - parentItem.checked = isChecked - parentItem.tables.forEach { it.checked = isChecked } + viewHolder.parentCheckBox.setOnClickListener { + parentItem.checked = !parentItem.checked + parentItem.tables.forEach { it.checked = parentItem.checked } 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!! } @@ -87,10 +89,10 @@ class LayerManagerExpandableListAdapter(private val context: Context, private va } val childItem = getChild(groupPosition, childPosition) as TableInfo - viewHolder.childCheckBox.text = childItem.name + viewHolder.childName.text = childItem.name viewHolder.childCheckBox.isChecked = childItem.checked - viewHolder.childCheckBox.setOnCheckedChangeListener { _, isChecked -> - childItem.checked = isChecked + viewHolder.childCheckBox.setOnClickListener { + childItem.checked = !childItem.checked parentItems[groupPosition].checked = parentItems[groupPosition].tables.all { it.checked } notifyDataSetChanged() } @@ -102,9 +104,12 @@ class LayerManagerExpandableListAdapter(private val context: Context, private va internal class ParentViewHolder(view: View) { 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) { val childCheckBox: CheckBox = view.findViewById(R.id.chk_layermanager_child) + val childName: TextView = view.findViewById(R.id.tv_layermanager_child_name) } } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/layermanager/LayerManagerViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/layermanager/LayerManagerViewModel.kt index c73ccc2e..6f0ae558 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/layermanager/LayerManagerViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/layermanager/LayerManagerViewModel.kt @@ -1,12 +1,15 @@ package com.navinfo.omqs.ui.fragment.layermanager import androidx.lifecycle.ViewModel +import androidx.lifecycle.viewModelScope import com.blankj.utilcode.util.FileIOUtils import com.blankj.utilcode.util.SPStaticUtils import com.google.gson.Gson import com.google.gson.reflect.TypeToken import com.navinfo.omqs.Constant import com.navinfo.omqs.bean.ImportConfig +import com.navinfo.omqs.util.FlowEventBus +import kotlinx.coroutines.launch import java.io.File class LayerManagerViewModel(): ViewModel() { @@ -16,7 +19,7 @@ class LayerManagerViewModel(): ViewModel() { fun getLayerConfigList(): List<ImportConfig> { // 首先读取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) { gson.fromJson(this, object : TypeToken<List<ImportConfig>>(){}.type) } 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> { val resultList = mutableListOf<ImportConfig>() if (omdbConfigFile.exists()) { diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/layermanager/LayermanagerFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/layermanager/LayermanagerFragment.kt index b49e1b39..ba11a236 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/layermanager/LayermanagerFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/layermanager/LayermanagerFragment.kt @@ -6,11 +6,15 @@ import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment 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.FragmentLayerManagerBinding +import com.navinfo.omqs.ui.fragment.BaseFragment import com.navinfo.omqs.ui.fragment.offlinemap.OfflineMapCityListViewModel -class LayermanagerFragment :Fragment(){ +class LayermanagerFragment : BaseFragment(){ private var _binding: FragmentLayerManagerBinding? = null private val binding get() = _binding!! @@ -28,6 +32,26 @@ class LayermanagerFragment :Fragment(){ super.onViewCreated(view, savedInstanceState) val adapter = LayerManagerExpandableListAdapter(requireContext(), viewModel.getLayerConfigList()) 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() { diff --git a/app/src/main/java/com/navinfo/omqs/util/FlowEventBus.kt b/app/src/main/java/com/navinfo/omqs/util/FlowEventBus.kt new file mode 100644 index 00000000..1353aeb9 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/util/FlowEventBus.kt @@ -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) + } + } + +} \ No newline at end of file diff --git a/app/src/main/res/color/selector_default_text_color_white_enable_gray.xml b/app/src/main/res/color/selector_default_text_color_white_enable_gray.xml index 18707d36..f3d0a646 100644 --- a/app/src/main/res/color/selector_default_text_color_white_enable_gray.xml +++ b/app/src/main/res/color/selector_default_text_color_white_enable_gray.xml @@ -1,6 +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: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" /> - </selector> \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_baseline_check_24.xml b/app/src/main/res/drawable/ic_baseline_check_24.xml new file mode 100644 index 00000000..a95c8560 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_check_24.xml @@ -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> diff --git a/app/src/main/res/drawable/ic_baseline_keyboard_arrow_down_24.xml b/app/src/main/res/drawable/ic_baseline_keyboard_arrow_down_24.xml new file mode 100644 index 00000000..000b1a11 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_keyboard_arrow_down_24.xml @@ -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> diff --git a/app/src/main/res/drawable/ic_baseline_keyboard_arrow_left_24.xml b/app/src/main/res/drawable/ic_baseline_keyboard_arrow_left_24.xml new file mode 100644 index 00000000..5b5b57c0 --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_keyboard_arrow_left_24.xml @@ -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> diff --git a/app/src/main/res/drawable/ic_baseline_keyboard_arrow_right_24.xml b/app/src/main/res/drawable/ic_baseline_keyboard_arrow_right_24.xml new file mode 100644 index 00000000..44f9953c --- /dev/null +++ b/app/src/main/res/drawable/ic_baseline_keyboard_arrow_right_24.xml @@ -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> diff --git a/app/src/main/res/drawable/selector_bg_round_button.xml b/app/src/main/res/drawable/selector_bg_round_button.xml new file mode 100644 index 00000000..bb411691 --- /dev/null +++ b/app/src/main/res/drawable/selector_bg_round_button.xml @@ -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> diff --git a/app/src/main/res/drawable/selector_img_expand.xml b/app/src/main/res/drawable/selector_img_expand.xml new file mode 100644 index 00000000..c9788a8f --- /dev/null +++ b/app/src/main/res/drawable/selector_img_expand.xml @@ -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> diff --git a/app/src/main/res/drawable/shape_card_bg_default.xml b/app/src/main/res/drawable/shape_card_bg_default.xml new file mode 100644 index 00000000..8abc0e3e --- /dev/null +++ b/app/src/main/res/drawable/shape_card_bg_default.xml @@ -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> \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_round_btn_normal.xml b/app/src/main/res/drawable/shape_round_btn_normal.xml new file mode 100644 index 00000000..40cff95d --- /dev/null +++ b/app/src/main/res/drawable/shape_round_btn_normal.xml @@ -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> \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_round_btn_press.xml b/app/src/main/res/drawable/shape_round_btn_press.xml new file mode 100644 index 00000000..e11e679f --- /dev/null +++ b/app/src/main/res/drawable/shape_round_btn_press.xml @@ -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> \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_layer_manager.xml b/app/src/main/res/layout/fragment_layer_manager.xml index cd8f3149..44d94c43 100644 --- a/app/src/main/res/layout/fragment_layer_manager.xml +++ b/app/src/main/res/layout/fragment_layer_manager.xml @@ -1,12 +1,64 @@ <?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" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - tools:context=".ui.fragment.empty.EmptyFragment"> - - <ExpandableListView - android:id="@+id/elv_layer_manager" + 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="match_parent"/> -</androidx.constraintlayout.widget.ConstraintLayout> \ No newline at end of file + 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_height="wrap_content" + 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 + 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_height="match_parent"/> + </androidx.cardview.widget.CardView> +</LinearLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/layer_manager_checked_child.xml b/app/src/main/res/layout/layer_manager_checked_child.xml index 99cd89f9..158d2140 100644 --- a/app/src/main/res/layout/layer_manager_checked_child.xml +++ b/app/src/main/res/layout/layer_manager_checked_child.xml @@ -1,10 +1,21 @@ <?xml version="1.0" encoding="utf-8"?> <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_height="match_parent"> - <androidx.appcompat.widget.AppCompatCheckBox + android:layout_height="wrap_content"> + + <CheckBox android:id="@+id/chk_layermanager_child" - android:layout_width="match_parent" + android:layout_width="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> \ No newline at end of file diff --git a/app/src/main/res/layout/layer_manager_checked_parent.xml b/app/src/main/res/layout/layer_manager_checked_parent.xml index 66756e88..2c5c4a52 100644 --- a/app/src/main/res/layout/layer_manager_checked_parent.xml +++ b/app/src/main/res/layout/layer_manager_checked_parent.xml @@ -1,11 +1,32 @@ <?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"> + android:layout_height="wrap_content" + android:orientation="horizontal"> <androidx.appcompat.widget.AppCompatCheckBox android:id="@+id/chk_layermanager_parent" - android:layout_width="match_parent" + android:layout_width="wrap_content" android:layout_height="wrap_content" - android:textStyle="bold" + android:focusable="false" + android:focusableInTouchMode="false" + android:layout_alignParentLeft="true" + android:layout_centerVertical="true" android:checked="true"></androidx.appcompat.widget.AppCompatCheckBox> -</LinearLayout> \ No newline at end of file + <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> \ No newline at end of file diff --git a/app/src/main/res/values/colors.xml b/app/src/main/res/values/colors.xml index 7f540798..7eea917c 100644 --- a/app/src/main/res/values/colors.xml +++ b/app/src/main/res/values/colors.xml @@ -2,11 +2,12 @@ <resources> <color name="transp">#00000000</color> <color name="line_gray" comment="轻度灰色,一般用于下划线,不可点击按钮的边框">#dadade</color> + <color name="bg_left_pannel" comment="左侧弹出框背景颜色">#f4f4fc</color> <color name="colorPrimary">#6c14c4</color> <color name="colorSecondary">#4c54ec</color> <color name="colorAccent">#c42cd4</color> <color name="colorSurface">#FFFFFF</color> - <color name="colorOnSurface">#4263EB</color> + <color name="colorOnSurface">#3c3c44</color> <color name="colorPrimarySurface">#aa342c4c</color> <color name="colorOnPrimarySurface">#FFFFFF</color> <color name="colorError">#e74c3c</color> diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml index 7785420d..4ad74c4a 100644 --- a/app/src/main/res/values/dimens.xml +++ b/app/src/main/res/values/dimens.xml @@ -6,6 +6,7 @@ <dimen name="nav_header_vertical_spacing">8dp</dimen> <dimen name="nav_header_height">176dp</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="card_title_font_2size">13sp</dimen> <dimen name="card_title_font_3size">10sp</dimen> diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index d74b2586..101bdcfd 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -76,7 +76,7 @@ </style> <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:clickable">true</item> <item name="android:focusable">true</item> @@ -102,4 +102,23 @@ <item name="android:windowBackground">@android:color/transparent</item> <item name="android:windowNoTitle">true</item> </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> 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 085a7766..ba22bce1 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 @@ -47,6 +47,8 @@ class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView,tracePa private lateinit var omdbVectorTileLayer: VectorTileLayer private lateinit var omdbLabelLayer: LabelLayer + private val omdbTileSource by lazy { OMDBTileSource() } + init { initMap() } @@ -97,7 +99,6 @@ class LayerManagerHandler(context: AppCompatActivity, mapView: NIMapView,tracePa } private fun initOMDBVectorTileLayer() { - val omdbTileSource: OMDBTileSource = OMDBTileSource() omdbVectorTileLayer = VectorTileLayer(mMapView.vtmMap, omdbTileSource) omdbLabelLayer = LabelLayer(mMapView.vtmMap, omdbVectorTileLayer, LabelTileLoaderHook(), Constant.OMDB_MIN_ZOOM) if(omdbVectorTileLayer!=null){ 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 31f2291a..277c6f3c 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 @@ -41,14 +41,14 @@ public class OMDBTileDataSource implements ITileDataSource { RealmQuery<RenderEntity> realmQuery = Realm.getDefaultInstance().where(RenderEntity.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) { -// realmQuery.beginGroup(); -// for (String type: Constant.HAD_LAYER_INVISIABLE_ARRAY) { -// realmQuery.notEqualTo("name", type); -// } -// realmQuery.endGroup(); -// } + // 筛选不显示的数据 + if (Constant.HAD_LAYER_INVISIABLE_ARRAY!=null&&Constant.HAD_LAYER_INVISIABLE_ARRAY.length>0) { + realmQuery.beginGroup(); + for (String type: Constant.HAD_LAYER_INVISIABLE_ARRAY) { + realmQuery.notEqualTo("table", type); + } + realmQuery.endGroup(); + } List<RenderEntity> listResult = realmQuery/*.distinct("id")*/.findAll(); if (!listResult.isEmpty()) { mThreadLocalDecoders.get().decode(tile, mapDataSink, listResult); From 464ca815c47dfb8d5f78bdeadd7700fff18c72e9 Mon Sep 17 00:00:00 2001 From: xiaoyan <xiaoyan159@163.com> Date: Fri, 5 May 2023 14:12:20 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20=E4=BF=AE=E6=94=B9=E5=9B=BE=E5=B1=82?= =?UTF-8?q?=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/java/com/navinfo/omqs/Constant.kt | 1 - app/src/main/java/com/navinfo/omqs/tools/LayerConfigUtils.kt | 4 ++-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/com/navinfo/omqs/Constant.kt b/app/src/main/java/com/navinfo/omqs/Constant.kt index 0df2e6d9..87db6dfd 100644 --- a/app/src/main/java/com/navinfo/omqs/Constant.kt +++ b/app/src/main/java/com/navinfo/omqs/Constant.kt @@ -83,7 +83,6 @@ class Constant { const val OMDB_CONFIG = "omdb.config" const val OTHER_CONFIG = "other.config" - const val LAYER_MANAGER_CONFIG = "LAYER_MANAGER_CONFIG" // 图层管理界面缓存的key val OMDB_LAYER_VISIBLE_LIST: MutableList<String> = mutableListOf() // 记录OMDB数据显示的图层名称列表 diff --git a/app/src/main/java/com/navinfo/omqs/tools/LayerConfigUtils.kt b/app/src/main/java/com/navinfo/omqs/tools/LayerConfigUtils.kt index 2349f384..41a96486 100644 --- a/app/src/main/java/com/navinfo/omqs/tools/LayerConfigUtils.kt +++ b/app/src/main/java/com/navinfo/omqs/tools/LayerConfigUtils.kt @@ -16,7 +16,7 @@ class LayerConfigUtils { fun getLayerConfigList(): List<ImportConfig> { // 首先读取Shared文件,如果存在则直接返回,否则读取config文件 - return SPStaticUtils.getString(Constant.LAYER_MANAGER_CONFIG, null).let { + return SPStaticUtils.getString(Constant.EVENT_LAYER_MANAGER_CHANGE, null).let { if (this!=null) { val result: List<ImportConfig> = gson.fromJson(it, object : TypeToken<List<ImportConfig>>(){}.type) result @@ -26,7 +26,7 @@ class LayerConfigUtils { } } - fun getLayerConfigListFromAssetsFile(): List<ImportConfig> { + private fun getLayerConfigListFromAssetsFile(): List<ImportConfig> { val resultList = mutableListOf<ImportConfig>() if (omdbConfigFile.exists()) { val omdbConfiStr = FileIOUtils.readFile2String(omdbConfigFile)