[6.5.0]优化红绿灯倒计时提示框显示

This commit is contained in:
xuxinchao
2024-07-17 17:38:06 +08:00
parent b5d4d20e3a
commit f590cecf8c
2 changed files with 73 additions and 30 deletions

View File

@@ -214,10 +214,8 @@ class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLight
DataSourceType.TELEMATIC_UNION_V2N
)
//当前灯态倒计时小于5S时展示额外的提示框
if(light.duration < 5){
onTrafficLightPrompt(convert(light.state),light.duration,convert(light.nextState),light.nextDuration,
convert(light.nextTwoState),light.nextTwoDuration)
}
onTrafficLightPrompt(convert(light.state),light.duration,convert(light.nextState),light.nextDuration,
convert(light.nextTwoState),light.nextTwoDuration)
/**
* 司机端提示:
* 车辆等红灯,在红/黄灯剩余5s且下一灯态为绿灯时提示“红灯即将变绿”并在变为绿灯时有提示起步的动效

View File

@@ -17,7 +17,6 @@ import com.mogo.eagle.core.function.hmi.ui.widget.TypefaceTextView
import com.mogo.eagle.core.utilcode.mogo.thread.WorkThreadHandler
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import java.util.concurrent.TimeUnit
/**
* 融合红绿灯变灯提示
@@ -38,8 +37,12 @@ class TrafficLightPromptView @JvmOverloads constructor(
private var tvPromptContent: TextView ?= null
private var tvTrafficNum: TypefaceTextView ?= null
private var tvTrafficNumDecimal: TypefaceTextView ?= null
private val LIGHT_CHECK = 6501
private var startTime: Long = 0L
private val LIGHT_UPDATE = 6501
private val LIGHT_HIDE = 6502
private val LIGHT_INTERRUPT = 6503
private var currentLightState = TrafficLightEnum.BLACK //当前灯态
private var currentLightDuration = 0f //当前灯态倒计时
init {
val typedArray = context.obtainStyledAttributes(attrs, R.styleable.TrafficLightPromptView)
@@ -53,26 +56,34 @@ class TrafficLightPromptView @JvmOverloads constructor(
override fun handleMessage(msg: Message) {
super.handleMessage(msg)
when(msg.what){
LIGHT_CHECK->{
if(startTime == 0L){
sendEmptyMessageDelayed(LIGHT_CHECK, 500L)
return
}
val endTime = System.nanoTime()
val internal = TimeUnit.NANOSECONDS.toMillis(endTime - startTime)
if(internal > 400){
UiThreadHandler.post {
LIGHT_UPDATE->{
ThreadUtils.runOnUiThread{
if(currentLightDuration >= 0.1f){
//每次收到数据减少0.1秒
currentLightDuration -= 0.1f
tvTrafficNum?.text = "${currentLightDuration.toInt()}."
tvTrafficNumDecimal?.text = (currentLightDuration*100 - currentLightDuration.toInt()*100).toInt().toString()
sendEmptyMessageDelayed(LIGHT_UPDATE, 100L)
}else{
//将数据置为0展示且发送隐藏窗口命令
tvTrafficNum?.text = "0."
tvTrafficNumDecimal?.text = "00"
sendEmptyMessageDelayed(LIGHT_HIDE, 100L)
}
}
if(internal>900){
UiThreadHandler.post{
this@TrafficLightPromptView.visibility = GONE
}
return
}
LIGHT_HIDE->{
hideCurrentView()
}
LIGHT_INTERRUPT->{
if(msg.obj == currentLightDuration){
sendEmptyMessageDelayed(LIGHT_UPDATE, 100L)
}else{
val msgInterrupt= Message()
msgInterrupt.what = LIGHT_INTERRUPT
msgInterrupt.obj = currentLightDuration
sendMessageDelayed(msgInterrupt,200)
}
sendEmptyMessageDelayed(LIGHT_CHECK, 500L)
}
}
}
@@ -97,10 +108,11 @@ class TrafficLightPromptView @JvmOverloads constructor(
CallerTrafficLightListenerManager.removeListener(TAG)
}
override fun disableTrafficLight() {
super.disableTrafficLight()
UiThreadHandler.post{
this@TrafficLightPromptView.visibility = GONE
private fun hideCurrentView(){
ThreadUtils.runOnUiThread{
if(this@TrafficLightPromptView.visibility == View.VISIBLE){
this@TrafficLightPromptView.visibility = GONE
}
}
}
@@ -114,12 +126,39 @@ class TrafficLightPromptView @JvmOverloads constructor(
nextState: TrafficLightEnum, nextDuration: Float,
nextTwoState: TrafficLightEnum, nextTwoDuration: Float) {
super.onShowTrafficLightPrompt(currentState, currentDuration,nextState, nextDuration, nextTwoState, nextTwoDuration)
if(currentDuration < 5){
//当前灯态倒计时时间小于5秒展示提示窗
updateTrafficLight(currentState, currentDuration,nextState)
if(currentLightState != currentState){
currentLightState = currentState
}
currentLightDuration = currentDuration
}else {
//当前灯态大于等于5秒且灯态发生变化此时应该将倒计时渐变为0之后关闭提示窗
if(currentState != currentLightState){
ThreadUtils.runOnUiThread{
mLightHandler.sendEmptyMessage(LIGHT_UPDATE)
}
currentLightState = currentState
}else{
hideCurrentView()
}
}
}
/**
* 更新当前红绿灯提示框信息
*/
private fun updateTrafficLight(currentState: TrafficLightEnum, currentDuration: Float, nextState: TrafficLightEnum){
ThreadUtils.runOnUiThread {
when(currentState){
TrafficLightEnum.GREEN->{
if(this@TrafficLightPromptView.visibility == View.GONE){
mLightHandler.sendEmptyMessageDelayed(LIGHT_CHECK, 500L)
this@TrafficLightPromptView.visibility = View.VISIBLE
val msg= Message()
msg.what = LIGHT_INTERRUPT
msg.obj = currentDuration
mLightHandler.sendMessageDelayed(msg,200)
}
if(user == 0){
tvTrafficNum?.setTextColor(ContextCompat.getColor(context,R.color.light_prompt_green))
@@ -131,8 +170,11 @@ class TrafficLightPromptView @JvmOverloads constructor(
}
TrafficLightEnum.RED->{
if(this@TrafficLightPromptView.visibility == View.GONE){
mLightHandler.sendEmptyMessageDelayed(LIGHT_CHECK, 500L)
this@TrafficLightPromptView.visibility = View.VISIBLE
val msg= Message()
msg.what = LIGHT_INTERRUPT
msg.obj = currentDuration
mLightHandler.sendMessageDelayed(msg,200)
}
if(user == 0){
tvTrafficNum?.setTextColor(ContextCompat.getColor(context,R.color.light_prompt_red))
@@ -144,8 +186,11 @@ class TrafficLightPromptView @JvmOverloads constructor(
}
TrafficLightEnum.YELLOW->{
if(this@TrafficLightPromptView.visibility == View.GONE){
mLightHandler.sendEmptyMessageDelayed(LIGHT_CHECK, 500L)
this@TrafficLightPromptView.visibility = View.VISIBLE
val msg= Message()
msg.what = LIGHT_INTERRUPT
msg.obj = currentDuration
mLightHandler.sendMessageDelayed(msg,200)
}
if(user == 0){
tvTrafficNum?.setTextColor(ContextCompat.getColor(context,R.color.light_prompt_yellow))
@@ -157,9 +202,9 @@ class TrafficLightPromptView @JvmOverloads constructor(
}
TrafficLightEnum.BLACK->{
this@TrafficLightPromptView.visibility = View.GONE
mLightHandler.removeMessages(LIGHT_INTERRUPT)
}
}
startTime = System.nanoTime()
if(currentDuration>0 && currentDuration<5){
tvTrafficNum?.text = "${currentDuration.toInt()}."
tvTrafficNumDecimal?.text = (currentDuration*100 - currentDuration.toInt()*100).toInt().toString()