Commit 9968f320 authored by p x's avatar p x
Browse files

使用模拟数据调通界面

parent 59b1b616
...@@ -35,9 +35,8 @@ class CarPanelBean { ...@@ -35,9 +35,8 @@ class CarPanelBean {
var tapPos = ObservableField<Int>(GearStatus.P) var tapPos = ObservableField<Int>(GearStatus.P)
var gear = 0 var gear = 0
//剩余油量或电量 //剩余电量
var remainSoc = ObservableField<Int>(0) var remainSoc = ObservableField<Int>(0)
var soc = 0
//转向灯 1=left 2=right //转向灯 1=left 2=right
var lights = 0 var lights = 0
......
...@@ -5,14 +5,14 @@ package com.sd.cavphmi.bean ...@@ -5,14 +5,14 @@ package com.sd.cavphmi.bean
data class V2xStartBean( data class V2xStartBean(
val id: String, val id: String,
val level: Int, val level: Int,
val objects: List<Object>, val objects: List<VObject>,
val reportTime: Long, val reportTime: Long,
val startTime: Long, val startTime: Long,
val type: Int, val type: Int,
val typeName: String val typeName: String
) )
data class Object( data class VObject(
val elevation: Double, val elevation: Double,
val id: String, val id: String,
val latitude: Double, val latitude: Double,
......
...@@ -22,5 +22,5 @@ data class VehicleInfo( ...@@ -22,5 +22,5 @@ data class VehicleInfo(
val vehicleImgUrl: Any, val vehicleImgUrl: Any,
val vehicleOwnerName: Any, val vehicleOwnerName: Any,
val vehicleOwnerPhone: Any, val vehicleOwnerPhone: Any,
val vehicleVideoUrl: Any val vehicleVideoUrl: String
) )
\ No newline at end of file
package com.sd.cavphmi.bean
import com.sd.cavphmi.R
/**构造预警的文字和图标**/
class WarningBean {
// var type = -1
var img = R.drawable.chao_su
//提示文字
var tipStr = ""
companion object {
val instance: WarningBean by lazy { WarningBean() }
}
}
package com.sd.cavphmi.bindadapters
import android.widget.ImageView
import androidx.annotation.DrawableRes
import androidx.databinding.BindingAdapter
object ShowEarTipBase {
@JvmStatic
@BindingAdapter("showEarlyTipImg")
fun showEarlyTipImg(iv: ImageView, @DrawableRes res: Int) {
iv.setImageResource(res)
}
}
\ No newline at end of file
...@@ -21,7 +21,8 @@ class HeadParamsInterceptor @Inject constructor() : Interceptor { ...@@ -21,7 +21,8 @@ class HeadParamsInterceptor @Inject constructor() : Interceptor {
request.header("token", MyContants.HTTP_TOKEN) request.header("token", MyContants.HTTP_TOKEN)
request.header("Authorization", MyContants.HTTP_TOKEN) request.header("Authorization", MyContants.HTTP_TOKEN)
} }
request.header("Referer", "${MyContants.HOST}/itdts-portal-v5/intelligence-parking") // request.header("Referer", "${MyContants.HOST}/itdts-portal-v5/intelligence-parking")
request.header("Referer", "https://itg-yz.cu-sc.com:13443/itdts-portal-v5/intelligence-parking")
return chain.proceed(request.build()) return chain.proceed(request.build())
} }
......
...@@ -46,8 +46,7 @@ class LoginActivity : AppCompatActivity() { ...@@ -46,8 +46,7 @@ class LoginActivity : AppCompatActivity() {
startActivity(Intent(this,MainActivity::class.java)) startActivity(Intent(this,MainActivity::class.java))
} }
//获取车辆信息 // HTTP获取车辆详情
// HTTP获取车辆详情 还没调通
binding.btVehinfo.setOnClickListener { binding.btVehinfo.setOnClickListener {
mainVm.getVehDetail() mainVm.getVehDetail()
} }
......
package com.sd.cavphmi.ui package com.sd.cavphmi.ui
import android.animation.AnimatorSet
import android.animation.ObjectAnimator
import android.os.Handler
import android.os.Looper
import android.util.Log
import android.view.KeyEvent import android.view.KeyEvent
import android.widget.ImageView import android.widget.RelativeLayout
import androidx.activity.viewModels import androidx.activity.viewModels
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import com.sd.cavphmi.BR import com.sd.cavphmi.BR
import com.sd.cavphmi.R import com.sd.cavphmi.R
import com.sd.cavphmi.base.BaseActivity import com.sd.cavphmi.base.BaseActivity
import com.sd.cavphmi.base.MyBaseViewModel
import com.sd.cavphmi.databinding.ActivityMainBinding import com.sd.cavphmi.databinding.ActivityMainBinding
import com.sd.cavphmi.intfaces.OnConCan import com.sd.cavphmi.intfaces.OnConCan
import com.sd.cavphmi.ui.fragment.CarPanelFragment import com.sd.cavphmi.ui.fragment.CarPanelFragment
import com.sd.cavphmi.ui.fragment.ExoPlayFragment import com.sd.cavphmi.ui.fragment.ExoPlayFragment
import com.sd.cavphmi.utils.DisplayUtil
import com.sd.cavphmi.viewmodels.MainVm import com.sd.cavphmi.viewmodels.MainVm
import com.sd.cavphmi.viewmodels.MockVM import com.sd.cavphmi.viewmodels.MockVM
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
/**
* Main activity
*
* @constructor Create empty Main activity
*/
@AndroidEntryPoint @AndroidEntryPoint
class MainActivity : BaseActivity<ActivityMainBinding, MainVm>() { class MainActivity : BaseActivity<ActivityMainBinding, MyBaseViewModel>() {
override fun getStatuBarColor(): Int { override fun getStatuBarColor(): Int {
return -1 return -1
...@@ -32,135 +34,135 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainVm>() { ...@@ -32,135 +34,135 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainVm>() {
return R.layout.activity_main return R.layout.activity_main
} }
override fun initViewModel(): MainVm { override fun initViewModel(): MyBaseViewModel {
return ViewModelProvider(this).get(MainVm::class.java) return ViewModelProvider(this).get(MyBaseViewModel::class.java)
} }
override fun initVariableId(): Int { override fun initVariableId(): Int {
return BR.vm return BR.vm
} }
private var isPlay=false //用作模拟
private var type=-11 //预警类型
private val mockVM: MockVM by viewModels() private val mockVM: MockVM by viewModels()
private val mainVm: MainVm by viewModels()
// private val avpMapVM: AvpMapVM by viewModels() // private val avpMapVM: AvpMapVM by viewModels()
//退出应用弹窗
private lateinit var dialogFragment: ExitAppDialog private lateinit var dialogFragment: ExitAppDialog
//汽车仪表 //汽车仪表
private val carPanelFragment by lazy { CarPanelFragment.newInstance() } private val carPanelFragment by lazy { CarPanelFragment.newInstance() }
//exo播放器 //exo播放器
private val exoPlayFragment by lazy { ExoPlayFragment.newInstance("") } private val exoPlayFragment by lazy { ExoPlayFragment.newInstance() }
override fun initView() { override fun initView() {
viewModel.mockVM = mockVM mainVm.mockVM = mockVM
//车辆仪表
var ft = supportFragmentManager.beginTransaction() var ft = supportFragmentManager.beginTransaction()
ft.add(R.id.map_car_pan, carPanelFragment, "1") ft.add(R.id.map_car_pan, carPanelFragment, "1")
ft.commit() ft.commit()
//添加视频播放器,以后看需要控制显示隐藏时机 //设置视频播放器长和宽
var ft2= supportFragmentManager.beginTransaction() var height = DisplayUtil.getScreenHeightPx().div(3) - 20
var width = height.times(2) - 30
var params = binding.videoFrag.layoutParams as RelativeLayout.LayoutParams
params.width = width
params.height = height
binding.videoFrag.layoutParams = params
//添加视频播放器,以后看需要控制显示隐藏时机,默认隐藏
var ft2 = supportFragmentManager.beginTransaction()
ft2.add(R.id.video_frag, exoPlayFragment, "player") ft2.add(R.id.video_frag, exoPlayFragment, "player")
ft2.hide(exoPlayFragment)
ft2.commit() ft2.commit()
} }
override fun getToData() { override fun getToData() {
viewModel.startWS() //开启websocket
// mainVm.startWS()
} }
override fun initListener() { override fun initListener() {
mockBt() mockBt()
mockLis()
}
private fun mockLis() {
} }
private fun mockBt() { private fun mockBt() {
//联网车辆位姿数据 //联网车辆位姿数据
binding.btVehicle.setOnClickListener { binding.btVehicle.setOnClickListener {
viewModel.subVehicle().observe(this) { mainVm.subVehicle().observe(this) {
// topicVehicle(it)
} }
} }
//感知目标物 //感知目标物
binding.btTarget.setOnClickListener { binding.btTarget.setOnClickListener {
viewModel.subTarget() mainVm.subTarget()
} }
//v2x 预警 //v2x 预警
binding.btV2x.setOnClickListener { binding.btV2x.setOnClickListener {
viewModel.subStartV2x() mainVm.subStartV2x()
}
viewModel.v2xStartBean.observe(this){
Log.e("V2x","-------------typeName--"+it.typeName)
if(isPlay){
return@observe
}else{
isPlay=true
setImage()
Handler(Looper.getMainLooper()).postDelayed(displayRunnable,5000)
}
} }
//网联车辆状态
// binding.btStatus.setOnClickListener {
// viewModel.subVehicleStatus()
// }
//交通感知事件
// binding.btTarpre.setOnClickListener {
// viewModel.subTrafficPre()
// }
//交通信号灯
// binding.btTarlight.setOnClickListener {
// viewModel.subTrafficLight()
// }
} }
private fun setImage() {
if(viewModel.v2xStartBean.value.type==1){//前向碰撞 /**
binding.viewPopuler.setImageResource(R.drawable.advance) * Show video play
startPulseAnimation(binding.viewPopuler) * @param isHide false:隐藏 true:显示
}else if(viewModel.v2xStartBean.value.type==3){//左转辅助 */
binding.viewPopuler.setImageResource(R.drawable.left_icon) private fun showVideoPlay(isHide: Boolean) {
startPulseAnimation(binding.viewPopuler) // exoPlayFragment.videoUri=""
}else if(viewModel.v2xStartBean.value.type==4){//盲区预警 var ft = supportFragmentManager.beginTransaction()
binding.viewPopuler.setImageResource(R.drawable.change_lanes) if (isHide) {
startPulseAnimation(binding.viewPopuler) ft.hide(exoPlayFragment)
}else if(viewModel.v2xStartBean.value.type==6){//紧急制动预警 } else {
binding.viewPopuler.setImageResource(R.drawable.stop_icon) ft.show(exoPlayFragment)
startPulseAnimation(binding.viewPopuler)
}else if(viewModel.v2xStartBean.value.type==12){//弱势交通参与者
binding.viewPopuler.setImageResource(R.drawable.weak)
startPulseAnimation(binding.viewPopuler)
}else{
binding.viewPopuler.setImageResource(0)
} }
ft.commit()
} }
fun startPulseAnimation(imageView: ImageView) {
val alphaAnim = ObjectAnimator.ofFloat(imageView, "alpha", 1.0f, 0.5f)
val scaleXAnim = ObjectAnimator.ofFloat(imageView, "scaleX", 1.0f, 1.2f)
val scaleYAnim = ObjectAnimator.ofFloat(imageView, "scaleY", 1.0f, 1.2f)
val set = AnimatorSet().apply { /* private fun setImage() {
playTogether(alphaAnim, scaleXAnim, scaleYAnim) if(mainVm.v2xStartBean.value.type==1){//前向碰撞
duration = 300 binding.viewPopuler.setImageResource(R.drawable.advance)
startPulseAnimation(binding.viewPopuler)
}else if(mainVm.v2xStartBean.value.type==3){//左转辅助
binding.viewPopuler.setImageResource(R.drawable.left_icon)
startPulseAnimation(binding.viewPopuler)
}else if(mainVm.v2xStartBean.value.type==4){//盲区预警
binding.viewPopuler.setImageResource(R.drawable.change_lanes)
startPulseAnimation(binding.viewPopuler)
}else if(mainVm.v2xStartBean.value.type==6){//紧急制动预警
binding.viewPopuler.setImageResource(R.drawable.stop_icon)
startPulseAnimation(binding.viewPopuler)
}else if(mainVm.v2xStartBean.value.type==12){//弱势交通参与者
binding.viewPopuler.setImageResource(R.drawable.weak)
startPulseAnimation(binding.viewPopuler)
}else{
binding.viewPopuler.setImageResource(0)
}
}*/
/* fun startPulseAnimation(imageView: ImageView) {
val alphaAnim = ObjectAnimator.ofFloat(imageView, "alpha", 1.0f, 0.5f)
val scaleXAnim = ObjectAnimator.ofFloat(imageView, "scaleX", 1.0f, 1.2f)
val scaleYAnim = ObjectAnimator.ofFloat(imageView, "scaleY", 1.0f, 1.2f)
val set = AnimatorSet().apply {
playTogether(alphaAnim, scaleXAnim, scaleYAnim)
duration = 300
}
set.start()
} }
set.start()
}
private val displayRunnable = object : Runnable { private val displayRunnable = object : Runnable {
override fun run() { override fun run() {
isPlay=false isPlay = false
} }
} }*/
override fun dispatchKeyEvent(event: KeyEvent): Boolean { override fun dispatchKeyEvent(event: KeyEvent): Boolean {
if ((event.getKeyCode() == KeyEvent.KEYCODE_BACK) || event.getKeyCode() == KeyEvent.KEYCODE_HOME) { if ((event.getKeyCode() == KeyEvent.KEYCODE_BACK) || event.getKeyCode() == KeyEvent.KEYCODE_HOME) {
...@@ -168,7 +170,7 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainVm>() { ...@@ -168,7 +170,7 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainVm>() {
dialogFragment = ExitAppDialog() dialogFragment = ExitAppDialog()
dialogFragment.onConCan = object : OnConCan { dialogFragment.onConCan = object : OnConCan {
override fun onCon() { override fun onCon() {
viewModel.cleanRes() mainVm.cleanRes()
finish() finish()
} }
...@@ -196,6 +198,9 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainVm>() { ...@@ -196,6 +198,9 @@ class MainActivity : BaseActivity<ActivityMainBinding, MainVm>() {
//需求文档里的气泡提醒,数据未必有,已实际数据为准 //需求文档里的气泡提醒,数据未必有,已实际数据为准
//【腾讯文档】AVP-HMI接口需求清单
//https://docs.qq.com/sheet/DVmNmZ3VhVEFxRkpV?tab=BB08J2
......
package com.sd.cavphmi.ui.fragment package com.sd.cavphmi.ui.fragment
import android.graphics.Color
import androidx.activity.viewModels
import androidx.fragment.app.activityViewModels import androidx.fragment.app.activityViewModels
import androidx.fragment.app.viewModels
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import com.sd.cavphmi.BR import com.sd.cavphmi.BR
import com.sd.cavphmi.R import com.sd.cavphmi.R
import com.sd.cavphmi.base.BaseFragment import com.sd.cavphmi.base.BaseFragment
import com.sd.cavphmi.base.MyBaseViewModel
import com.sd.cavphmi.bean.CarVehicle
import com.sd.cavphmi.bean.CarVehicleItem
import com.sd.cavphmi.databinding.FragmentCarPanelBinding import com.sd.cavphmi.databinding.FragmentCarPanelBinding
import com.sd.cavphmi.viewmodels.CarPanelVM
import com.sd.cavphmi.viewmodels.MainVm import com.sd.cavphmi.viewmodels.MainVm
import com.sd.cavphmi.viewmodels.MockVM
import dagger.hilt.android.AndroidEntryPoint import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
...@@ -29,7 +19,7 @@ import kotlinx.coroutines.launch ...@@ -29,7 +19,7 @@ import kotlinx.coroutines.launch
* 车仪表 * 车仪表
*/ */
@AndroidEntryPoint @AndroidEntryPoint
class CarPanelFragment : BaseFragment<FragmentCarPanelBinding, MainVm>() { class CarPanelFragment : BaseFragment<FragmentCarPanelBinding, CarPanelVM>() {
// //
// private var param1: String? = null // private var param1: String? = null
// private var param2: String? = null // private var param2: String? = null
...@@ -42,14 +32,10 @@ class CarPanelFragment : BaseFragment<FragmentCarPanelBinding, MainVm>() { ...@@ -42,14 +32,10 @@ class CarPanelFragment : BaseFragment<FragmentCarPanelBinding, MainVm>() {
// } // }
// } // }
private val mockVM: MockVM by activityViewModels()
override fun getStatuBarColor(): Int { override fun getStatuBarColor(): Int {
return -1 return -1
} }
override fun isAutoStatusBarDarkModeEnable(): Boolean { override fun isAutoStatusBarDarkModeEnable(): Boolean {
return false return false
} }
...@@ -58,19 +44,20 @@ class CarPanelFragment : BaseFragment<FragmentCarPanelBinding, MainVm>() { ...@@ -58,19 +44,20 @@ class CarPanelFragment : BaseFragment<FragmentCarPanelBinding, MainVm>() {
return R.layout.fragment_car_panel return R.layout.fragment_car_panel
} }
override fun initViewModel(): MainVm { override fun initViewModel(): CarPanelVM {
return ViewModelProvider(this).get(MainVm::class.java) return ViewModelProvider(this).get(CarPanelVM::class.java)
} }
override fun initVariableId(): Int { override fun initVariableId(): Int {
return BR.vm return BR.vm
} }
private val mainVm: MainVm by activityViewModels()
private var currentNumber = 0 // 初始数字 private var currentNumber = 0 // 初始数字
override fun initView() { override fun initView() {
viewModel.mockVM = mockVM binding.cpBean = viewModel.carPanelBean
binding.cpBean=viewModel.carPanelBean
// //驾驶模式 // //驾驶模式
// if(viewModel.carPanelBean.driveMode=="1"){ // if(viewModel.carPanelBean.driveMode=="1"){
// binding.tvDrivemode.text="自动驾驶" // binding.tvDrivemode.text="自动驾驶"
...@@ -78,55 +65,59 @@ class CarPanelFragment : BaseFragment<FragmentCarPanelBinding, MainVm>() { ...@@ -78,55 +65,59 @@ class CarPanelFragment : BaseFragment<FragmentCarPanelBinding, MainVm>() {
// binding.tvDrivemode.text="人工驾驶" // binding.tvDrivemode.text="人工驾驶"
// } // }
//车灯 //车灯
if(viewModel.carPanelBean.lights==0){ /* if (viewModel.carPanelBean.lights == 0) {
binding.ivLeftLight.setImageResource(R.drawable.trun_left_grey) binding.ivLeftLight.setImageResource(R.drawable.trun_left_grey)
binding.ivRightLight.setImageResource(R.drawable.trun_left_grey) binding.ivRightLight.setImageResource(R.drawable.trun_left_grey)
}else if(viewModel.carPanelBean.lights==1){ } else if (viewModel.carPanelBean.lights == 1) {
binding.ivLeftLight.setImageResource(R.drawable.trun_left_blue) binding.ivLeftLight.setImageResource(R.drawable.trun_left_blue)
binding.ivRightLight.setImageResource(R.drawable.trun_left_grey) binding.ivRightLight.setImageResource(R.drawable.trun_left_grey)
}else{ } else {
binding.ivLeftLight.setImageResource(R.drawable.trun_left_grey) binding.ivLeftLight.setImageResource(R.drawable.trun_left_grey)
binding.ivRightLight.setImageResource(R.drawable.trun_right_blue) binding.ivRightLight.setImageResource(R.drawable.trun_right_blue)
} }
//档位 //档位
if(viewModel.carPanelBean.gear==0){ if (viewModel.carPanelBean.gear == 0) {
binding.tvP.setTextColor(Color.BLUE) binding.tvP.setTextColor(Color.BLUE)
binding.tvR.setTextColor(resources.getColor(R.color.text_grey)) binding.tvR.setTextColor(resources.getColor(R.color.text_grey))
binding.tvN.setTextColor(resources.getColor(R.color.text_grey)) binding.tvN.setTextColor(resources.getColor(R.color.text_grey))
binding.tvD.setTextColor(resources.getColor(R.color.text_grey)) binding.tvD.setTextColor(resources.getColor(R.color.text_grey))
}else if(viewModel.carPanelBean.gear==1){ } else if (viewModel.carPanelBean.gear == 1) {
binding.tvP.setTextColor(resources.getColor(R.color.text_grey)) binding.tvP.setTextColor(resources.getColor(R.color.text_grey))
binding.tvR.setTextColor(Color.BLUE) binding.tvR.setTextColor(Color.BLUE)
binding.tvN.setTextColor(resources.getColor(R.color.text_grey)) binding.tvN.setTextColor(resources.getColor(R.color.text_grey))
binding.tvD.setTextColor(resources.getColor(R.color.text_grey)) binding.tvD.setTextColor(resources.getColor(R.color.text_grey))
}else if(viewModel.carPanelBean.gear==2){ } else if (viewModel.carPanelBean.gear == 2) {
binding.tvP.setTextColor(resources.getColor(R.color.text_grey)) binding.tvP.setTextColor(resources.getColor(R.color.text_grey))
binding.tvR.setTextColor(resources.getColor(R.color.text_grey)) binding.tvR.setTextColor(resources.getColor(R.color.text_grey))
binding.tvN.setTextColor(resources.getColor(R.color.text_grey)) binding.tvN.setTextColor(resources.getColor(R.color.text_grey))
binding.tvD.setTextColor(Color.BLUE) binding.tvD.setTextColor(Color.BLUE)
}else if(viewModel.carPanelBean.gear==3){ } else if (viewModel.carPanelBean.gear == 3) {
binding.tvP.setTextColor(resources.getColor(R.color.text_grey)) binding.tvP.setTextColor(resources.getColor(R.color.text_grey))
binding.tvR.setTextColor(resources.getColor(R.color.text_grey)) binding.tvR.setTextColor(resources.getColor(R.color.text_grey))
binding.tvN.setTextColor(Color.BLUE) binding.tvN.setTextColor(Color.BLUE)
binding.tvD.setTextColor(resources.getColor(R.color.text_grey)) binding.tvD.setTextColor(resources.getColor(R.color.text_grey))
} }
// 启动协程定时切换 // 启动协程定时切换
lifecycleScope.launch { lifecycleScope.launch {
while (true) { while (true) {
if(currentNumber>100){ if (currentNumber > 100) {
return@launch return@launch
} }
binding.tvSoc.text = "${currentNumber}%" binding.tvSoc.text = "${currentNumber}%"
binding.proSoc.progress = currentNumber binding.proSoc.progress = currentNumber
delay(1000) // 等待10秒 delay(1000) // 等待10秒
currentNumber++ currentNumber++
println("-----"+currentNumber) println("-----" + currentNumber)
} }
} }*/
} }
override fun initListener() { override fun initListener() {
mainVm.carVehicle.observe(this) {
//更新车辆仪表,这里模拟只取第一个
viewModel.setCarPanelBean(it)
}
} }
......
package com.sd.cavphmi.ui.fragment package com.sd.cavphmi.ui.fragment
import android.os.Bundle import android.os.Bundle
import androidx.annotation.OptIn
import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.ViewModelProvider
import androidx.media3.common.AudioAttributes import androidx.media3.common.AudioAttributes
import androidx.media3.common.MediaItem import androidx.media3.common.MediaItem
import androidx.media3.common.PlaybackException import androidx.media3.common.PlaybackException
import androidx.media3.common.Player import androidx.media3.common.Player
import androidx.media3.common.util.UnstableApi
import androidx.media3.exoplayer.ExoPlayer import androidx.media3.exoplayer.ExoPlayer
import androidx.media3.exoplayer.trackselection.DefaultTrackSelector
import com.sd.cavphmi.BR import com.sd.cavphmi.BR
import com.sd.cavphmi.R import com.sd.cavphmi.R
import com.sd.cavphmi.base.BaseFragment import com.sd.cavphmi.base.BaseFragment
...@@ -78,7 +75,6 @@ class ExoPlayFragment : BaseFragment<FragmentExoPlayBinding, MyBaseViewModel>() ...@@ -78,7 +75,6 @@ class ExoPlayFragment : BaseFragment<FragmentExoPlayBinding, MyBaseViewModel>()
binding.playerView.getAdViewGroup().removeAllViews() binding.playerView.getAdViewGroup().removeAllViews()
} }
private lateinit var player: ExoPlayer private lateinit var player: ExoPlayer
//用于测试,实际可以传参进来 //用于测试,实际可以传参进来
...@@ -88,8 +84,6 @@ class ExoPlayFragment : BaseFragment<FragmentExoPlayBinding, MyBaseViewModel>() ...@@ -88,8 +84,6 @@ class ExoPlayFragment : BaseFragment<FragmentExoPlayBinding, MyBaseViewModel>()
initializePlayer() initializePlayer()
} }
fun initializePlayer() { fun initializePlayer() {
val playerBuilder = val playerBuilder =
ExoPlayer.Builder(requireContext()) ExoPlayer.Builder(requireContext())
...@@ -133,6 +127,9 @@ class ExoPlayFragment : BaseFragment<FragmentExoPlayBinding, MyBaseViewModel>() ...@@ -133,6 +127,9 @@ class ExoPlayFragment : BaseFragment<FragmentExoPlayBinding, MyBaseViewModel>()
companion object { companion object {
@JvmStatic
fun newInstance() = ExoPlayFragment()
/*
@JvmStatic @JvmStatic
fun newInstance(video: String) = fun newInstance(video: String) =
ExoPlayFragment().apply { ExoPlayFragment().apply {
...@@ -140,13 +137,6 @@ class ExoPlayFragment : BaseFragment<FragmentExoPlayBinding, MyBaseViewModel>() ...@@ -140,13 +137,6 @@ class ExoPlayFragment : BaseFragment<FragmentExoPlayBinding, MyBaseViewModel>()
putString(VIDEO_PARAM1, video) putString(VIDEO_PARAM1, video)
} }
} }
// @JvmStatic */
// fun newInstance(param1: String, param2: String) =
// ExoPlayFragment().apply {
// arguments = Bundle().apply {
// putString(ARG_PARAM1, param1)
// putString(ARG_PARAM2, param2)
// }
// }
} }
} }
\ No newline at end of file
package com.sd.cavphmi.ui.fragment
import android.graphics.Color
import android.os.Handler
import android.os.Looper
import android.util.Log
import androidx.activity.viewModels
import androidx.fragment.app.activityViewModels
import androidx.fragment.app.viewModels
import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.ViewModelProvider
import androidx.lifecycle.lifecycleScope
import com.sd.cavphmi.BR
import com.sd.cavphmi.R
import com.sd.cavphmi.base.BaseFragment
import com.sd.cavphmi.base.MyBaseViewModel
import com.sd.cavphmi.bean.CarVehicle
import com.sd.cavphmi.bean.CarVehicleItem
import com.sd.cavphmi.bean.V2xStartBean
import com.sd.cavphmi.bean.WarningBean
import com.sd.cavphmi.databinding.FragmentCarPanelBinding
import com.sd.cavphmi.databinding.FragmentWarnBinding
import com.sd.cavphmi.viewmodels.MainVm
import com.sd.cavphmi.viewmodels.MockVM
import dagger.hilt.android.AndroidEntryPoint
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
//private const val ARG_PARAM1 = "param1"
//private const val ARG_PARAM2 = "param2"
/**
* 预警
*/
@AndroidEntryPoint
class WarnFragment : BaseFragment<FragmentWarnBinding, MyBaseViewModel>() {
//
// private var param1: String? = null
// private var param2: String? = null
//
// override fun onCreate(savedInstanceState: Bundle?) {
// super.onCreate(savedInstanceState)
// arguments?.let {
// param1 = it.getString(ARG_PARAM1)
// param2 = it.getString(ARG_PARAM2)
// }
// }
private val mainVm: MainVm by activityViewModels()
override fun getStatuBarColor(): Int {
return -1
}
override fun isAutoStatusBarDarkModeEnable(): Boolean {
return false
}
override fun initContentView(): Int {
return R.layout.fragment_warn
}
override fun initViewModel(): MyBaseViewModel {
return ViewModelProvider(this).get(MyBaseViewModel::class.java)
}
override fun initVariableId(): Int {
return BR.vm
}
override fun initView() {
}
override fun initListener() {
mainVm.v2xStartBean.observe(this) {
Log.e("V2x", "-------------typeName--" + it.typeName)
showEarlyDetail(it)
binding.roadWarn.setWarnBean(WarningBean.instance)
}
}
private fun showEarlyDetail(v2xStartBean: V2xStartBean) {
var warningBean = WarningBean.instance
warningBean.img = R.drawable.chao_su
when (v2xStartBean.type) {
1 -> {//前向碰撞
warningBean.img = R.drawable.zhuyi_car
warningBean.tipStr = "注意前方车辆"
}
4 -> {//盲区预警
warningBean.tipStr = "左侧/右侧盲区有车辆,请注意!"
}
3 -> {//左转辅助
warningBean.tipStr = "注意对向来车"
}
12 -> {//弱势交通参与者
warningBean.img = R.drawable.zhuyi_xingren
warningBean.tipStr = "注意行人"
}
6 -> {//紧急制动预警
warningBean.tipStr = "前方车辆紧急制动,请减速!"
}
}
}
companion object {
@JvmStatic
fun newInstance() = WarnFragment()
}
}
\ No newline at end of file
package com.sd.cavphmi.ui.view
import android.animation.Animator
import android.animation.Animator.AnimatorListener
import android.animation.AnimatorInflater
import android.animation.AnimatorSet
import android.content.Context
import android.util.AttributeSet
import android.view.Gravity
import android.view.LayoutInflater
import android.view.View
import android.widget.LinearLayout
import androidx.core.view.isNotEmpty
import com.sd.cavphmi.R
import com.sd.cavphmi.bean.WarningBean
import com.sd.cavphmi.databinding.EarlyTipBaseBinding
/**预警气泡**/
class RoadWarn : LinearLayout {
constructor(context: Context?) : super(context)
constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs) {
init()
}
//重心
private var mGravity = 0
private var setAni: AnimatorSet? = null
private fun init() {
setAni = AnimatorInflater.loadAnimator(context, R.animator.early_tip_ani) as AnimatorSet
setAni?.addListener(object : AnimatorListener {
override fun onAnimationStart(animation: Animator) {
}
override fun onAnimationEnd(animation: Animator) {
// println("--------------动画结束")
removeAllViews()
}
override fun onAnimationCancel(animation: Animator) {
}
override fun onAnimationRepeat(animation: Animator) {
}
})
}
fun setMyOrientation(orientation: Int) {
this.orientation = orientation
if (orientation == HORIZONTAL) {
mGravity = Gravity.CENTER_VERTICAL
} else {
mGravity = Gravity.CENTER_HORIZONTAL
}
}
fun setWarnBean(warningBean: WarningBean) {
// println("-----${setAni?.isRunning}")
//加载动画的时候什么也不干,或者里面有子View
if (setAni?.isRunning == true || isNotEmpty()) {
return
}
removeAllViews()
val params = (layoutParams as LayoutParams).apply {
gravity = mGravity
}
loadChildView(warningBean, params)
setAni!!.apply {
setTarget(this@RoadWarn)
start()
}
}
// private fun loadChildView(type: Int, parentParam: LinearLayout.LayoutParams) {
private fun loadChildView(
bean: WarningBean,
parentParam: LayoutParams
) {
lateinit var baseView: View
var binding = EarlyTipBaseBinding.inflate(LayoutInflater.from(context))
baseView = binding.root
addView(baseView, parentParam)
// DisplayUtil.forceMeasure(baseView)
binding.bean = bean
}
}
\ No newline at end of file
...@@ -8,8 +8,8 @@ import android.os.Build ...@@ -8,8 +8,8 @@ import android.os.Build
import android.provider.Settings import android.provider.Settings
import android.util.DisplayMetrics import android.util.DisplayMetrics
import android.util.TypedValue import android.util.TypedValue
import android.view.View
import android.view.View.MeasureSpec
/** /**
...@@ -41,6 +41,37 @@ object DisplayUtil { ...@@ -41,6 +41,37 @@ object DisplayUtil {
return (spValue * fontScale + 0.5f).toInt() return (spValue * fontScale + 0.5f).toInt()
} }
fun getScreenWidthDp(): Int {
val displayMetrics = Resources.getSystem().displayMetrics
val widthPixels = displayMetrics.widthPixels
val density = displayMetrics.density
return Math.round(widthPixels / density)
}
fun getScreenWidthPx(): Int {
val displayMetrics = Resources.getSystem().displayMetrics
return displayMetrics.widthPixels
}
fun getScreenHeightDp(): Int {
val displayMetrics = Resources.getSystem().displayMetrics
val heightPixels = displayMetrics.heightPixels
val density = displayMetrics.density
return Math.round(heightPixels / density)
}
fun getScreenHeightPx(): Int {
val displayMetrics = Resources.getSystem().displayMetrics
return displayMetrics.heightPixels
}
fun forceMeasure(view: View) {
val widthMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)
val heightMeasureSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED)
view.measure(widthMeasureSpec, heightMeasureSpec)
}
private val mTmpValue = TypedValue() private val mTmpValue = TypedValue()
fun getXmlDef(context: Context, id: Int): Int { fun getXmlDef(context: Context, id: Int): Int {
......
package com.sd.cavphmi.viewmodels
import android.content.Context
import androidx.lifecycle.viewModelScope
import com.sd.cavphmi.base.MyBaseViewModel
import com.sd.cavphmi.bean.CarPanelBean
import com.sd.cavphmi.bean.CarVehicle
import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import javax.inject.Inject
import kotlin.random.Random
@HiltViewModel
class CarPanelVM @Inject constructor() : MyBaseViewModel() {
//车辆仪表单例
var carPanelBean = CarPanelBean.instance
/**展示车辆仪表*****/
fun setCarPanelBean(carVehicle: CarVehicle) {
// val vehicleInfo = event.vehicleInfo
if (carVehicle.count() == 0)
return
// val vehicleStatusInfo = event.vehicleStatusInfo
var bean = carVehicle.first()
//速度
carPanelBean.speed.set(bean.speed.toInt())
// //航向角
carPanelBean.heading.set(bean.heading.toInt())
//档位
// carPanelBean.tapPos.set(vehicleInfo.tapPos.toInt())
//驾驶模式
// carPanelBean.driveMode.set(vehicleInfo.driveMode.toInt())
//剩余电量
carPanelBean.remainSoc.set(bean.soc.toInt())
//车灯状态
// carPanelBean.lights.set(vehicleStatusInfo?.lights)
// var a = 0
}
fun mock() {
changeMockHeading()
changeMockDriveMode()
changeMockLight()
changeMockPro()
changeMockGear()
changeMockSpeed()
}
private fun changeMockHeading() {
viewModelScope.launch {
var list = mutableListOf<Float>()
var ramdom = Random(360)
for (i in 1..360) {
list.add(ramdom.nextInt(360).toFloat())
}
list.forEach {
withContext(Dispatchers.IO) {
delay(1100)
}
// carPanelBean.heading.set(it)
}
}
}
//模拟驾驶模式
private fun changeMockDriveMode() {
viewModelScope.launch {
for (i in 1..100) {
for (j in 1..9) {
withContext(Dispatchers.IO) {
delay(1500)
}
// carPanelBean.driveMode.set(j)
}
}
}
}
//模拟车灯
private fun changeMockLight() {
var list = listOf(4, 8, 0)
viewModelScope.launch {
for (i in 1..100) {
withContext(Dispatchers.IO) {
delay(2000)
}
var p = i % 3
// carPanelBean.lights.set(list[p])
}
}
}
//模拟电量
private fun changeMockPro() {
viewModelScope.launch {
for (i in 1..1000) {
withContext(Dispatchers.IO) {
delay(300)
}
var p = i % 100
carPanelBean.remainSoc.set(p)
}
}
}
//模拟档位
private fun changeMockGear() {
var list = listOf(31, 32, 33, 34)
viewModelScope.launch {
for (i in 1..100) {
withContext(Dispatchers.IO) {
delay(1000)
}
var p = i % 4
carPanelBean.tapPos.set(list.get(p))
}
}
}
//模拟速度和限速
private fun changeMockSpeed() {
// carPanelBean.spdExp.set(10)
viewModelScope.launch {
for (i in 1..100) {
for (j in 1..100) {
withContext(Dispatchers.IO) {
delay(200)
}
carPanelBean.speed.set(j)
}
}
}
}
}
\ No newline at end of file
package com.sd.cavphmi.viewmodels package com.sd.cavphmi.viewmodels
import android.content.Context import android.content.Context
import android.util.Log
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import androidx.lifecycle.MutableLiveData import androidx.lifecycle.MutableLiveData
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import com.google.gson.Gson import com.google.gson.Gson
import com.sd.cavphmi.base.MyBaseViewModel import com.sd.cavphmi.base.MyBaseViewModel
import com.sd.cavphmi.bean.CarPanelBean
import com.sd.cavphmi.bean.CarVehicle import com.sd.cavphmi.bean.CarVehicle
import com.sd.cavphmi.bean.PerTarget import com.sd.cavphmi.bean.PerTarget
import com.sd.cavphmi.bean.TrafficLightBean
import com.sd.cavphmi.bean.TrafficPerBean
import com.sd.cavphmi.bean.V2xStartBean import com.sd.cavphmi.bean.V2xStartBean
import com.sd.cavphmi.bean.VToXImgBean import com.sd.cavphmi.bean.VToXImgBean
import com.sd.cavphmi.bean.VehDetailBean import com.sd.cavphmi.bean.VehDetailBean
import com.sd.cavphmi.bean.VehicleStats
import com.sd.cavphmi.net.MyResult import com.sd.cavphmi.net.MyResult
import com.sd.cavphmi.repositorys.AvpDataRepo import com.sd.cavphmi.repositorys.AvpDataRepo
import com.sd.cavphmi.repositorys.ParseSocketRepo
import com.sd.cavphmi.utils.FileIoUtils import com.sd.cavphmi.utils.FileIoUtils
import com.sd.cavphmi.utils.MyContants import com.sd.cavphmi.utils.MyContants
import com.sd.cavphmi.utils.ToastHelper import com.sd.cavphmi.utils.ToastHelper
import com.sd.cavphmi.websockets.FeelTargetWSClient import com.sd.cavphmi.websockets.FeelTargetWSClient
import com.sd.cavphmi.websockets.PreDelayWSClient
import com.sd.cavphmi.websockets.TrafficLightWSClient
import com.sd.cavphmi.websockets.TrafficPreWSClient
import com.sd.cavphmi.websockets.V2xWSClient import com.sd.cavphmi.websockets.V2xWSClient
import com.sd.cavphmi.websockets.VecLocWSClient import com.sd.cavphmi.websockets.VecLocWSClient
import com.sd.cavphmi.websockets.VehStatuWSClient
import dagger.hilt.android.lifecycle.HiltViewModel import dagger.hilt.android.lifecycle.HiltViewModel
import dagger.hilt.android.qualifiers.ApplicationContext import dagger.hilt.android.qualifiers.ApplicationContext
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
import java.net.URI import java.net.URI
import java.util.Timer import java.util.Timer
import javax.inject.Inject import javax.inject.Inject
import kotlin.math.truncate
@HiltViewModel @HiltViewModel
...@@ -46,16 +35,19 @@ class MainVm @Inject constructor( ...@@ -46,16 +35,19 @@ class MainVm @Inject constructor(
// private var client: MyWebSocketClient? = null // private var client: MyWebSocketClient? = null
private val TAG="MainVm" private val TAG = "MainVm"
//w网联车辆socket //网联车辆位姿socket
private var vecLocWSClient: VecLocWSClient? = null private var vecLocWSClient = VecLocWSClient(URI(MyContants.WS_VEH_LOC))
//感知物socket //感知物socket
private var feelTargetWSClient: FeelTargetWSClient? = null private var feelTargetWSClient = FeelTargetWSClient(URI(MyContants.WS_FEEL_TARGET))
//预警socket //v2x预警socket
private var v2xWSClient: V2xWSClient? = null private var v2xWSClient = V2xWSClient(URI(MyContants.WS_V2X))
//socket 管理
private var sockets = listOf(vecLocWSClient, feelTargetWSClient, v2xWSClient)
//网联车辆状态 //网联车辆状态
// private var vehStatuWSClient: VehStatuWSClient? = null // private var vehStatuWSClient: VehStatuWSClient? = null
...@@ -79,6 +71,8 @@ class MainVm @Inject constructor( ...@@ -79,6 +71,8 @@ class MainVm @Inject constructor(
//车辆位姿数据 //车辆位姿数据
var carVehicle = MutableLiveData<CarVehicle>() var carVehicle = MutableLiveData<CarVehicle>()
//车辆详情
var vehDetail = MutableLiveData<VehDetailBean>()
//感知目标物 //感知目标物
var targetPre = MutableLiveData<PerTarget>() var targetPre = MutableLiveData<PerTarget>()
...@@ -95,14 +89,12 @@ class MainVm @Inject constructor( ...@@ -95,14 +89,12 @@ class MainVm @Inject constructor(
//交通信号灯 //交通信号灯
// var trafficLightBean = MutableLiveData<TrafficLightBean>() // var trafficLightBean = MutableLiveData<TrafficLightBean>()
/***车辆仪表***/
var carPanelBean = CarPanelBean.instance
// 订单详情 // 订单详情
private var orderTimer = Timer() // private var orderTimer = Timer()
fun startWS() { // fun startWS() {
// val httpHeaders = mutableMapOf<String, String>() // val httpHeaders = mutableMapOf<String, String>()
// httpHeaders.put("Cookie", "username=nemo") // httpHeaders.put("Cookie", "username=nemo")
// try { // try {
...@@ -113,20 +105,23 @@ class MainVm @Inject constructor( ...@@ -113,20 +105,23 @@ class MainVm @Inject constructor(
// } catch (e: Exception) { // } catch (e: Exception) {
// //
// } // }
} // }
/***清理资源***/ /***清理资源***/
fun cleanRes() { fun cleanRes() {
sockets.forEach {
it.close()
}
} }
//获取车辆详情
fun getVehDetail(id: String="") { //获取车辆详情 传{}就行,正常应该是传场地ID,但是亦庄这个和太和桥车是一样的
fun getVehDetail(id: String = "") {
viewModelScope.launch { viewModelScope.launch {
var result = avpDataRepo.getVehDetail(id) var result = avpDataRepo.getVehDetail(id)
when (result) { when (result) {
is MyResult.Success<VehDetailBean> -> { is MyResult.Success<VehDetailBean> -> {
vehDetail.postValue(result.data)
// println("-------时间差---- = ${result.data}") // println("-------时间差---- = ${result.data}")
} }
...@@ -138,31 +133,26 @@ class MainVm @Inject constructor( ...@@ -138,31 +133,26 @@ class MainVm @Inject constructor(
} }
/**联网车辆位姿数据 /**
* 联网车辆位姿数据
* 传入vehicleId 和url拼接代表某辆车的预警 * 传入vehicleId 和url拼接代表某辆车的预警
* **/ */
fun subVehicle(): LiveData<CarVehicle> { fun subVehicle(): LiveData<CarVehicle> {
if (isMock) { if (isMock) {
mockVM.onVehicleMock(carVehicle, carPanelBean) mockVM.onVehicleMock(carVehicle)
} else { } else {
try { try {
if (vecLocWSClient == null) { vecLocWSClient.onDataCb = object : VecLocWSClient.OnDataCb {
vecLocWSClient = VecLocWSClient(URI(MyContants.WS_VEH_LOC)) override fun onMsg(str: String) {
vecLocWSClient?.connect() viewModelScope.launch {
//下载到sd卡下面的DownLoad文件夹下面
vecLocWSClient?.onDataCb = object : VecLocWSClient.OnDataCb { FileIoUtils.writeToFile(str, "CarVehicle.txt")
override fun onMsg(str: String) { var bean = gson.fromJson(str, CarVehicle::class.java)
viewModelScope.launch { carVehicle.postValue(bean)
//下载到sd卡下面的DownLoad文件夹下面
FileIoUtils.writeToFile(str, "CarVehicle.txt")
var bean = gson.fromJson(str, CarVehicle::class.java)
carVehicle.postValue(bean)
}
} }
} }
}else{
Log.e(TAG,"进来了")
} }
vecLocWSClient.connect()
} catch (e: Exception) { } catch (e: Exception) {
e.printStackTrace() e.printStackTrace()
} }
...@@ -179,20 +169,16 @@ class MainVm @Inject constructor( ...@@ -179,20 +169,16 @@ class MainVm @Inject constructor(
mockVM.onSubTargetMock(targetPre) mockVM.onSubTargetMock(targetPre)
} else { } else {
try { try {
if (feelTargetWSClient == null) { feelTargetWSClient.onDataCb = object : FeelTargetWSClient.OnDataCb {
feelTargetWSClient = FeelTargetWSClient(URI(MyContants.WS_FEEL_TARGET)) override fun onMsg(str: String) {
feelTargetWSClient?.connect() viewModelScope.launch {
FileIoUtils.writeToFile(str, "PerTarget.txt")
feelTargetWSClient?.onDataCb = object : FeelTargetWSClient.OnDataCb { var bean = gson.fromJson(str, PerTarget::class.java)
override fun onMsg(str: String) { targetPre.postValue(bean)
viewModelScope.launch {
FileIoUtils.writeToFile(str, "PerTarget.txt")
var bean = gson.fromJson(str, PerTarget::class.java)
targetPre.postValue(bean)
}
} }
} }
} }
feelTargetWSClient.connect()
} catch (e: Exception) { } catch (e: Exception) {
e.printStackTrace() e.printStackTrace()
} }
...@@ -209,20 +195,16 @@ class MainVm @Inject constructor( ...@@ -209,20 +195,16 @@ class MainVm @Inject constructor(
mockVM.onV2xMock(v2xStartBean) mockVM.onV2xMock(v2xStartBean)
} else { } else {
try { try {
if (v2xWSClient == null) { v2xWSClient.onDataCb = object : V2xWSClient.OnDataCb {
v2xWSClient = V2xWSClient(URI(MyContants.WS_V2X)) override fun onMsg(str: String) {
v2xWSClient?.connect() viewModelScope.launch {
FileIoUtils.writeToFile(str, "onStartV2x.txt")
v2xWSClient?.onDataCb = object : V2xWSClient.OnDataCb { var bean = gson.fromJson(str, V2xStartBean::class.java)
override fun onMsg(str: String) { v2xStartBean.postValue(bean)
viewModelScope.launch {
FileIoUtils.writeToFile(str, "onStartV2x.txt")
var bean = gson.fromJson(str, V2xStartBean::class.java)
v2xStartBean.postValue(bean)
}
} }
} }
} }
v2xWSClient.connect()
} catch (e: Exception) { } catch (e: Exception) {
e.printStackTrace() e.printStackTrace()
} }
...@@ -231,7 +213,7 @@ class MainVm @Inject constructor( ...@@ -231,7 +213,7 @@ class MainVm @Inject constructor(
} }
//暂时用不到--------------------------------------------- //暂时用不到---------------------------------------------
/** /**
* 网联车辆状态 * 网联车辆状态
...@@ -246,8 +228,8 @@ class MainVm @Inject constructor( ...@@ -246,8 +228,8 @@ class MainVm @Inject constructor(
override fun onMsg(str: String) { override fun onMsg(str: String) {
viewModelScope.launch { viewModelScope.launch {
FileIoUtils.writeToFile(str, "vehicleS.txt") FileIoUtils.writeToFile(str, "vehicleS.txt")
// var bean = gson.fromJson(str, VehicleStats::class.java) // var bean = gson.fromJson(str, VehicleStats::class.java)
// vehicleStat.postValue(bean) // vehicleStat.postValue(bean)
} }
} }
} }
...@@ -309,7 +291,7 @@ class MainVm @Inject constructor( ...@@ -309,7 +291,7 @@ class MainVm @Inject constructor(
}*/ }*/
//显示气泡 //显示气泡
fun showVToTip() { fun showVToTip() {
var imgs = VToXImgBean.imgs var imgs = VToXImgBean.imgs
ToastHelper.showCustViewShort(context, imgs.get("2")!!) ToastHelper.showCustViewShort(context, imgs.get("2")!!)
......
...@@ -40,8 +40,7 @@ class MockVM @Inject constructor( ...@@ -40,8 +40,7 @@ class MockVM @Inject constructor(
* @param binding 里的速度 * @param binding 里的速度
* **/ * **/
fun onVehicleMock( fun onVehicleMock(
carVehicle: MutableLiveData<CarVehicle>, carVehicle: MutableLiveData<CarVehicle>
carPanelBean:CarPanelBean
) { ) {
viewModelScope.launch { viewModelScope.launch {
val dst = mutableListOf<String>() val dst = mutableListOf<String>()
...@@ -52,8 +51,6 @@ class MockVM @Inject constructor( ...@@ -52,8 +51,6 @@ class MockVM @Inject constructor(
println("------模拟车辆位姿数据 = ${bean}") println("------模拟车辆位姿数据 = ${bean}")
println("------车速 = ${bean.first().speed}") println("------车速 = ${bean.first().speed}")
println("------电量 = ${bean.first().soc}") println("------电量 = ${bean.first().soc}")
carPanelBean.speed.set(bean.first().speed.toInt())
carPanelBean.heading.set(bean.first().heading.toInt())
carVehicle.value = bean carVehicle.value = bean
} }
} }
......
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:duration="500"
android:propertyName="alpha"
android:valueTo="1f"
android:valueFrom="0f"
android:repeatMode="reverse"
android:repeatCount="9"
/>
</set>
\ No newline at end of file
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment