[6.5.0]优化红绿灯倒计时提示框显示
This commit is contained in:
@@ -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且下一灯态为绿灯时,提示“红灯即将变绿”;并在变为绿灯时有提示起步的动效
|
||||
|
||||
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user