Conflicts:
	app/src/main/res/layout/text_item_select.xml
This commit is contained in:
qiji4215 2023-05-26 09:59:24 +08:00
commit e86b0696b6
50 changed files with 803 additions and 224 deletions

View File

@ -106,6 +106,9 @@ dependencies {
implementation 'com.github.sevar83:android-spatialite:2.0.1'
//fragment
implementation "androidx.navigation:navigation-ui-ktx:2.5.3"
//kotlin反射
implementation "org.jetbrains.kotlin:kotlin-stdlib:1.7.0"
implementation "org.jetbrains.kotlin:kotlin-reflect:1.7.0"
}
//
kapt {

View File

@ -1,44 +0,0 @@
{
"tables" : [
{
"table": "OMDB_RD_LINK",
"code": 2001,
"name": "道路线"
},
{
"table": "OMDB_RD_LINK_KIND",
"code": 2008,
"name": "道路种别"
},
{
"table": "OMDB_LINK_DIRECT",
"code": 2010,
"name": "道路方向"
},
{
"table": "OMDB_SPEEDLIMIT",
"code": 4002,
"name": "常规点限速"
},
{
"table": "OMDB_SPEEDLIMIT_COND",
"code": 4003,
"name": "条件点限速"
},
{
"table": "OMDB_SPEEDLIMIT_VAR",
"code": 4004,
"name": "可变点限速"
},
{
"table": "OMDB_LANE_LINK_LG",
"code": 5001,
"name": "车道中心线"
},
{
"table": "OMDB_LANE_NUM",
"code": 2041,
"name": "车道数"
}
]
}

View File

@ -0,0 +1,131 @@
{
"tableMap" : {
"2001": {
"table": "OMDB_RD_LINK",
"code": 2001,
"name": "道路线"
},
"2002": {
"table": "OMDB_RD_LINK_FUNCTION_CLASS",
"code": 2002,
"name": "道路功能等级"
},
"2008": {
"table": "OMDB_RD_LINK_KIND",
"code": 2008,
"name": "道路种别"
},
"2010": {
"table": "OMDB_LINK_DIRECT",
"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,
"name": "常规点限速",
"transformer": [
{
"k": "maxSpeed",
"v": "0",
"klib": "maxSpeed",
"vlib": "限"
}
]
},
"4003":{
"table": "OMDB_SPEEDLIMIT_COND",
"code": 4003,
"name": "条件点限速",
"transformer": [
{
"k": "maxSpeed",
"v": "0|",
"klib": "maxSpeed",
"vlib": "限"
}
]
},
"4004":{
"table": "OMDB_SPEEDLIMIT_VAR",
"code": 4004,
"name": "可变点限速",
"transformer": [
{
"k": "location",
"v": "1",
"klib": "location",
"vlib": "左"
},
{
"k": "location",
"v": "2",
"klib": "locationlib",
"vlib": "右"
},
{
"k": "location",
"v": "3",
"klib": "location",
"vlib": "上"
}
]
},
"4006":{
"table": "OMDB_RESTRICTION",
"code": 4006,
"name": "普通交限"
},
"5001":{
"table": "OMDB_LANE_LINK_LG",
"code": 5001,
"name": "车道中心线"
}
}
}

View File

@ -1,7 +1,5 @@
package com.navinfo.omqs
import io.realm.Realm
class Constant {
companion object {
/**
@ -76,7 +74,7 @@ class Constant {
//选择拍照或者录像
const val SELECT_TAKEPHOTO_OR_RECORD = "select_takephoto_or_record"
const val OMDB_CONFIG = "omdb.config"
const val OMDB_CONFIG = "omdb_config.json"
const val OTHER_CONFIG = "other.config"
val OMDB_LAYER_VISIBLE_LIST: MutableList<String> = mutableListOf() // 记录OMDB数据显示的图层名称列表

View File

@ -1,10 +1,68 @@
package com.navinfo.omqs.bean
import com.navinfo.collect.library.data.entity.RenderEntity
import com.navinfo.omqs.db.ImportPreProcess
import kotlin.reflect.full.declaredMemberFunctions
class ImportConfig {
var tables: MutableList<TableInfo> = mutableListOf()
var tableMap: MutableMap<String, TableInfo> = mutableMapOf()
val tableGroupName: String = "OMDB数据"
var checked : Boolean = true
val preProcess: ImportPreProcess = ImportPreProcess()
fun transformProperties(renderEntity: RenderEntity): RenderEntity {
val transformList = tableMap[renderEntity.code.toString()]?.transformer
if (transformList.isNullOrEmpty()) {
return renderEntity
}
for (transform in transformList) {
// 开始执行转换
val key:String = transform.k
val value = transform.v
val keylib = transform.klib
val valuelib = transform.vlib
// 如果key是以_开头的则预处理时忽略
if (key.startsWith("_")) {
continue
}
// 如果key和value都为空说明当前数据需要增加一个新字段
if (key.isNullOrEmpty()&&value.isNullOrEmpty()&&!renderEntity.properties.containsKey(keylib)) {
renderEntity.properties[keylib] = valuelib
}
// 开始解析key和value并对数据进行匹配
m@ for (k in processKeyOrValue(key)) {
for (v in processKeyOrValue(value)) {
if ("~" == v &&renderEntity.properties.containsKey(k)) { // ~符可以匹配任意元素
if (valuelib.endsWith("()")) { // 以()结尾说明该value配置是一个function需要通过反射调用指定方法
val method = preProcess::class.declaredMemberFunctions.first { it.name == valuelib.replace("()", "") }
method.call(preProcess, renderEntity)
} else {
renderEntity.properties[keylib] = valuelib
}
break@m
} else if (renderEntity.properties[k] == v) {
if (valuelib.endsWith("()")) { // 以()结尾说明该value配置是一个function需要通过反射调用指定方法
val method = preProcess::class.declaredMemberFunctions.first { it.name == valuelib.replace("()", "") }
method.call(preProcess, renderEntity)
} else {
renderEntity.properties[keylib] = valuelib
}
break@m
}
}
}
}
return renderEntity
}
/**
* 处理配置的key
*/
private fun processKeyOrValue(key: String): List<String> {
val keys = key.split("|").filter { it.isNotBlank() }
return keys
}
}
class TableInfo {
@ -12,4 +70,12 @@ class TableInfo {
val code: Int = 0
val name: String = ""
var checked : Boolean = true
var transformer: MutableList<Transform> = mutableListOf()
}
class Transform {
var k: String = ""
var v: String = ""
var klib: String = ""
var vlib: String = ""
}

View File

@ -6,7 +6,7 @@ import kotlinx.parcelize.Parcelize
@Parcelize
data class SignBean(
//图标ID
val iconId: Int,
var iconId: Int = 0,
//定位点到目标距离
val distance: Int = 0,
//图表中的问题
@ -17,8 +17,8 @@ data class SignBean(
val linkId: String,
//坐标
val geometry: String,
//底部文字
val bottomText: String,
//名称
val name: String,
//底部右侧文字
val bottomRightText: String,
//要素code类型

View File

@ -2,7 +2,9 @@ package com.navinfo.omqs.db
import android.content.Context
import android.database.Cursor.*
import android.os.Build
import android.util.Log
import androidx.annotation.RequiresApi
import androidx.core.database.getBlobOrNull
import androidx.core.database.getFloatOrNull
import androidx.core.database.getIntOrNull
@ -14,6 +16,7 @@ import com.google.gson.reflect.TypeToken
import com.navinfo.collect.library.data.entity.RenderEntity
import com.navinfo.omqs.Constant
import com.navinfo.omqs.bean.ImportConfig
import com.navinfo.omqs.bean.Transform
import com.navinfo.omqs.hilt.ImportOMDBHiltFactory
import com.navinfo.omqs.hilt.OMDBDataBaseHiltFactory
import dagger.assisted.Assisted
@ -50,6 +53,10 @@ class ImportOMDBHelper @AssistedInject constructor(
private val configFile: File =
File("${Constant.USER_DATA_PATH}", Constant.OMDB_CONFIG)
private val importConfig by lazy {
openConfigFile()
}
/**
* 读取config的配置文件
* */
@ -61,6 +68,7 @@ class ImportOMDBHelper @AssistedInject constructor(
/**
* 读取指定数据表的数据集
* */
@RequiresApi(Build.VERSION_CODES.N)
suspend fun getOMDBTableData(table: String): Flow<List<Map<String, Any>>> =
withContext(Dispatchers.IO) {
val listResult: MutableList<Map<String, Any>> = mutableListOf()
@ -120,7 +128,6 @@ class ImportOMDBHelper @AssistedInject constructor(
* @param configFile 对应的配置文件
* */
suspend fun importOmdbZipFile(omdbZipFile: File): Flow<String> = withContext(Dispatchers.IO) {
val importConfig = openConfigFile()
val unZipFolder = File(omdbZipFile.parentFile, "result")
flow {
if (unZipFolder.exists()) {
@ -133,7 +140,8 @@ class ImportOMDBHelper @AssistedInject constructor(
try {
Realm.getDefaultInstance().beginTransaction()
// 遍历解压后的文件,读取该数据返回
for ((index, currentConfig) in importConfig.tables.withIndex()) {
for ((index, currentEntry) in importConfig.tableMap.entries.withIndex()) {
val currentConfig = currentEntry.value
val txtFile = unZipFiles.find {
it.name == currentConfig.table
}
@ -150,7 +158,7 @@ class ImportOMDBHelper @AssistedInject constructor(
.toMutableMap()
map["qi_table"] = currentConfig.table
map["qi_name"] = currentConfig.name
map["qi_code"] = currentConfig.code
map["qi_code"] = if (currentConfig.code == 0) currentConfig.code else currentEntry.key
listResult.add(map)
}
}
@ -172,10 +180,12 @@ class ImportOMDBHelper @AssistedInject constructor(
else -> renderEntity.properties.put(key, value.toString())
}
}
// 对renderEntity做预处理后再保存
importConfig.transformProperties(renderEntity)
Realm.getDefaultInstance().copyToRealm(renderEntity)
}
// 1个文件发送一次flow流
emit("${index + 1}/${importConfig.tables.size}")
emit("${index + 1}/${importConfig.tableMap.size}")
}
Realm.getDefaultInstance().commitTransaction()
} catch (e: Exception) {
@ -217,10 +227,4 @@ class ImportOMDBHelper @AssistedInject constructor(
cursor.close()
return columns
}
/**
* 预处理渲染要素某些要素需要对数据做二次处理
* */
fun performRenderEntity(renderEntity: RenderEntity) {
}
}

View File

@ -0,0 +1,14 @@
package com.navinfo.omqs.db
import com.navinfo.collect.library.data.entity.RenderEntity
class ImportPreProcess {
/**
* 预处理所需要的函数
* */
fun foo(renderEntity: RenderEntity): RenderEntity {
println("foo")
renderEntity.properties["foo"] = "bar"
return renderEntity
}
}

View File

@ -0,0 +1,5 @@
package com.navinfo.omqs.rule
class LeftPanel {
}

View File

@ -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,14 +54,13 @@ 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) {
if (it.id == R.id.RightEmptyFragment) {
val bundle = Bundle()
bundle.putParcelable("SignBean", signBean)
rightController.navigate(R.id.EvaluationResultFragment, bundle)
@ -68,6 +69,22 @@ class MainActivity : BaseActivity() {
}
}
/**
* 道路信息看板
*/
private val topSignAdapter by lazy {
TopSignAdapter { position, signBean ->
rightController.currentDestination?.let {
if (it.id == R.id.RightEmptyFragment) {
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<List<ImportConfig>>(
@ -243,7 +276,7 @@ class MainActivity : BaseActivity() {
}
/**
*
*展开或收起右侧面板
*/
fun onSwitchFragment() {
switchFragment = !switchFragment
@ -255,6 +288,13 @@ class MainActivity : BaseActivity() {
}
}
/**
* 隐藏或显示右侧展开按钮
*/
fun setRightSwitchButton(visibility: Int) {
binding.mainActivityFragmentSwitch.visibility = visibility
}
/**
* 点击录音按钮
*/

View File

@ -67,9 +67,12 @@ class MainViewModel @Inject constructor(
//地图点击捕捉到的质检数据ID列表
val liveDataQsRecordIdList = MutableLiveData<List<String>>()
//看板数据
//左侧看板数据
val liveDataSignList = MutableLiveData<List<SignBean>>()
//顶部看板数据
val liveDataTopSignList = MutableLiveData<List<SignBean>>()
// 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<Int>()
@ -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<SignBean>()
val topSignList = mutableListOf<SignBean>()
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, 2010 -> 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}")
}
}
@ -374,9 +386,11 @@ class MainViewModel @Inject constructor(
if (layerConfigList != null && !layerConfigList.isEmpty()) {
val omdbVisibleList = layerConfigList.filter { importConfig ->
importConfig.tableGroupName == "OMDB数据"
}.first().tables.filter { tableInfo ->
}.first().tableMap.filter { entry ->
val tableInfo = entry.value
!tableInfo.checked
}.map { tableInfo ->
}.map { entry ->
val tableInfo = entry.value
tableInfo.table
}.toList()
com.navinfo.collect.library.system.Constant.HAD_LAYER_INVISIABLE_ARRAY =
@ -411,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])

View File

@ -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)

View File

@ -0,0 +1,65 @@
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
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<SignBean>() {
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
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)
}
}
}

View File

@ -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<EvaluationResultViewModel>().value}
// private val viewModel by lazy { viewModels<EvaluationResultViewModel>().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

View File

@ -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()
}
}

View File

@ -66,7 +66,7 @@ class EvaluationResultViewModel @Inject constructor(
/**
* 问题类型 liveData [MiddleAdapter]展示的数据
*/
val liveDataMiddleTypeList = MutableLiveData<List<String>>()
// val liveDataMiddleTypeList = MutableLiveData<List<String>>()
/**
* 问题现象 liveData [RightGroupHeaderAdapter]展示的数据
@ -192,19 +192,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)
}
@ -242,7 +245,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)
}
}
@ -274,7 +277,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}")
@ -315,7 +318,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)
}
@ -453,7 +456,6 @@ class EvaluationResultViewModel @Inject constructor(
Constant.IS_VIDEO_SPEED = true
//录音动画
//录音动画
if (pop != null) {
pop!!.showAtLocation(v, Gravity.CENTER, 0, 0)
}

View File

@ -28,13 +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.itemId.setBackgroundResource(R.drawable.shape_rect_white_2dp_bg)
bd.itemId.setTextColor(holder.viewBinding.root.context.getColor(R.color.highFontColor))
} else {
bd.itemId.setBackgroundResource(R.drawable.shape_rect_white_2dp_bg)
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
@ -50,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()
}
}
}

View File

@ -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)
}
@ -106,15 +115,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 ->

View File

@ -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 ->

View File

@ -3,27 +3,35 @@ 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<RightBean>() {
private var selectTitle = ""
private var groupTitleList = mutableListOf<String>()
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 {
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<RightBean>) {
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
}
}
}

View File

@ -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
}
/**

View File

@ -17,7 +17,7 @@ class LayerManagerExpandableListAdapter(private val context: Context, val parent
}
override fun getChildrenCount(groupPosition: Int): Int {
return parentItems[groupPosition].tables.size
return parentItems[groupPosition].tableMap.size
}
@ -25,8 +25,8 @@ class LayerManagerExpandableListAdapter(private val context: Context, val parent
return parentItems[groupPosition]
}
override fun getChild(groupPosition: Int, childPosition: Int): Any {
return parentItems[groupPosition].tables[childPosition]
override fun getChild(groupPosition: Int, childPosition: Int): TableInfo? {
return parentItems[groupPosition].tableMap[parentItems[groupPosition].tableMap.keys.elementAt(childPosition)]
}
override fun getGroupId(groupPosition: Int): Long = groupPosition.toLong()
@ -58,7 +58,7 @@ class LayerManagerExpandableListAdapter(private val context: Context, val parent
viewHolder.parentCheckBox.isChecked = parentItem.checked
viewHolder.parentCheckBox.setOnClickListener {
parentItem.checked = !parentItem.checked
parentItem.tables.forEach { it.checked = parentItem.checked }
parentItem.tableMap.forEach { it.value.checked = parentItem.checked }
notifyDataSetChanged()
}
if (isExpanded) {
@ -93,7 +93,7 @@ class LayerManagerExpandableListAdapter(private val context: Context, val parent
viewHolder.childCheckBox.isChecked = childItem.checked
viewHolder.childCheckBox.setOnClickListener {
childItem.checked = !childItem.checked
parentItems[groupPosition].checked = parentItems[groupPosition].tables.all { it.checked }
parentItems[groupPosition].checked = parentItems[groupPosition].tableMap.all { it.value.checked }
notifyDataSetChanged()
}

View File

@ -12,32 +12,67 @@ class SignUtil {
*/
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 -> ""
}
}
fun getSignBottomText(data: RenderEntity): String {
/**
*获取道路功能等级文字
*/
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 -> ""
}
}
@ -56,8 +91,7 @@ class SignUtil {
/**
* 条件点限速文字
*/
fun getConditionLimitText(data: RenderEntity): String {
private fun getConditionLimitText(data: RenderEntity): String {
var stringBuffer = StringBuffer()
try {
val dependent = data.properties["speedDependent"]
@ -118,10 +152,17 @@ class SignUtil {
return ""
}
/**
* 获取种别名称
*/
private fun getKindText(data: RenderEntity): String {
return data.properties["kind"].toString()
}
/**
* 限速图标
*/
fun getSpeedLimitIcon(data: RenderEntity): Int {
private fun getSpeedLimitIcon(data: RenderEntity): Int {
try {
//限速标志 0 限速开始 1 限速解除
return when (data.properties["speed_flag"]) {
@ -131,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
}
/**
@ -140,17 +197,19 @@ 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 -> R.drawable.icon_speed_limit
else -> 0
}
}
@ -159,7 +218,7 @@ class SignUtil {
/**
* 获取种别图标
*/
fun getKindCodeIcon(data: RenderEntity): Int {
private fun getKindCodeIcon(data: RenderEntity): Int {
try {
val kind = data.properties["kind"]
return when (kind!!.toInt()) {
@ -186,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()) {
@ -210,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()) {

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true" android:color="@color/default_blue_text_color" />
<item android:color="@color/black" />
</selector>

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

View File

@ -0,0 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/default_blue_text_color" android:state_selected="true"></item>
<item android:drawable="@color/black" />
</selector>

View File

@ -0,0 +1,15 @@
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_selected="true">
<shape android:shape="oval">
<size android:width="10dp" android:height="10dp" />
<solid android:color="@color/default_button_blue_color" />
</shape>
</item>
<item>
<shape android:shape="oval">
<size android:width="10dp" android:height="10dp" />
<solid android:color="@color/white" />
</shape>
</item>
</selector>

View File

@ -1,19 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<!-- <padding-->
<!-- android:bottom="2dp"-->
<!-- android:left="2dp"-->
<!-- android:right="0dp"-->
<!-- android:top="2dp" />-->
<padding
android:bottom="2dp"
android:left="2dp"
android:right="2dp"
android:top="2dp" />
<solid android:color="#FFFFFF" />
<stroke
android:width="1dp"
android:color="#3756DF" />
<corners
android:bottomLeftRadius="4dp"
android:bottomLeftRadius="5dp"
android:bottomRightRadius="0dp"
android:topLeftRadius="4dp"
android:topLeftRadius="5dp"
android:topRightRadius="0dp" />
</shape>

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#BA0C122B" />
<corners
android:topLeftRadius="0dp"
android:topRightRadius="0dp"
android:bottomLeftRadius="6dp"
android:bottomRightRadius="6dp"/>
</shape>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#BA0C122B" />
<corners
android:bottomLeftRadius="6dp"
android:bottomRightRadius="0dp"
android:topLeftRadius="0dp"
android:topRightRadius="0dp" />
</shape>

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#990C122B" />
<corners
android:bottomLeftRadius="0dp"
android:bottomRightRadius="0dp"
android:topLeftRadius="6dp"
android:topRightRadius="0dp" />
</shape>

View File

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

View File

@ -0,0 +1,6 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#990C122B" />
</shape>

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#BA0C122B" />
<corners
android:bottomLeftRadius="0dp"
android:bottomRightRadius="6dp"
android:topLeftRadius="0dp"
android:topRightRadius="0dp" />
</shape>

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#990C122B" />
<corners
android:bottomLeftRadius="0dp"
android:bottomRightRadius="0dp"
android:topLeftRadius="0dp"
android:topRightRadius="6dp" />
</shape>

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<solid android:color="#990C122B" />
<corners
android:bottomLeftRadius="0dp"
android:bottomRightRadius="0dp"
android:topLeftRadius="6dp"
android:topRightRadius="6dp" />
</shape>

View File

@ -51,6 +51,14 @@
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/main_activity_top_sign_recyclerview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="2dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<ImageButton
android:id="@+id/main_activity_person_center"
@ -136,9 +144,8 @@
<ImageButton
android:id="@+id/main_activity_fragment_switch"
android:layout_width="32dp"
android:layout_height="32dp"
android:layout_marginRight="-10dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/selector_fragment_switch"
android:elevation="2dp"
android:onClick="@{()->mainActivity.onSwitchFragment()}"
@ -259,8 +266,8 @@
android:name="androidx.navigation.fragment.NavHostFragment"
android:layout_width="323dp"
android:layout_height="match_parent"
android:layout_marginTop="30dp"
android:layout_gravity="left"
android:layout_marginTop="30dp"
app:navGraph="@navigation/left_drawer_nav_graph" />
</androidx.drawerlayout.widget.DrawerLayout>

View File

@ -0,0 +1,54 @@
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="70dp"
android:layout_height="match_parent"
tools:context="com.navinfo.omqs.ui.activity.map.TopSignAdapter">
<TextView
android:id="@+id/top_sign_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:layout_marginBottom="0.5dp"
android:gravity="center"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:text="名称"
android:textColor="@color/white"
android:textSize="14sp" />
<TextView
android:id="@+id/top_sign_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/top_sign_name"
android:layout_alignLeft="@id/top_sign_name"
android:layout_alignRight="@id/top_sign_name"
android:layout_centerHorizontal="true"
android:gravity="center"
android:paddingTop="5dp"
android:paddingBottom="5dp"
android:text="道路名"
android:textColor="@color/white"
android:textSize="18sp" />
<View
android:id="@+id/top_sign_left_line"
android:layout_width="0.5dp"
android:layout_height="wrap_content"
android:layout_alignTop="@id/top_sign_text"
android:layout_alignBottom="@id/top_sign_text"
android:background="#0C122B"
android:visibility="gone" />
<View
android:id="@+id/top_sign_right_line"
android:layout_width="0.5dp"
android:layout_height="wrap_content"
android:layout_alignTop="@id/top_sign_text"
android:layout_alignBottom="@id/top_sign_text"
android:layout_alignParentRight="true"
android:background="#0C122B"
android:visibility="gone" />
</RelativeLayout>

View File

@ -18,31 +18,30 @@
<!-- android:paddingBottom="30dp"-->
<!-- android:src="@drawable/btn_back_xml" />-->
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/phenomenon_middle_recyclerview"
android:layout_width="0dp"
android:layout_height="35dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/phenomenon_right_recyclerview"
app:layout_constraintTop_toTopOf="parent" />
<!-- <androidx.recyclerview.widget.RecyclerView-->
<!-- android:id="@+id/phenomenon_middle_recyclerview"-->
<!-- android:layout_width="0dp"-->
<!-- android:layout_height="35dp"-->
<!-- app:layout_constraintLeft_toLeftOf="parent"-->
<!-- app:layout_constraintRight_toLeftOf="@id/phenomenon_right_recyclerview"-->
<!-- app:layout_constraintTop_toTopOf="parent" />-->
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/phenomenon_left_recyclerview"
android:layout_width="0dp"
android:layout_width="148dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toLeftOf="@id/phenomenon_right_recyclerview"
app:layout_constraintTop_toBottomOf="@id/phenomenon_middle_recyclerview" />
app:layout_constraintTop_toTopOf="parent" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/phenomenon_right_recyclerview"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toRightOf="@id/phenomenon_left_recyclerview"
app:layout_constraintRight_toRightOf="parent" />
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<!-- <LinearLayout-->
<!-- android:id="@+id/group"-->

View File

@ -1,19 +1,21 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/item_layout"
android:background="@color/white"
android:layout_width="match_parent"
android:layout_height="wrap_content">
android:layout_height="wrap_content"
android:background="@drawable/selector_adapter_item_select_bg">
<TextView
android:id="@+id/item_id"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="3dp"
android:padding = "3dp"
android:layout_margin="4dp"
android:gravity="center"
android:textColor="@color/black"
android:textSize="@dimen/default_font_size">
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"/>
</TextView>

View File

@ -0,0 +1,19 @@
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/item_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/selector_adapter_item_select_bg">
<TextView
android:id="@+id/item_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_margin="4dp"
android:gravity="center_vertical"
android:padding="4dp"
android:textColor="@color/selector_black_blue_color"
android:textSize="14sp"/>
</RelativeLayout>

View File

@ -2,12 +2,12 @@
<navigation xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
app:startDestination="@id/EmptyFragment">
app:startDestination="@id/MiddleEmptyFragment">
<fragment
android:id="@+id/EmptyFragment"
android:id="@+id/MiddleEmptyFragment"
android:name="com.navinfo.omqs.ui.fragment.empty.EmptyFragment"
android:label="空页面"
android:label="中间空页面"
tools:layout="@layout/fragment_empty"></fragment>
<fragment

View File

@ -3,24 +3,24 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/right_fragment_nav_graph"
app:startDestination="@id/EmptyFragment">
app:startDestination="@id/RightEmptyFragment">
<fragment
android:id="@+id/EmptyFragment"
android:id="@+id/RightEmptyFragment"
android:name="com.navinfo.omqs.ui.fragment.empty.EmptyFragment"
android:label="空页面"
android:label="右侧空页面"
tools:layout="@layout/fragment_empty">
<!-- <action-->
<!-- android:id="@+id/EmptyFragment_to_EvaluationResultFragment"-->
<!-- app:destination="@id/EvaluationResultFragment" />-->
<!-- <argument-->
<!-- android:name="QsId"-->
<!-- app:argType="string"-->
<!-- app:nullable="true" />-->
<!-- <argument-->
<!-- android:name="SignBean"-->
<!-- app:argType="com.navinfo.omqs.ui.activity.map.SignBean"-->
<!-- />-->
<!-- <action-->
<!-- android:id="@+id/EmptyFragment_to_EvaluationResultFragment"-->
<!-- app:destination="@id/EvaluationResultFragment" />-->
<!-- <argument-->
<!-- android:name="QsId"-->
<!-- app:argType="string"-->
<!-- app:nullable="true" />-->
<!-- <argument-->
<!-- android:name="SignBean"-->
<!-- app:argType="com.navinfo.omqs.ui.activity.map.SignBean"-->
<!-- />-->
</fragment>
<fragment

View File

@ -8,5 +8,5 @@
<dimen name="right_fragment_w" comment="右侧fragment宽度">256dp</dimen>
<dimen name="main_activity_geometry_w" comment="地图主页坐标框宽度">230dp</dimen>
<dimen name="main_activity_geometry_h" comment="地图主页坐标框高度">28dp</dimen>
<dimen name="fragment_phenomenon_width" comment="问题现象面板宽度">360dp</dimen>
</resources>

View File

@ -1,4 +1,4 @@
<resources>
<dimen name="fab_margin">48dp</dimen>
<dimen name="fragment_phenomenon_width" comment="问题现象面板宽度">310dp</dimen>
<dimen name="fragment_phenomenon_width" comment="问题现象面板宽度">360dp</dimen>
</resources>

View File

@ -1859,9 +1859,11 @@
<m v="OMDB_LINK_DIRECT">
<m k="direct">
<m v="2">
<lineSymbol src="assets:omdb/oneway_right.svg"></lineSymbol>
<!-- <lineSymbol src="assets:omdb/oneway_right.svg"></lineSymbol>-->
<symbol src="assets:omdb/oneway_right.svg" repeat-start="99.9" repeat="false" ></symbol>
</m>
<m v="3">
<!-- <lineSymbol src="assets:omdb/oneway_left.svg"></lineSymbol>-->
<lineSymbol src="assets:omdb/oneway_left.svg"></lineSymbol>
</m>
</m>