From dc6b4b91e5a49176ee8df22cd616fa1bdbf26a7c Mon Sep 17 00:00:00 2001 From: squallzhjch Date: Tue, 23 May 2023 09:48:07 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E8=B0=83=E6=95=B4UI=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E9=81=93=E8=B7=AF=E5=B1=9E=E6=80=A7=E9=9D=A2=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/navinfo/omqs/bean/SignBean.kt | 4 +- .../omqs/ui/activity/map/MainActivity.kt | 41 +++++++++++++-- .../omqs/ui/activity/map/MainViewModel.kt | 52 ++++++++++++------- .../omqs/ui/activity/map/SignAdapter.kt | 5 +- .../omqs/ui/activity/map/TopSignAdapter.kt | 34 ++++++++++++ .../EvaluationResultViewModel.kt | 6 +-- .../fragment/evaluationresult/LeftAdapter.kt | 12 ++++- .../evaluationresult/PhenomenonFragment.kt | 16 +++--- .../evaluationresult/ProblemLinkFragment.kt | 14 ++--- .../RightGroupHeaderAdapter.kt | 2 +- .../com/navinfo/omqs/ui/widget/SignUtil.kt | 11 ++-- .../res/color/selector_white_blue_color.xml | 5 ++ .../selector_adapter_item_select_text.xml | 5 ++ .../res/drawable/shape_middle_fragment_bg.xml | 14 ++--- .../main/res/drawable/shape_oval_blue_bg.xml | 7 +++ app/src/main/res/layout/activity_main.xml | 9 +++- app/src/main/res/layout/adapter_top_sign.xml | 28 ++++++++++ .../main/res/layout/fragment_phenomenon.xml | 23 ++++---- app/src/main/res/layout/text_item_select.xml | 12 ++--- app/src/main/res/layout/text_item_select2.xml | 20 +++++++ app/src/main/res/values-w1024dp/dimens.xml | 2 +- app/src/main/res/values-w600dp/dimens.xml | 2 +- 22 files changed, 242 insertions(+), 82 deletions(-) create mode 100644 app/src/main/java/com/navinfo/omqs/ui/activity/map/TopSignAdapter.kt create mode 100644 app/src/main/res/color/selector_white_blue_color.xml create mode 100644 app/src/main/res/drawable/selector_adapter_item_select_text.xml create mode 100644 app/src/main/res/drawable/shape_oval_blue_bg.xml create mode 100644 app/src/main/res/layout/adapter_top_sign.xml create mode 100644 app/src/main/res/layout/text_item_select2.xml diff --git a/app/src/main/java/com/navinfo/omqs/bean/SignBean.kt b/app/src/main/java/com/navinfo/omqs/bean/SignBean.kt index 597ee5bd..b79dcc55 100644 --- a/app/src/main/java/com/navinfo/omqs/bean/SignBean.kt +++ b/app/src/main/java/com/navinfo/omqs/bean/SignBean.kt @@ -6,7 +6,7 @@ import kotlinx.parcelize.Parcelize @Parcelize data class SignBean( //图标ID - val iconId: Int, + var iconId: Int = 0, //定位点到目标距离 val distance: Int = 0, //图表中的问题 @@ -18,7 +18,7 @@ data class SignBean( //坐标 val geometry: String, //底部文字 - val bottomText: String, + val name: String, //底部右侧文字 val bottomRightText: String, //要素code类型 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 0fcc1677..ccc0e82d 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/MainActivity.kt @@ -12,6 +12,7 @@ import androidx.databinding.DataBindingUtil import androidx.lifecycle.lifecycleScope import androidx.navigation.findNavController import androidx.recyclerview.widget.LinearLayoutManager +import androidx.recyclerview.widget.RecyclerView import com.blankj.utilcode.util.SPStaticUtils import com.google.gson.Gson import com.google.gson.reflect.TypeToken @@ -23,6 +24,7 @@ import com.navinfo.omqs.databinding.ActivityMainBinding import com.navinfo.omqs.http.offlinemapdownload.OfflineMapDownloadManager import com.navinfo.omqs.tools.LayerConfigUtils import com.navinfo.omqs.ui.activity.BaseActivity +import com.navinfo.omqs.ui.widget.RecycleViewDivider import com.navinfo.omqs.util.FlowEventBus import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.launch @@ -52,12 +54,11 @@ class MainActivity : BaseActivity() { findNavController(R.id.main_activity_right_fragment) } + /** + * 提前显示要素看板 + */ private val signAdapter by lazy { SignAdapter { position, signBean -> -// val directions = -// EmptyFragmentDirections.emptyFragmentToEvaluationResultFragment( -// ) -// rightController.navigate(directions) rightController.currentDestination?.let { if (it.id == R.id.EmptyFragment) { val bundle = Bundle() @@ -68,6 +69,22 @@ class MainActivity : BaseActivity() { } } + /** + * 道路信息看板 + */ + private val topSignAdapter by lazy { + TopSignAdapter { position, signBean -> + rightController.currentDestination?.let { + if (it.id == R.id.EmptyFragment) { + val bundle = Bundle() + bundle.putParcelable("SignBean", signBean) + rightController.navigate(R.id.EvaluationResultFragment, bundle) + } + } + } + } + + override fun onCreate(savedInstanceState: Bundle?) { WindowCompat.setDecorFitsSystemWindows(window, false) super.onCreate(savedInstanceState) @@ -125,6 +142,18 @@ class MainActivity : BaseActivity() { } + //道路属性面板 + binding.mainActivityTopSignRecyclerview.layoutManager = LinearLayoutManager( + this, + RecyclerView.HORIZONTAL, false + ) + binding.mainActivityTopSignRecyclerview.addItemDecoration( + RecycleViewDivider(this, LinearLayoutManager.HORIZONTAL) + ) + binding.mainActivityTopSignRecyclerview.adapter = topSignAdapter + + + //提前显示面板 binding.mainActivitySignRecyclerview.layoutManager = LinearLayoutManager(this) binding.mainActivitySignRecyclerview.adapter = signAdapter //增加4dp的间隔 @@ -139,6 +168,10 @@ class MainActivity : BaseActivity() { signAdapter.refreshData(it) } + viewModel.liveDataTopSignList.observe(this) { + topSignAdapter.refreshData(it) + } + lifecycleScope.launch { // 初始化地图图层控制接收器 FlowEventBus.subscribe>( 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 a3722bfd..71d81301 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 @@ -67,9 +67,12 @@ class MainViewModel @Inject constructor( //地图点击捕捉到的质检数据ID列表 val liveDataQsRecordIdList = MutableLiveData>() - //看板数据 + //左侧看板数据 val liveDataSignList = MutableLiveData>() + //顶部看板数据 + val liveDataTopSignList = MutableLiveData>() + // var testPoint = GeoPoint(0, 0) //语音窗体 @@ -150,8 +153,7 @@ class MainViewModel @Inject constructor( // location.latitude = testPoint.latitude val geometry = GeometryTools.createGeometry( GeoPoint( - location.latitude, - location.longitude + location.latitude, location.longitude ) ) val tileX = RealmSet() @@ -176,8 +178,7 @@ class MainViewModel @Inject constructor( mapController.locationLayerHandler.niLocationFlow.collectLatest { location -> // location.longitude = testPoint.longitude // location.latitude = testPoint.latitude - if (!isSelectRoad()) - captureLink(GeoPoint(location.latitude, location.longitude)) + if (!isSelectRoad()) captureLink(GeoPoint(location.latitude, location.longitude)) } } @@ -196,6 +197,8 @@ class MainViewModel @Inject constructor( ) //看板数据 val signList = mutableListOf() + val topSignList = mutableListOf() + if (linkList.isNotEmpty()) { val link = linkList[0] val linkId = link.properties[RenderEntity.Companion.LinkTable.linkPid] @@ -204,27 +207,36 @@ class MainViewModel @Inject constructor( var elementList = realmOperateHelper.queryLinkByLinkPid(it) for (element in elementList) { val distance = GeometryTools.distanceToDouble( - point, - GeometryTools.createGeoPoint(element.geometry) + point, GeometryTools.createGeoPoint(element.geometry) ) - signList.add( - SignBean( - iconId = SignUtil.getSignIcon(element), - iconText = SignUtil.getSignIconText(element), - distance = distance.toInt(), - elementId = element.id, - linkId = linkId, - geometry = element.geometry, - bottomText = SignUtil.getSignBottomText(element), - bottomRightText = SignUtil.getSignBottomRightText(element), - elementCode = element.code + + val signBean = SignBean( + iconId = SignUtil.getSignIcon(element), + iconText = SignUtil.getSignIconText(element), + distance = distance.toInt(), + elementId = element.id, + linkId = linkId, + geometry = element.geometry, + name = SignUtil.getSignNameText(element), + bottomRightText = SignUtil.getSignBottomRightText(element), + elementCode = element.code + ) + + when (element.code) { + 2041, 2008 -> topSignList.add( + signBean ) - ) + else -> signList.add( + signBean + ) + } + } } } - liveDataSignList.postValue(signList) + liveDataTopSignList.postValue(topSignList.distinctBy { it.elementCode }) + liveDataSignList.postValue(signList.distinctBy { it.elementCode }) Log.e("jingo", "自动捕捉数据 共${signList.size}条") } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/SignAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/SignAdapter.kt index 1d8e4778..fb78a41e 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/SignAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/SignAdapter.kt @@ -23,9 +23,10 @@ class SignAdapter(private var itemListener: ((Int, SignBean) -> Unit?)? = null) override fun onBindViewHolder(holder: BaseViewHolder, position: Int) { val bd = holder.viewBinding as AdapterSignBinding val item = data[position] - bd.signMainIcon.background = holder.viewBinding.root.context.getDrawable(item.iconId) + if (item.iconId != 0) + bd.signMainIcon.background = holder.viewBinding.root.context.getDrawable(item.iconId) bd.signMainIcon.text = item.iconText - bd.signBottomText.text = item.bottomText + bd.signBottomText.text = item.name bd.signBottomRightText.text = item.bottomRightText bd.root.setOnClickListener { itemListener?.invoke(position, item) diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/TopSignAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/TopSignAdapter.kt new file mode 100644 index 00000000..b920a5b6 --- /dev/null +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/TopSignAdapter.kt @@ -0,0 +1,34 @@ +package com.navinfo.omqs.ui.activity.map + +import android.view.LayoutInflater +import android.view.ViewGroup +import com.navinfo.omqs.R +import com.navinfo.omqs.bean.SignBean +import com.navinfo.omqs.databinding.AdapterTopSignBinding +import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter +import com.navinfo.omqs.ui.other.BaseViewHolder + +class TopSignAdapter(private var itemListener: ((Int, SignBean) -> Unit?)? = null) : + BaseRecyclerViewAdapter() { + override fun getItemViewRes(position: Int): Int { + return R.layout.adapter_top_sign + } + + override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { + val viewBinding = + AdapterTopSignBinding.inflate(LayoutInflater.from(parent.context), parent, false) + return BaseViewHolder(viewBinding) + } + + override fun onBindViewHolder(holder: BaseViewHolder, position: Int) { + val bd = holder.viewBinding as AdapterTopSignBinding + val item = data[position] + if (item.iconId != 0) + bd.topSignText.background = holder.viewBinding.root.context.getDrawable(item.iconId) + bd.topSignName.text = item.name + bd.topSignText.text = item.iconText + bd.root.setOnClickListener { + itemListener?.invoke(position, item) + } + } +} \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt index 29fd71db..0178fd9c 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt @@ -64,7 +64,7 @@ class EvaluationResultViewModel @Inject constructor( /** * 问题类型 liveData 给[MiddleAdapter]展示的数据 */ - val liveDataMiddleTypeList = MutableLiveData>() +// val liveDataMiddleTypeList = MutableLiveData>() /** * 问题现象 liveData 给[RightGroupHeaderAdapter]展示的数据 @@ -240,7 +240,7 @@ class EvaluationResultViewModel @Inject constructor( Log.e("jingo", "getProblemLinkList ${rightList[0].text}") } liveDataQsRecordBean.postValue(liveDataQsRecordBean.value) - liveDataMiddleTypeList.postValue(middleList) +// liveDataMiddleTypeList.postValue(middleList) liveDataRightTypeList.postValue(rightList) } } @@ -272,7 +272,7 @@ class EvaluationResultViewModel @Inject constructor( liveDataQsRecordBean.value!!.problemType = typeTitleList[0] Log.e("jingo", "getProblemList ${typeTitleList[0]}") } - liveDataMiddleTypeList.postValue(typeTitleList) +// liveDataMiddleTypeList.postValue(typeTitleList) if (liveDataQsRecordBean.value!!.phenomenon.isEmpty()) { liveDataQsRecordBean.value!!.phenomenon = phenomenonRightList[0].text Log.e("jingo", "getProblemList ${phenomenonRightList[0].text}") diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/LeftAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/LeftAdapter.kt index 4b30dd25..0097c56c 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/LeftAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/LeftAdapter.kt @@ -29,10 +29,18 @@ class LeftAdapter(private var itemListener: ((Int, String) -> Unit?)? = null) : val title = data[position] bd.itemId.text = title if (selectTitle == title) { - bd.itemId.setBackgroundResource(R.drawable.shape_rect_white_2dp_bg) + bd.itemLayout.setBackgroundColor( + holder.viewBinding.root.context.getColor( + R.color.button_press_color, + ) + ) bd.itemId.setTextColor(holder.viewBinding.root.context.getColor(R.color.highFontColor)) } else { - bd.itemId.setBackgroundResource(R.drawable.shape_rect_white_2dp_bg) + bd.itemLayout.setBackgroundColor( + holder.viewBinding.root.context.getColor( + R.color.white, + ) + ) bd.itemId.setTextColor(holder.viewBinding.root.context.getColor(R.color.black)) } bd.root.setOnClickListener { diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/PhenomenonFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/PhenomenonFragment.kt index 4958f2e0..4033b1ca 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/PhenomenonFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/PhenomenonFragment.kt @@ -106,15 +106,15 @@ class PhenomenonFragment : }) - //中间菜单 - binding.phenomenonMiddleRecyclerview.setHasFixedSize(true) - binding.phenomenonMiddleRecyclerview.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false) - - binding.phenomenonMiddleRecyclerview.adapter = middleAdapter +// //中间菜单 +// binding.phenomenonMiddleRecyclerview.setHasFixedSize(true) +// binding.phenomenonMiddleRecyclerview.layoutManager = LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, false) +// +// binding.phenomenonMiddleRecyclerview.adapter = middleAdapter //中间侧菜单查询结果监听 - viewModel.liveDataMiddleTypeList.observe(viewLifecycleOwner) { - middleAdapter.refreshData(it) - } +// viewModel.liveDataMiddleTypeList.observe(viewLifecycleOwner) { +// middleAdapter.refreshData(it) +// } // binding.phenomenonDrawer.setOnClickListener { // when (binding.group.visibility) { // View.INVISIBLE, View.GONE -> diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/ProblemLinkFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/ProblemLinkFragment.kt index 0bdc6225..878cb446 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/ProblemLinkFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/ProblemLinkFragment.kt @@ -75,14 +75,14 @@ class ProblemLinkFragment : BaseFragment() { } }) - //中间菜单 - binding.linkMiddleRecyclerview.setHasFixedSize(true) - binding.linkMiddleRecyclerview.layoutManager = LinearLayoutManager(requireContext()) - binding.linkMiddleRecyclerview.adapter = middleAdapter +// //中间菜单 +// binding.linkMiddleRecyclerview.setHasFixedSize(true) +// binding.linkMiddleRecyclerview.layoutManager = LinearLayoutManager(requireContext()) +// binding.linkMiddleRecyclerview.adapter = middleAdapter //中间侧菜单查询结果监听 - viewModel.liveDataMiddleTypeList.observe(viewLifecycleOwner) { - middleAdapter.refreshData(it) - } +// viewModel.liveDataMiddleTypeList.observe(viewLifecycleOwner) { +// middleAdapter.refreshData(it) +// } binding.linkDrawer.setOnClickListener { when (binding.group.visibility) { View.INVISIBLE, View.GONE -> diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/RightGroupHeaderAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/RightGroupHeaderAdapter.kt index d2d77b76..d3b5cc20 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/RightGroupHeaderAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/RightGroupHeaderAdapter.kt @@ -11,7 +11,7 @@ class RightGroupHeaderAdapter(private var itemListener: ((Int, RightBean) -> Uni BaseRecyclerViewAdapter() { private var groupTitleList = mutableListOf() override fun getItemViewRes(position: Int): Int { - return R.layout.text_item_select + return R.layout.text_item_select2 } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { 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 78735c96..b8a60117 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 @@ -7,6 +7,7 @@ import com.navinfo.omqs.R class SignUtil { companion object { + /** * 获取面板上的文字 */ @@ -24,7 +25,7 @@ class SignUtil { } } - fun getSignBottomText(data: RenderEntity): String { + fun getSignNameText(data: RenderEntity): String { return when (data.code) { //可变点限速 4004 -> "可变点限速" @@ -57,7 +58,7 @@ class SignUtil { * 条件点限速文字 */ - fun getConditionLimitText(data: RenderEntity): String { + private fun getConditionLimitText(data: RenderEntity): String { var stringBuffer = StringBuffer() try { val dependent = data.properties["speedDependent"] @@ -121,7 +122,7 @@ class SignUtil { /** * 限速图标 */ - fun getSpeedLimitIcon(data: RenderEntity): Int { + private fun getSpeedLimitIcon(data: RenderEntity): Int { try { //限速标志 0 限速开始 1 限速解除 return when (data.properties["speed_flag"]) { @@ -150,7 +151,7 @@ class SignUtil { 4002, 4003 -> getSpeedLimitIcon(data) //可变点限速 4004 -> R.drawable.icon_change_limit - else -> R.drawable.icon_speed_limit + else -> 0 } } @@ -159,7 +160,7 @@ class SignUtil { /** * 获取种别图标 */ - fun getKindCodeIcon(data: RenderEntity): Int { + private fun getKindCodeIcon(data: RenderEntity): Int { try { val kind = data.properties["kind"] return when (kind!!.toInt()) { diff --git a/app/src/main/res/color/selector_white_blue_color.xml b/app/src/main/res/color/selector_white_blue_color.xml new file mode 100644 index 00000000..ac2e2b4e --- /dev/null +++ b/app/src/main/res/color/selector_white_blue_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_adapter_item_select_text.xml b/app/src/main/res/drawable/selector_adapter_item_select_text.xml new file mode 100644 index 00000000..7efb8886 --- /dev/null +++ b/app/src/main/res/drawable/selector_adapter_item_select_text.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_middle_fragment_bg.xml b/app/src/main/res/drawable/shape_middle_fragment_bg.xml index 593ef0c2..fda3245c 100644 --- a/app/src/main/res/drawable/shape_middle_fragment_bg.xml +++ b/app/src/main/res/drawable/shape_middle_fragment_bg.xml @@ -1,19 +1,19 @@ - - - - - + diff --git a/app/src/main/res/drawable/shape_oval_blue_bg.xml b/app/src/main/res/drawable/shape_oval_blue_bg.xml new file mode 100644 index 00000000..18bb32c4 --- /dev/null +++ b/app/src/main/res/drawable/shape_oval_blue_bg.xml @@ -0,0 +1,7 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index d61ad0ba..661c34b6 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -51,6 +51,13 @@ app:layout_constraintRight_toRightOf="parent" app:layout_constraintTop_toTopOf="parent" /> + diff --git a/app/src/main/res/layout/adapter_top_sign.xml b/app/src/main/res/layout/adapter_top_sign.xml new file mode 100644 index 00000000..8c695162 --- /dev/null +++ b/app/src/main/res/layout/adapter_top_sign.xml @@ -0,0 +1,28 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_phenomenon.xml b/app/src/main/res/layout/fragment_phenomenon.xml index 1f936a86..50b235c1 100644 --- a/app/src/main/res/layout/fragment_phenomenon.xml +++ b/app/src/main/res/layout/fragment_phenomenon.xml @@ -18,31 +18,30 @@ - + + + + + + + + app:layout_constraintTop_toTopOf="parent" /> + app:layout_constraintRight_toRightOf="parent" + app:layout_constraintTop_toTopOf="parent" /> diff --git a/app/src/main/res/layout/text_item_select.xml b/app/src/main/res/layout/text_item_select.xml index 7b161041..d97dd2ef 100644 --- a/app/src/main/res/layout/text_item_select.xml +++ b/app/src/main/res/layout/text_item_select.xml @@ -1,20 +1,20 @@ + android:layout_height="wrap_content" + android:background="@drawable/selector_adapter_item_select_bg"> + android:padding="3dp" + android:drawableLeft="@drawable/selector_task_link_edit_icon" + android:textColor="@color/default_blue_text_color" + android:textSize="14sp"/> - \ No newline at end of file diff --git a/app/src/main/res/layout/text_item_select2.xml b/app/src/main/res/layout/text_item_select2.xml new file mode 100644 index 00000000..50a6339f --- /dev/null +++ b/app/src/main/res/layout/text_item_select2.xml @@ -0,0 +1,20 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-w1024dp/dimens.xml b/app/src/main/res/values-w1024dp/dimens.xml index 56fc8b4e..f7a9ffb0 100644 --- a/app/src/main/res/values-w1024dp/dimens.xml +++ b/app/src/main/res/values-w1024dp/dimens.xml @@ -8,5 +8,5 @@ 256dp 230dp 28dp - + 360dp \ No newline at end of file diff --git a/app/src/main/res/values-w600dp/dimens.xml b/app/src/main/res/values-w600dp/dimens.xml index ad9117b6..d5a61bf1 100644 --- a/app/src/main/res/values-w600dp/dimens.xml +++ b/app/src/main/res/values-w600dp/dimens.xml @@ -1,4 +1,4 @@ 48dp - 310dp + 360dp \ No newline at end of file From d89ad95a177987ce6196cd8869c8ee1fcf014214 Mon Sep 17 00:00:00 2001 From: squallzhjch Date: Tue, 23 May 2023 14:03:36 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E8=B0=83=E6=95=B4UI=20=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E9=81=93=E8=B7=AF=E5=B1=9E=E6=80=A7=E9=9D=A2=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ui/fragment/evaluationresult/LeftAdapter.kt | 16 +--------------- ...e_color.xml => selector_black_blue_color.xml} | 2 +- .../selector_text_drawable_left_white_blue.xml | 15 +++++++++++++++ app/src/main/res/drawable/shape_oval_blue_bg.xml | 7 ------- app/src/main/res/layout/text_item_select.xml | 5 +++-- app/src/main/res/layout/text_item_select2.xml | 6 +++--- 6 files changed, 23 insertions(+), 28 deletions(-) rename app/src/main/res/color/{selector_white_blue_color.xml => selector_black_blue_color.xml} (83%) create mode 100644 app/src/main/res/drawable/selector_text_drawable_left_white_blue.xml delete mode 100644 app/src/main/res/drawable/shape_oval_blue_bg.xml diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/LeftAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/LeftAdapter.kt index 0097c56c..fe16de40 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/LeftAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/LeftAdapter.kt @@ -28,21 +28,7 @@ class LeftAdapter(private var itemListener: ((Int, String) -> Unit?)? = null) : val bd = holder.viewBinding as TextItemSelectBinding val title = data[position] bd.itemId.text = title - if (selectTitle == title) { - bd.itemLayout.setBackgroundColor( - holder.viewBinding.root.context.getColor( - R.color.button_press_color, - ) - ) - bd.itemId.setTextColor(holder.viewBinding.root.context.getColor(R.color.highFontColor)) - } else { - bd.itemLayout.setBackgroundColor( - holder.viewBinding.root.context.getColor( - R.color.white, - ) - ) - bd.itemId.setTextColor(holder.viewBinding.root.context.getColor(R.color.black)) - } + holder.viewBinding.root.isSelected = selectTitle == title bd.root.setOnClickListener { if (selectTitle != title) { selectTitle = title diff --git a/app/src/main/res/color/selector_white_blue_color.xml b/app/src/main/res/color/selector_black_blue_color.xml similarity index 83% rename from app/src/main/res/color/selector_white_blue_color.xml rename to app/src/main/res/color/selector_black_blue_color.xml index ac2e2b4e..aa4e0cf4 100644 --- a/app/src/main/res/color/selector_white_blue_color.xml +++ b/app/src/main/res/color/selector_black_blue_color.xml @@ -1,5 +1,5 @@ - + \ No newline at end of file diff --git a/app/src/main/res/drawable/selector_text_drawable_left_white_blue.xml b/app/src/main/res/drawable/selector_text_drawable_left_white_blue.xml new file mode 100644 index 00000000..dbe0e770 --- /dev/null +++ b/app/src/main/res/drawable/selector_text_drawable_left_white_blue.xml @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_oval_blue_bg.xml b/app/src/main/res/drawable/shape_oval_blue_bg.xml deleted file mode 100644 index 18bb32c4..00000000 --- a/app/src/main/res/drawable/shape_oval_blue_bg.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/text_item_select.xml b/app/src/main/res/layout/text_item_select.xml index d97dd2ef..6cf71afb 100644 --- a/app/src/main/res/layout/text_item_select.xml +++ b/app/src/main/res/layout/text_item_select.xml @@ -12,8 +12,9 @@ android:layout_margin="3dp" android:gravity="center" android:padding="3dp" - android:drawableLeft="@drawable/selector_task_link_edit_icon" - android:textColor="@color/default_blue_text_color" + android:paddingLeft="0dp" + android:drawableLeft="@drawable/selector_text_drawable_left_white_blue" + android:textColor="@color/selector_black_blue_color" android:textSize="14sp"/> diff --git a/app/src/main/res/layout/text_item_select2.xml b/app/src/main/res/layout/text_item_select2.xml index 50a6339f..aeca52f3 100644 --- a/app/src/main/res/layout/text_item_select2.xml +++ b/app/src/main/res/layout/text_item_select2.xml @@ -3,7 +3,7 @@ android:id="@+id/item_layout" android:layout_width="match_parent" android:layout_height="wrap_content" - android:background="@color/white"> + android:background="@drawable/selector_adapter_item_select_bg"> From 4e997b863211ce3a736a20a36fe425255a381e99 Mon Sep 17 00:00:00 2001 From: squallzhjch Date: Wed, 24 May 2023 15:57:52 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E8=B0=83=E6=95=B4UI=20=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E9=81=93=E8=B7=AF=E5=B1=9E=E6=80=A7=E9=9D=A2=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/src/main/assets/omdb_config.json | 69 +++++++++-- .../java/com/navinfo/omqs/bean/SignBean.kt | 2 +- .../omqs/ui/activity/map/MainActivity.kt | 19 ++- .../omqs/ui/activity/map/MainViewModel.kt | 7 +- .../omqs/ui/activity/map/TopSignAdapter.kt | 31 +++++ .../omqs/ui/fragment/empty/EmptyFragment.kt | 26 +++- .../EvaluationResultFragment.kt | 10 +- .../EvaluationResultViewModel.kt | 10 +- .../fragment/evaluationresult/LeftAdapter.kt | 3 +- .../evaluationresult/PhenomenonFragment.kt | 9 ++ .../RightGroupHeaderAdapter.kt | 27 ++++- .../RightGroupHeaderDecoration.kt | 2 +- .../com/navinfo/omqs/ui/widget/SignUtil.kt | 112 +++++++++++++----- .../icon_conditional_speed_limit.png | Bin 0 -> 8679 bytes .../icon_conditional_speed_limit_off.png | Bin 0 -> 9602 bytes .../icon_fragment_switch_off.png | Bin 3046 -> 2099 bytes .../icon_fragment_switch_on.png | Bin 3077 -> 2093 bytes .../drawable-xxhdpi/icon_traffic_light.png | Bin 0 -> 4751 bytes .../drawable/shape_road_info_bottom_bg.xml | 11 ++ .../shape_road_info_left_bottom_bg.xml | 10 ++ .../drawable/shape_road_info_left_top_bg.xml | 10 ++ .../shape_road_info_middle_bottom_bg.xml | 6 + .../shape_road_info_middle_top_bg.xml | 6 + .../shape_road_info_right_bottom_bg.xml | 11 ++ .../drawable/shape_road_info_right_top_bg.xml | 11 ++ .../res/drawable/shape_road_info_top_bg.xml | 11 ++ app/src/main/res/layout/activity_main.xml | 8 +- app/src/main/res/layout/adapter_top_sign.xml | 38 +++++- app/src/main/res/layout/text_item_select.xml | 6 +- app/src/main/res/layout/text_item_select2.xml | 7 +- .../navigation/middle_fragment_nav_graph.xml | 6 +- .../navigation/right_fragment_nav_graph.xml | 28 ++--- 32 files changed, 390 insertions(+), 106 deletions(-) create mode 100644 app/src/main/res/drawable-xxhdpi/icon_conditional_speed_limit.png create mode 100644 app/src/main/res/drawable-xxhdpi/icon_conditional_speed_limit_off.png create mode 100644 app/src/main/res/drawable-xxhdpi/icon_traffic_light.png create mode 100644 app/src/main/res/drawable/shape_road_info_bottom_bg.xml create mode 100644 app/src/main/res/drawable/shape_road_info_left_bottom_bg.xml create mode 100644 app/src/main/res/drawable/shape_road_info_left_top_bg.xml create mode 100644 app/src/main/res/drawable/shape_road_info_middle_bottom_bg.xml create mode 100644 app/src/main/res/drawable/shape_road_info_middle_top_bg.xml create mode 100644 app/src/main/res/drawable/shape_road_info_right_bottom_bg.xml create mode 100644 app/src/main/res/drawable/shape_road_info_right_top_bg.xml create mode 100644 app/src/main/res/drawable/shape_road_info_top_bg.xml diff --git a/app/src/main/assets/omdb_config.json b/app/src/main/assets/omdb_config.json index 411acf54..f4c8a690 100644 --- a/app/src/main/assets/omdb_config.json +++ b/app/src/main/assets/omdb_config.json @@ -5,6 +5,11 @@ "code": 2001, "name": "道路线" }, + "2002": { + "table": "OMDB_RD_LINK_FUNCTION_CLASS", + "code": 2002, + "name": "道路功能等级" + }, "2008": { "table": "OMDB_RD_LINK_KIND", "code": 2008, @@ -15,6 +20,51 @@ "code": 2010, "name": "道路方向" }, + "2019": { + "table": "OMDB_LINK_SPEEDLIMIT", + "code": 2019, + "name": "常规线限速" + }, + "2020": { + "table": "OMDB_LINK_SPEEDLIMIT_COND", + "code": 2020, + "name": "条件线限速" + }, + "2021": { + "table": "OMDB_LINK_SPEEDLIMIT_VAR", + "code": 2021, + "name": "可变线限速" + }, + "2022": { + "table": "OMDB_CON_ACCESS", + "code": 2022, + "name": "全封闭" + }, + "2037": { + "table": "OMDB_FORM_OF_WAY", + "code": 2037, + "name": "匝道" + }, + "2040": { + "table": "OMDB_MULTI_DIGITIZED", + "code": 2040, + "name": "上下线分离" + }, + "2041":{ + "table": "OMDB_LANE_NUM", + "code": 2041, + "name": "车道数" + }, + "2201":{ + "table": "OMDB_BRIDGE", + "code": 2201, + "name": "桥" + }, + "2202":{ + "table": "OMDB_TUNNEL", + "code": 2202, + "name": "隧道" + }, "4002": { "table": "OMDB_SPEEDLIMIT", "code": 4002, @@ -66,23 +116,16 @@ } ] }, + "4006":{ + "table": "OMDB_RESTRICTION", + "code": 4006, + "name": "普通交限" + }, "5001":{ "table": "OMDB_LANE_LINK_LG", "code": 5001, "name": "车道中心线" - }, - "2041":{ - "table": "OMDB_LANE_NUM", - "code": 2041, - "name": "车道数", - "transformer": [ - { - "k": "laneS2e", - "v": "~", - "klib": "left_00", - "vlib": "laneNumLeft00()" - } - ] } + } } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/bean/SignBean.kt b/app/src/main/java/com/navinfo/omqs/bean/SignBean.kt index b79dcc55..c921dde6 100644 --- a/app/src/main/java/com/navinfo/omqs/bean/SignBean.kt +++ b/app/src/main/java/com/navinfo/omqs/bean/SignBean.kt @@ -17,7 +17,7 @@ data class SignBean( val linkId: String, //坐标 val geometry: String, - //底部文字 + //名称 val name: String, //底部右侧文字 val bottomRightText: String, 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 ccc0e82d..8fe8c4f9 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 @@ -60,7 +60,7 @@ class MainActivity : BaseActivity() { private val signAdapter by lazy { SignAdapter { position, signBean -> rightController.currentDestination?.let { - if (it.id == R.id.EmptyFragment) { + if (it.id == R.id.RightEmptyFragment) { val bundle = Bundle() bundle.putParcelable("SignBean", signBean) rightController.navigate(R.id.EvaluationResultFragment, bundle) @@ -75,7 +75,7 @@ class MainActivity : BaseActivity() { private val topSignAdapter by lazy { TopSignAdapter { position, signBean -> rightController.currentDestination?.let { - if (it.id == R.id.EmptyFragment) { + if (it.id == R.id.RightEmptyFragment) { val bundle = Bundle() bundle.putParcelable("SignBean", signBean) rightController.navigate(R.id.EvaluationResultFragment, bundle) @@ -147,9 +147,9 @@ class MainActivity : BaseActivity() { this, RecyclerView.HORIZONTAL, false ) - binding.mainActivityTopSignRecyclerview.addItemDecoration( - RecycleViewDivider(this, LinearLayoutManager.HORIZONTAL) - ) +// binding.mainActivityTopSignRecyclerview.addItemDecoration( +// RecycleViewDivider(this, LinearLayoutManager.HORIZONTAL) +// ) binding.mainActivityTopSignRecyclerview.adapter = topSignAdapter @@ -276,7 +276,7 @@ class MainActivity : BaseActivity() { } /** - * + *展开或收起右侧面板 */ fun onSwitchFragment() { switchFragment = !switchFragment @@ -288,6 +288,13 @@ class MainActivity : BaseActivity() { } } + /** + * 隐藏或显示右侧展开按钮 + */ + fun setRightSwitchButton(visibility: Int) { + binding.mainActivityFragmentSwitch.visibility = visibility + } + /** * 点击录音按钮 */ 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 060f9fe1..141cae55 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 @@ -223,7 +223,7 @@ class MainViewModel @Inject constructor( ) when (element.code) { - 2041, 2008 -> topSignList.add( + 2041, 2008, 2010 -> topSignList.add( signBean ) else -> signList.add( @@ -386,8 +386,7 @@ class MainViewModel @Inject constructor( if (layerConfigList != null && !layerConfigList.isEmpty()) { val omdbVisibleList = layerConfigList.filter { importConfig -> importConfig.tableGroupName == "OMDB数据" - }.first().tableMap.filter { - entry -> + }.first().tableMap.filter { entry -> val tableInfo = entry.value !tableInfo.checked }.map { entry -> @@ -426,7 +425,7 @@ class MainViewModel @Inject constructor( // } // } when (navDestination.id) { - R.id.EmptyFragment -> { + R.id.RightEmptyFragment -> { if (list.size == 1) { val bundle = Bundle() bundle.putString("QsId", list[0]) diff --git a/app/src/main/java/com/navinfo/omqs/ui/activity/map/TopSignAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/activity/map/TopSignAdapter.kt index b920a5b6..0ed1ba72 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/activity/map/TopSignAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/activity/map/TopSignAdapter.kt @@ -1,6 +1,7 @@ package com.navinfo.omqs.ui.activity.map import android.view.LayoutInflater +import android.view.View import android.view.ViewGroup import com.navinfo.omqs.R import com.navinfo.omqs.bean.SignBean @@ -27,6 +28,36 @@ class TopSignAdapter(private var itemListener: ((Int, SignBean) -> Unit?)? = nul bd.topSignText.background = holder.viewBinding.root.context.getDrawable(item.iconId) bd.topSignName.text = item.name bd.topSignText.text = item.iconText + if (data.size == 1) { + bd.topSignLeftLine.visibility = View.GONE + bd.topSignRightLine.visibility = View.GONE + bd.topSignName.background = + holder.viewBinding.root.context.getDrawable(R.drawable.shape_road_info_top_bg) + bd.topSignText.background = + holder.viewBinding.root.context.getDrawable(R.drawable.shape_road_info_bottom_bg) + } else if (position == 0) { + bd.topSignLeftLine.visibility = View.GONE + bd.topSignRightLine.visibility = View.VISIBLE + bd.topSignName.background = + holder.viewBinding.root.context.getDrawable(R.drawable.shape_road_info_left_top_bg) + bd.topSignText.background = + holder.viewBinding.root.context.getDrawable(R.drawable.shape_road_info_left_bottom_bg) + } else if (position == data.size - 1) { + bd.topSignLeftLine.visibility = View.VISIBLE + bd.topSignRightLine.visibility = View.GONE + bd.topSignName.background = + holder.viewBinding.root.context.getDrawable(R.drawable.shape_road_info_right_top_bg) + bd.topSignText.background = + holder.viewBinding.root.context.getDrawable(R.drawable.shape_road_info_right_bottom_bg) + } else { + bd.topSignLeftLine.visibility = View.VISIBLE + bd.topSignRightLine.visibility = View.VISIBLE + bd.topSignName.background = + holder.viewBinding.root.context.getDrawable(R.drawable.shape_road_info_middle_top_bg) + bd.topSignText.background = + holder.viewBinding.root.context.getDrawable(R.drawable.shape_road_info_middle_bottom_bg) + } + bd.root.setOnClickListener { itemListener?.invoke(position, item) } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/empty/EmptyFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/empty/EmptyFragment.kt index 9128a761..68bb7136 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/empty/EmptyFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/empty/EmptyFragment.kt @@ -5,13 +5,17 @@ import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import androidx.fragment.app.Fragment +import androidx.navigation.fragment.findNavController +import com.navinfo.omqs.R import com.navinfo.omqs.databinding.FragmentEmptyBinding +import com.navinfo.omqs.ui.activity.map.MainActivity -class EmptyFragment :Fragment(){ +class EmptyFragment : Fragment() { private var _binding: FragmentEmptyBinding? = null - + private var currentDestinationLabel = "" private val binding get() = _binding!! -// private val viewModel by lazy { viewModels().value} + + // private val viewModel by lazy { viewModels().value} override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? @@ -25,6 +29,22 @@ class EmptyFragment :Fragment(){ super.onViewCreated(view, savedInstanceState) } + override fun onStart() { + super.onStart() + val currentDestination = findNavController().currentDestination + if (currentDestination?.label == "右侧空页面") { + currentDestinationLabel = "右侧空页面" + (activity as MainActivity).setRightSwitchButton(View.GONE) + } + } + + override fun onStop() { + super.onStop() + if (currentDestinationLabel == "右侧空页面") { + (activity as MainActivity).setRightSwitchButton(View.VISIBLE) + } + } + override fun onDestroyView() { super.onDestroyView() _binding = null diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultFragment.kt index 919b088b..4e811b25 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultFragment.kt @@ -103,7 +103,7 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener { * 读取元数据 */ // val id = args.qsId - var id: String = "" + var id = "" var signBean: SignBean? = null var filePath: String = "" arguments?.let { @@ -235,7 +235,7 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener { val controller = findNavController(R.id.main_activity_middle_fragment) controller.currentDestination?.let { //如果之前页面是空fragment,直接打开面板 - if (it.id == R.id.EmptyFragment) { + if (it.id == R.id.MiddleEmptyFragment) { findNavController( R.id.main_activity_middle_fragment ).navigate(R.id.PhenomenonFragment) @@ -258,7 +258,7 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener { val controller = findNavController(R.id.main_activity_middle_fragment) controller.currentDestination?.let { //如果之前页面是空fragment,直接打开面板 - if (it.id == R.id.EmptyFragment) { + if (it.id == R.id.MiddleEmptyFragment) { findNavController( R.id.main_activity_middle_fragment ).navigate(R.id.ProblemLinkFragment) @@ -282,13 +282,13 @@ class EvaluationResultFragment : BaseFragment(), View.OnClickListener { } fun voiceOnTouchStart() { - viewModel!!.startSoundMetter(requireActivity(), binding.evaluationVoice) + viewModel.startSoundMetter(requireActivity(), binding.evaluationVoice) } @RequiresApi(Build.VERSION_CODES.Q) fun voiceOnTouchStop() { if (Constant.IS_VIDEO_SPEED) { - viewModel!!.stopSoundMeter() + viewModel.stopSoundMeter() } } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt index 0178fd9c..01e93419 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/EvaluationResultViewModel.kt @@ -190,19 +190,22 @@ class EvaluationResultViewModel @Inject constructor( list?.let { if (list.isNotEmpty()) { //通知页面更新 + var classType = list[0] liveDataLeftTypeList.postValue(it) - var classType = it[0] if (bean != null) { val classType2 = roomAppDatabase.getScProblemTypeDao() .findClassTypeByCode(bean.elementCode) - if (classType2 != null) + if (classType2 != null) { classType = classType2 + } } //如果右侧栏没数据,给个默认值 if (liveDataQsRecordBean.value!!.classType.isEmpty()) { liveDataQsRecordBean.value!!.classType = classType classTypeTemp = classType + } else { + classType = liveDataQsRecordBean.value!!.classType } getProblemList(classType) } @@ -313,7 +316,7 @@ class EvaluationResultViewModel @Inject constructor( fun saveData() { viewModelScope.launch(Dispatchers.IO) { val realm = Realm.getDefaultInstance() - liveDataQsRecordBean.value!!.checkTime = DateTimeUtil.getDataTime() + liveDataQsRecordBean.value!!.checkTime = DateTimeUtil.getDataTime() realm.executeTransaction { it.copyToRealmOrUpdate(liveDataQsRecordBean.value) } @@ -444,7 +447,6 @@ class EvaluationResultViewModel @Inject constructor( Constant.IS_VIDEO_SPEED = true //录音动画 - //录音动画 if (pop != null) { pop!!.showAtLocation(v, Gravity.CENTER, 0, 0) } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/LeftAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/LeftAdapter.kt index fe16de40..9235fb61 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/LeftAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/LeftAdapter.kt @@ -44,10 +44,9 @@ class LeftAdapter(private var itemListener: ((Int, String) -> Unit?)? = null) : notifyDataSetChanged() } - fun setRightTitle(title: String) { + fun setSelectTitle(title: String) { if (title != selectTitle) { selectTitle = title - notifyDataSetChanged() } } } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/PhenomenonFragment.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/PhenomenonFragment.kt index 4033b1ca..0b5c7206 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/PhenomenonFragment.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/PhenomenonFragment.kt @@ -6,9 +6,12 @@ import android.util.Log import android.view.LayoutInflater import android.view.View import android.view.ViewGroup +import androidx.navigation.findNavController +import androidx.navigation.fragment.findNavController import androidx.recyclerview.widget.LinearLayoutManager import androidx.recyclerview.widget.RecyclerView import androidx.recyclerview.widget.RecyclerView.OnScrollListener +import com.navinfo.omqs.R import com.navinfo.omqs.databinding.FragmentPhenomenonBinding import com.navinfo.omqs.ui.fragment.BaseFragment import com.navinfo.omqs.ui.other.shareViewModels @@ -19,6 +22,7 @@ class PhenomenonFragment : BaseFragment() { private var _binding: FragmentPhenomenonBinding? = null private val binding get() = _binding!! + /** * 和[PhenomenonFragment],[ProblemLinkFragment],[EvaluationResultFragment]共用同一个viewModel */ @@ -50,6 +54,7 @@ class PhenomenonFragment : binding.phenomenonLeftRecyclerview.adapter = leftAdapter //左侧菜单查询结果监听 viewModel.liveDataLeftTypeList.observe(viewLifecycleOwner) { + leftAdapter.setSelectTitle(viewModel.liveDataQsRecordBean.value!!.classType) leftAdapter.refreshData(it) } @@ -63,6 +68,9 @@ class PhenomenonFragment : */ val rightAdapter = RightGroupHeaderAdapter { _, bean -> viewModel.setPhenomenonMiddleBean(bean) + if (activity != null) { + requireActivity().findNavController(R.id.main_activity_middle_fragment).navigateUp() + } } binding.phenomenonRightRecyclerview.adapter = rightAdapter //右侧菜单增加组标题 @@ -75,6 +83,7 @@ class PhenomenonFragment : } //右侧菜单查询数据监听 viewModel.liveDataRightTypeList.observe(viewLifecycleOwner) { + rightAdapter.setSelectTitle(viewModel.liveDataQsRecordBean.value!!.classType) rightAdapter.refreshData(it) } diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/RightGroupHeaderAdapter.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/RightGroupHeaderAdapter.kt index d3b5cc20..d0dd4de4 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/RightGroupHeaderAdapter.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/RightGroupHeaderAdapter.kt @@ -3,12 +3,13 @@ package com.navinfo.omqs.ui.fragment.evaluationresult import android.view.LayoutInflater import android.view.ViewGroup import com.navinfo.omqs.R -import com.navinfo.omqs.databinding.TextItemSelectBinding +import com.navinfo.omqs.databinding.TextItemSelect2Binding import com.navinfo.omqs.ui.other.BaseRecyclerViewAdapter import com.navinfo.omqs.ui.other.BaseViewHolder class RightGroupHeaderAdapter(private var itemListener: ((Int, RightBean) -> Unit?)? = null) : BaseRecyclerViewAdapter() { + private var selectTitle = "" private var groupTitleList = mutableListOf() override fun getItemViewRes(position: Int): Int { return R.layout.text_item_select2 @@ -16,14 +17,21 @@ class RightGroupHeaderAdapter(private var itemListener: ((Int, RightBean) -> Uni override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { val viewBinding = - TextItemSelectBinding.inflate(LayoutInflater.from(parent.context), parent, false) + TextItemSelect2Binding.inflate(LayoutInflater.from(parent.context), parent, false) return BaseViewHolder(viewBinding) } override fun onBindViewHolder(holder: BaseViewHolder, position: Int) { - val bd = holder.viewBinding as TextItemSelectBinding - bd.itemId.text = data[position].text + val bd = holder.viewBinding as TextItemSelect2Binding + val title = data[position].text + bd.itemId.text = title + + holder.viewBinding.root.isSelected = selectTitle == title bd.root.setOnClickListener { + if (selectTitle != title) { + selectTitle = title + notifyDataSetChanged() + } itemListener?.invoke(position, data[position]) } } @@ -86,7 +94,6 @@ class RightGroupHeaderAdapter(private var itemListener: ((Int, RightBean) -> Uni } override fun refreshData(newData: List) { - super.refreshData(newData) groupTitleList.clear() for (item in newData) { if (groupTitleList.size > 0) { @@ -97,7 +104,15 @@ class RightGroupHeaderAdapter(private var itemListener: ((Int, RightBean) -> Uni groupTitleList.add(item.title) } } + super.refreshData(newData) } - + /** + * 设置当前选中的哪条数据 + */ + fun setSelectTitle(title: String) { + if (title != selectTitle) { + selectTitle = title + } + } } \ No newline at end of file diff --git a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/RightGroupHeaderDecoration.kt b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/RightGroupHeaderDecoration.kt index fd536bd0..13b6fad4 100644 --- a/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/RightGroupHeaderDecoration.kt +++ b/app/src/main/java/com/navinfo/omqs/ui/fragment/evaluationresult/RightGroupHeaderDecoration.kt @@ -40,7 +40,7 @@ class RightGroupHeaderDecoration(context: Context) : ItemDecoration() { mTextPaint.textSize = 46f mTextPaint.color = Color.WHITE mLinePaint = Paint(Paint.ANTI_ALIAS_FLAG) - mLinePaint.color = Color.GRAY + mLinePaint.color = Color.WHITE } /** 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 b8a60117..e27f5868 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 @@ -7,38 +7,72 @@ import com.navinfo.omqs.R class SignUtil { companion object { - /** * 获取面板上的文字 */ fun getSignIconText(data: RenderEntity): String { return when (data.code) { + //道路功能等级 + 2002 -> getLinkFunctionClassText(data) + //道路种别 + 2008 -> getKindText(data) + //道路方向 + 2010 -> getRoadDirectionText(data) + //车道数 + 2041 -> getLaneNumText(data) //常规点限速,条件点限速 4002, 4003 -> getSpeedLimitText(data) -// //道路种别 -// 2008 -> getKindCodeIcon(data) -// //道路方向 -// 2010 -> getRoadDirection(data) -// //车道数 -// 2041 -> getLaneNumIcon(data) else -> "" } } + /** + *获取道路功能等级文字 + */ + private fun getLinkFunctionClassText(data: RenderEntity): String { + return "等级${data.properties["functionClass"]}" + } + + /** + * 获取道路方向文字 + */ + private fun getRoadDirectionText(data: RenderEntity): String { + val direct = data.properties["direct"] + when (direct?.toInt()) { + 0 -> return "不应用" + 1 -> return "双方向" + 2 -> return "顺方向" + 3 -> return "逆方向" + } + return "" + } + + /** + * 获取车道数展示文字 + */ + private fun getLaneNumText(data: RenderEntity): String { + return "${data.properties["laneNum"]}|${data.properties["laneS2e"]}|${data.properties["laneE2s"]}" + } + + /** + * 获取要素名称 + */ fun getSignNameText(data: RenderEntity): String { return when (data.code) { - //可变点限速 - 4004 -> "可变点限速" + //道路功能等级 + 2002 -> "功能等级" + //道路种别 + 2008 -> "种别" + //道路方向 + 2010 -> "方向" + //车道数 + 2041 -> "车道数" //常规点限速 4002 -> "常规点限速" //常点限速 4003 -> "条件点限速" - //道路种别 - 2008 -> "道路种别" - //道路方向 - 2010 -> "道路方向" - //车道数 - 2041 -> "车道数" + //可变点限速 + 4004 -> "可变点限速" else -> "" } } @@ -57,7 +91,6 @@ class SignUtil { /** * 条件点限速文字 */ - private fun getConditionLimitText(data: RenderEntity): String { var stringBuffer = StringBuffer() try { @@ -119,6 +152,13 @@ class SignUtil { return "" } + /** + * 获取种别名称 + */ + private fun getKindText(data: RenderEntity): String { + return data.properties["kind"].toString() + } + /** * 限速图标 */ @@ -132,7 +172,23 @@ class SignUtil { } catch (e: Exception) { Log.e("jingo", "获取限速面板ICON出错2 $e") } - return R.drawable.icon_speed_limit + return 0 + } + + /** + * 条件限速图标 + */ + private fun getConditionalSpeedLimitIcon(data: RenderEntity): Int { + try { + //限速标志 0 限速开始 1 限速解除 + return when (data.properties["speed_flag"]) { + "1" -> return R.drawable.icon_conditional_speed_limit_off + else -> return R.drawable.icon_conditional_speed_limit + } + } catch (e: Exception) { + Log.e("jingo", "获取限速面板ICON出错2 $e") + } + return 0 } /** @@ -141,14 +197,16 @@ class SignUtil { fun getSignIcon(data: RenderEntity): Int { return when (data.code) { - //道路种别 - 2008 -> getKindCodeIcon(data) - //道路方向 - 2010 -> getRoadDirection(data) - //车道数 - 2041 -> getLaneNumIcon(data) - //限速 - 4002, 4003 -> getSpeedLimitIcon(data) +// //道路种别 +// 2008 -> getKindCodeIcon(data) +// //道路方向 +// 2010 -> getRoadDirection(data) +// //车道数 +// 2041 -> getLaneNumIcon(data) + //普通点限速 + 4002 -> getSpeedLimitIcon(data) + //条件点限速 + 4003 -> getConditionalSpeedLimitIcon(data) //可变点限速 4004 -> R.drawable.icon_change_limit else -> 0 @@ -187,7 +245,7 @@ class SignUtil { /** * 获取到路线 */ - fun getLaneNumIcon(data: RenderEntity): Int { + private fun getLaneNumIcon(data: RenderEntity): Int { try { val lineNum = data.properties["laneNum"] return when (lineNum!!.toInt()) { @@ -211,7 +269,7 @@ class SignUtil { return R.drawable.icon_road_direction } - fun getRoadDirection(data: RenderEntity): Int { + private fun getRoadDirection(data: RenderEntity): Int { try { val direct = data.properties["direct"] return when (direct!!.toInt()) { diff --git a/app/src/main/res/drawable-xxhdpi/icon_conditional_speed_limit.png b/app/src/main/res/drawable-xxhdpi/icon_conditional_speed_limit.png new file mode 100644 index 0000000000000000000000000000000000000000..cd25b3c657c966db41e49a4bde9941e813d512af GIT binary patch literal 8679 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 FV1oVw>?{BP literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/icon_conditional_speed_limit_off.png b/app/src/main/res/drawable-xxhdpi/icon_conditional_speed_limit_off.png new file mode 100644 index 0000000000000000000000000000000000000000..8b1cc8a16b0fdf4a0cfa55f258dac32bf22035cb GIT binary patch literal 9602 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-xxhdpi/icon_fragment_switch_off.png b/app/src/main/res/drawable-xxhdpi/icon_fragment_switch_off.png index 269d46e09ee6d172a61773be5ef2d686169c8a00..40d208daf3a9a7e6fae7f85a2a5a4b5c167cebf0 100644 GIT binary patch literal 2099 zcmV-32+a41P)Px+?MXyIRCr$Hoquc`#TCcD-@S9<5F1m76Oyz|2;qlP2tS;=3sRdz4J}kOYDm22 z&f)rYyibT^^Z4gmaAV8=ulwH2)@Ri%-jh+>F}a%+cRI|Qin z!;XE)?W^Y2=iJ$6d(XE&X3zVNEqnIOd!KppW@qN@ED@nAweH9lbH)wQ2Hq77w~f-4$_u(&}gq4ocZ2AUTZ$75Kw0hsWxl5 z4~MtXd`U)6Iw10=Z2B-bjYmO+y2bGBe*0VjIB~LAQRn`T_@$NN3g< zf^8s^Isho>5EzKm_dYvcvd5nSct@CBU@Z87fJme>X$p6en5&Z)6zk$Eh{U?iMU2_I zNqk*b0KRt(6%0Y_0XRo@2ueTiJ;Ib&iq?}Nd_c!o5J-$r^8m!MdqI9R3SQt#j96x7 zu85KQ0W6Ff1kbugqP251joj}Do*zXBo`6WUTANAy5=1Pj5UK`|G&^nqGK-!^>!#eZ!AMlCYpw{2Y-oJC_LTzmvEqET#RZw?YuYq-p(` z$MXo#| zWm-EyY;hwns%0hw(bCp&ecYAQ?nGTQ(+}>PE<%U5l-(W2i z8&)kDSBWjdAQGmv(I9?P$<4J?b{It1@!{dSXW`S{9DeoE|3cwA3?h}bRJRCa12=JX zJ$|vx$tZm34=3>RJ)Z{;!^T=(yVkm3`ZR>o6adbvC!YJse0=HRcpkvs*H7SQ&j$-5 z?-44^7lMBV-wfw!ys*i@?#Jd~{u~F!%deln&H!QLLFf`F!-SCsq0`3ANEpxUJC0p@ z{qMC-*D$S@L9~V0HHzyF14aSFn;=rUfKYk_4WrOC-XU;}P9TDY;ear$gCwrd4MYLP zuI+QNU|wBbz1^?$;@7YCdakO|HPV?LofAWw8Vx-2=s6hb>GS#DANLf-kVj+&NKW@u zvd6;whB4$3mUyhUFX9x87kA9ZtS>kTd>bF?!of_|le!8X(Mz()6Nx?wX}zft58mNq zEDfF!q_-Tw(a&<8)EJ2vp)CE*>P9@Y$$^kPBe?(Zqj>xM0Z$+(A=-}`BOwfC1zVr+ z7Q!%ylxb=AKvih!lJ1Zd-1}G${`22K&pe?Zs1PImqGP69F@*jB!ImHU1L0iPNLx=6 z*z7sxDg=&%aL=RN_~4K?BSbm1oM5S0LP#-$zSF8Z_zPj!BNC={vqAi^iU#!T)?x@J z`fS|u!ybIt>7OT*#0XuM@<&40{BSp{BWFB=Jf0wD@iw0{){zY}bFLUd?@1eXZ4VB@ zaMw`3Bu(pYBvuB3e?%o$E}DjCpO}~b>+zE|Hb2shj*o-!gp#h22N7bP_1xw-Uf3}o zr}}N&_oE(kb_ENe#3RDq3BRDx!07?W&mqFNhBtT?f9u2P7d6J!ibqYnky9zm(zJjO z<3y#3dtJUXEkLseE3b{6c=#MDah=)ST!(?9QF@ixD_EnF$-*2)y)tSta>}I_PRTrp zQ6QGy-ZOK?Kz|RY4!4>*SJ}+lq=wUSzni2yh_*wQ(`GwJXODggTxCHhyLH9}5K2JUYZVh2;l=-5ffyQ2Yx=cl*C1LpNnNbhdYj-?UbKL2 zGF*dDiYL~0euXjnUj%0AW=OUAR0LvZ6sgG zkL0&?GNu|`CIOA z{F82n`Bn;~Y7luCYr4*h)ernO$}z(e5PACflTABb0I;Fb*3hB6cOZtWNu@J806wUL zah2%cIS6N760L)OmCn9^P=c4<+B3U8etHjyZ&uPWVU_g_gkz98f;1rWN%iJIsulFxTH#v5J5K~?*V+@rnH}x z8T+&cQO;=RqXovLBDfN;FH~P{Q(tToNCTWNxYdz7Cg3r`K4uF)HDDaGMY?R}+TVKR d(oyeA{vVY&-tHH+ghK!T002ovPDHLkV1k5x-HHGJ literal 3046 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 diff --git a/app/src/main/res/drawable-xxhdpi/icon_traffic_light.png b/app/src/main/res/drawable-xxhdpi/icon_traffic_light.png new file mode 100644 index 0000000000000000000000000000000000000000..9dda451516ef9c279135f427da7d563011819619 GIT binary patch literal 4751 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable/shape_road_info_bottom_bg.xml b/app/src/main/res/drawable/shape_road_info_bottom_bg.xml new file mode 100644 index 00000000..3a690786 --- /dev/null +++ b/app/src/main/res/drawable/shape_road_info_bottom_bg.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_road_info_left_bottom_bg.xml b/app/src/main/res/drawable/shape_road_info_left_bottom_bg.xml new file mode 100644 index 00000000..b8db35ee --- /dev/null +++ b/app/src/main/res/drawable/shape_road_info_left_bottom_bg.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_road_info_left_top_bg.xml b/app/src/main/res/drawable/shape_road_info_left_top_bg.xml new file mode 100644 index 00000000..f0ea7f27 --- /dev/null +++ b/app/src/main/res/drawable/shape_road_info_left_top_bg.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_road_info_middle_bottom_bg.xml b/app/src/main/res/drawable/shape_road_info_middle_bottom_bg.xml new file mode 100644 index 00000000..96872836 --- /dev/null +++ b/app/src/main/res/drawable/shape_road_info_middle_bottom_bg.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_road_info_middle_top_bg.xml b/app/src/main/res/drawable/shape_road_info_middle_top_bg.xml new file mode 100644 index 00000000..84915e8e --- /dev/null +++ b/app/src/main/res/drawable/shape_road_info_middle_top_bg.xml @@ -0,0 +1,6 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_road_info_right_bottom_bg.xml b/app/src/main/res/drawable/shape_road_info_right_bottom_bg.xml new file mode 100644 index 00000000..37def0d9 --- /dev/null +++ b/app/src/main/res/drawable/shape_road_info_right_bottom_bg.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_road_info_right_top_bg.xml b/app/src/main/res/drawable/shape_road_info_right_top_bg.xml new file mode 100644 index 00000000..e121e516 --- /dev/null +++ b/app/src/main/res/drawable/shape_road_info_right_top_bg.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/shape_road_info_top_bg.xml b/app/src/main/res/drawable/shape_road_info_top_bg.xml new file mode 100644 index 00000000..bd4a5538 --- /dev/null +++ b/app/src/main/res/drawable/shape_road_info_top_bg.xml @@ -0,0 +1,11 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 661c34b6..dbb9e2a5 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -54,7 +54,8 @@ @@ -143,9 +144,8 @@ + android:textColor="@color/white" + android:textSize="18sp" /> + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/text_item_select.xml b/app/src/main/res/layout/text_item_select.xml index 6cf71afb..a68151b7 100644 --- a/app/src/main/res/layout/text_item_select.xml +++ b/app/src/main/res/layout/text_item_select.xml @@ -9,10 +9,10 @@ android:id="@+id/item_id" android:layout_width="match_parent" android:layout_height="wrap_content" - android:layout_margin="3dp" + android:layout_margin="4dp" android:gravity="center" - android:padding="3dp" - android:paddingLeft="0dp" + android:padding="4dp" + android:drawablePadding="10dp" android:drawableLeft="@drawable/selector_text_drawable_left_white_blue" android:textColor="@color/selector_black_blue_color" android:textSize="14sp"/> diff --git a/app/src/main/res/layout/text_item_select2.xml b/app/src/main/res/layout/text_item_select2.xml index aeca52f3..042e9008 100644 --- a/app/src/main/res/layout/text_item_select2.xml +++ b/app/src/main/res/layout/text_item_select2.xml @@ -7,12 +7,11 @@ diff --git a/app/src/main/res/navigation/middle_fragment_nav_graph.xml b/app/src/main/res/navigation/middle_fragment_nav_graph.xml index 8ff5bb4d..ef0d0a1d 100644 --- a/app/src/main/res/navigation/middle_fragment_nav_graph.xml +++ b/app/src/main/res/navigation/middle_fragment_nav_graph.xml @@ -2,12 +2,12 @@ + app:startDestination="@id/MiddleEmptyFragment"> + app:startDestination="@id/RightEmptyFragment"> - - - - - - - - - - - + + + + + + + + + + +