[b4]
[高级地图展示 速度、转向灯和自驾状态]
This commit is contained in:
yangyakun
2026-03-10 11:33:59 +08:00
parent 98432032ca
commit ed21e17f56
14 changed files with 450 additions and 31 deletions

View File

@@ -84,25 +84,25 @@ class B4StatusView : AppCompatTextView, ICommonCallback, IReceivedMsgListener {
"数据刷新来源=$sourceStr 自动驾驶状态=${autopilotState} 订单状态=${CommonModel.inOrder} 美化模式状态=${FunctionBuildConfig.isDemoMode} B2美化模式状态=${FunctionBuildConfig.isB2DemoMode} "
)
if (IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING == autopilotState) {
return R.drawable.b4_status_parallel
return R.color.b4_9A2EFF
}
// 处理非平行驾驶状态的情况
return when {
// 无订单的情况
!CommonModel.inOrder -> {
R.drawable.b4_status_basic
return R.color.b4_333333
}
// 有订单且美化状态和b2美化状态任意开着
CommonModel.inOrder && (FunctionBuildConfig.isDemoMode || FunctionBuildConfig.isB2DemoMode) -> {
R.drawable.b4_status_order_auto
R.color.b4_2EACFF
}
// 有订单且美化状态和b2美化状态都关着
CommonModel.inOrder && !FunctionBuildConfig.isDemoMode && !FunctionBuildConfig.isB2DemoMode -> {
if (autopilotState == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) R.drawable.b4_status_order_auto else R.drawable.b4_status_basic
if (autopilotState == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) R.color.b4_2EACFF else R.color.b4_333333
}
// 覆盖所有可能的情况
else -> R.drawable.b4_status_basic
else -> R.color.b4_333333
}
}
@@ -110,7 +110,7 @@ class B4StatusView : AppCompatTextView, ICommonCallback, IReceivedMsgListener {
BizLoopManager.runInMainThread {
context?.let {
setTextColor(ContextCompat.getColor(it, R.color.common_FFFFFF))
background = ContextCompat.getDrawable(it, getStateIcon(source))
setBackgroundColor(getStateIcon(source))
}
}
}

View File

@@ -0,0 +1,38 @@
package com.mogo.och.shuttle.weaknet.passenger.ui.map.autopilot
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.och.shuttle.weaknet.passenger.R
class B4AutopilotView : ConstraintLayout {
private val TAG = "B4AutopilotView"
constructor(context: Context) : super(context)
constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet)
constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super(context, attributeSet, defStyleAttr)
constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attributeSet, defStyleAttr, defStyleRes)
private fun initView() {
LayoutInflater.from(context).inflate(R.layout.b4_autopilot, this, true)
}
override fun onVisibilityAggregated(isVisible: Boolean) {
super.onVisibilityAggregated(isVisible)
}
init {
try {
initView()
} catch (e: Exception) {
e.printStackTrace()
}
}
}

View File

@@ -0,0 +1,180 @@
package com.mogo.och.shuttle.weaknet.passenger.ui.map.autopilot.light
import android.animation.AnimatorSet
import android.animation.ObjectAnimator
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import android.view.View
import android.view.animation.AlphaAnimation
import android.view.animation.Animation
import android.widget.ImageView
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.eagle.core.function.api.datacenter.union.IMoGoTurnLightListener
import com.mogo.eagle.core.function.call.v2x.CallerTurnLightListenerManager
import com.mogo.eagle.core.utilcode.util.ThreadUtils
import com.mogo.och.common.module.manager.light.TurnLightManager
import com.mogo.och.shuttle.weaknet.passenger.R
import kotlinx.android.synthetic.main.shuttle_p_b4_turn_light_status.view.b4_left_select_image
import kotlinx.android.synthetic.main.shuttle_p_b4_turn_light_status.view.b4_right_nor_image
import kotlinx.android.synthetic.main.shuttle_p_b4_turn_light_status.view.b4_right_select_image
/**
* @author: wangmingjun
* @date: 2023/2/13
*/
class B4TurnLightView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = 0
) : ConstraintLayout(context, attrs, defStyleAttr),
IMoGoTurnLightListener, TurnLightManager.TurnLightListener {
companion object {
private const val TAG = "B4TurnLightView"
}
private var isLeftLight: Boolean = false
private var isRightLight: Boolean = false
private var isDisappear: Boolean = false
init {
LayoutInflater.from(context).inflate(R.layout.shuttle_p_b4_turn_light_status, this, true)
}
override fun onAttachedToWindow() {
super.onAttachedToWindow()
CallerTurnLightListenerManager.addListener(TAG, this)
TurnLightManager.addTurnLightStatusChangeListener(TAG, this)
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
CallerTurnLightListenerManager.removeListener(TAG)
TurnLightManager.removeTurnLightStatusChangeListener(TAG)
}
override fun hideTurnLightView() {
ThreadUtils.runOnUiThread {
if (!isDisappear) {
isDisappear = true
isLeftLight = false
isRightLight = false
animationDisappear()
}
}
}
override fun statusChange(newStatus: TurnLightManager.TurnLightStatus) {
ThreadUtils.runOnUiThread {
setTurnLight(newStatus)
}
}
/**
* 转向灯动画
*/
private fun setTurnLight(directionLight: TurnLightManager.TurnLightStatus) {
if (!isAttachedToWindow) {
return
}
//根据左右进行显示和隐藏,实际要判断每个来的时间和频度
when (directionLight) {
TurnLightManager.TurnLightStatus.TURN_LIGHT_LEFT -> { //左转向
if (!isLeftLight) {
isLeftLight = true
isRightLight = false
isDisappear = false
showNormalAnimation()
b4_left_select_image.visibility = View.VISIBLE
b4_right_select_image.visibility = View.GONE
b4_right_select_image.clearAnimation()
setAnimation(b4_left_select_image)
}
}
TurnLightManager.TurnLightStatus.TURN_LIGHT_RIGHT -> { //右转向
if (!isRightLight) {
isRightLight = true
isLeftLight = false
isDisappear = false
showNormalAnimation()
b4_left_select_image.visibility = View.GONE
b4_right_select_image.visibility = View.VISIBLE
b4_left_select_image.clearAnimation()
setAnimation(b4_right_select_image)
}
}
TurnLightManager.TurnLightStatus.TURN_LIGHT_NONE -> { //消失
if (!isDisappear) {
isDisappear = true
isLeftLight = false
isRightLight = false
animationDisappear()
}
}
}
}
//显示背景
private fun showNormalAnimation() {
val appearAnimation = AlphaAnimation(0f, 1.0f)
appearAnimation.duration = 300
val appearAnimationImage = AlphaAnimation(0f, 1.0f)
appearAnimation.duration = 500
// turn_light_layout.startAnimation(appearAnimation)
// left_nor_image.startAnimation(appearAnimationImage)
b4_right_nor_image.startAnimation(appearAnimationImage)
// turn_light_layout.visibility = View.VISIBLE
// left_nor_image.visibility = View.VISIBLE
b4_right_nor_image.visibility = View.VISIBLE
}
//消失动画,当转向等数据为空时候
private fun animationDisappear() {
b4_left_select_image.visibility = View.GONE
b4_right_select_image.visibility = View.GONE
b4_left_select_image.clearAnimation()
b4_right_select_image.clearAnimation()
//left_nor_image.clearAnimation()
b4_right_nor_image.clearAnimation()
val disappearAnimationLeft = AlphaAnimation(1.0f, 0f)
disappearAnimationLeft.duration = 300
//left_nor_image.startAnimation(disappearAnimationLeft)
b4_right_nor_image.startAnimation(disappearAnimationLeft)
disappearAnimationLeft.setAnimationListener(object : Animation.AnimationListener {
override fun onAnimationRepeat(p0: Animation?) {
}
override fun onAnimationStart(p0: Animation?) {
}
override fun onAnimationEnd(p0: Animation?) {
// left_nor_image.visibility = View.GONE
// right_nor_image.visibility = View.GONE
}
})
}
//实现图片闪烁效果
private fun setAnimation(imageView: ImageView) {
val animationSet = AnimatorSet()
val valueAnimator = ObjectAnimator.ofFloat(imageView, "alpha", 0f, 1.0f)
val valueAnimatorDisappear = ObjectAnimator.ofFloat(imageView, "alpha", 1.0f, 0f)
valueAnimator.duration = 1000
valueAnimatorDisappear.duration = 800
valueAnimator.repeatCount = -1
valueAnimatorDisappear.repeatCount = -1
animationSet.playTogether(valueAnimatorDisappear, valueAnimator)
animationSet.start()
}
}

View File

@@ -0,0 +1,64 @@
package com.mogo.och.shuttle.weaknet.passenger.ui.map.autopilot.speed
import android.content.Context
import android.util.AttributeSet
import android.view.LayoutInflater
import androidx.constraintlayout.widget.ConstraintLayout
import com.mogo.eagle.core.data.map.MogoLocation
import com.mogo.eagle.core.function.api.autopilot.IMoGoChassisLocationGCJ02Listener
import com.mogo.eagle.core.function.hmi.ui.setting.ToggleDebugView
import com.mogo.och.bridge.autopilot.location.OchLocationManager
import com.mogo.och.common.module.manager.loop.BizLoopManager
import com.mogo.och.shuttle.weaknet.passenger.R
import kotlinx.android.synthetic.main.b4_speed.view.b4_tv_speed
import kotlin.math.abs
class B4SpeedView : ConstraintLayout, IMoGoChassisLocationGCJ02Listener {
private val TAG = "B4SpeedView"
constructor(context: Context) : super(context)
constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet)
constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super(context, attributeSet, defStyleAttr)
constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int, defStyleRes: Int) : super(context, attributeSet, defStyleAttr, defStyleRes)
private fun initView() {
LayoutInflater.from(context).inflate(R.layout.b4_speed, this, true)
b4_tv_speed.setOnLongClickListener {
context?.let { ToggleDebugView.toggleDebugView.toggle(it) }
true
}
}
override fun onVisibilityAggregated(isVisible: Boolean) {
super.onVisibilityAggregated(isVisible)
if (isVisible) {
OchLocationManager.addGCJ02Listener(TAG, 3, this)
} else {
OchLocationManager.removeGCJ02Listener(TAG)
}
}
init {
try {
initView()
} catch (e: Exception) {
e.printStackTrace()
}
}
override fun onChassisLocationGCJ02(mogoLocation: MogoLocation?) {
mogoLocation?.let {
BizLoopManager.runInMainThread {
val speedKM = (abs(it.gnssSpeed) * 3.6f).toInt()
b4_tv_speed.text = speedKM.toString()
}
}
}
}

View File

@@ -0,0 +1,127 @@
package com.mogo.och.shuttle.weaknet.passenger.ui.map.autopilot.status
import android.content.Context
import android.util.AttributeSet
import androidx.appcompat.widget.AppCompatTextView
import androidx.core.content.ContextCompat
import com.mogo.eagle.core.data.config.FunctionBuildConfig
import com.mogo.eagle.core.function.api.autopilot.IMoGoAutopilotStatusListener
import com.mogo.eagle.core.function.api.telematic.IReceivedMsgListener
import com.mogo.eagle.core.function.call.autopilot.CallerAutoPilotStatusListenerManager
import com.mogo.eagle.core.function.call.telematic.CallerTelematicListenerManager
import com.mogo.eagle.core.utilcode.mogo.logger.CallerLogger
import com.mogo.och.common.module.manager.loop.BizLoopManager
import com.mogo.och.shuttle.weaknet.passenger.R
import com.mogo.och.shuttle.weaknet.passenger.callback.ICommonCallback
import com.mogo.och.shuttle.weaknet.passenger.model.CommonModel
class B4StatusView : AppCompatTextView, ICommonCallback, IReceivedMsgListener {
private val TAG = "B4StatusView"
constructor(context: Context) : super(context)
constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet)
constructor(context: Context, attributeSet: AttributeSet, defStyleAttr: Int) : super(
context,
attributeSet,
defStyleAttr
)
override fun onAttachedToWindow() {
super.onAttachedToWindow()
CallerTelematicListenerManager.addListener(TAG, this)
CommonModel.setRouteLineInfoCallback(TAG, this)
updateAutoIconState(0)
}
override fun onDetachedFromWindow() {
super.onDetachedFromWindow()
CallerTelematicListenerManager.removeListener(TAG)
CommonModel.setRouteLineInfoCallback(TAG, null)
}
private fun initView() {
}
override fun onB2DemoMode(isB2DemoMode: Boolean) {
super.onB2DemoMode(isB2DemoMode)
updateAutoIconState(1)
}
//美化模式状态变更回调
override fun onDemoMode(isDemoMode: Boolean) {
super.onDemoMode(isDemoMode)
updateAutoIconState(2)
}
override fun updateInOrderStatus(inOrder: Boolean) {
super.updateInOrderStatus(inOrder)
updateAutoIconState(3)
}
//自动驾驶状态变更
override fun updateAutoStatus(state: Int) {
updateAutoIconState(4)
}
private fun getStateIcon(source: Int): Int {
// 平行驾驶状态下
val sourceStr = when (source) {
0 -> "View初始化"
1 -> "B2美化模式状态变更"
2 -> "美化模式状态变更"
3 -> "订单状态变更"
4 -> "自动驾驶状态变更"
else -> "错误"
}
val autopilotState = CallerAutoPilotStatusListenerManager.getState()
CallerLogger.i(
TAG,
"数据刷新来源=$sourceStr 自动驾驶状态=${autopilotState} 订单状态=${CommonModel.inOrder} 美化模式状态=${FunctionBuildConfig.isDemoMode} B2美化模式状态=${FunctionBuildConfig.isB2DemoMode} "
)
if (IMoGoAutopilotStatusListener.STATUS_PARALLEL_DRIVING == autopilotState) {
return R.drawable.b4_status_parallel
}
// 处理非平行驾驶状态的情况
return when {
// 无订单的情况
!CommonModel.inOrder -> {
R.drawable.b4_status_basic
}
// 有订单且美化状态和b2美化状态任意开着
CommonModel.inOrder && (FunctionBuildConfig.isDemoMode || FunctionBuildConfig.isB2DemoMode) -> {
R.drawable.b4_status_order_auto
}
// 有订单且美化状态和b2美化状态都关着
CommonModel.inOrder && !FunctionBuildConfig.isDemoMode && !FunctionBuildConfig.isB2DemoMode -> {
if (autopilotState == IMoGoAutopilotStatusListener.STATUS_AUTOPILOT_RUNNING) R.drawable.b4_status_order_auto else R.drawable.b4_status_basic
}
// 覆盖所有可能的情况
else -> R.drawable.b4_status_basic
}
}
private fun updateAutoIconState(source: Int) {
BizLoopManager.runInMainThread {
context?.let {
setTextColor(ContextCompat.getColor(it, R.color.common_FFFFFF))
background = ContextCompat.getDrawable(it, getStateIcon(source))
}
}
}
init {
try {
initView()
} catch (e: Exception) {
e.printStackTrace()
}
}
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.0 KiB

After

Width:  |  Height:  |  Size: 679 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

After

Width:  |  Height:  |  Size: 738 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

After

Width:  |  Height:  |  Size: 797 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 974 B

After

Width:  |  Height:  |  Size: 842 B

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="@color/b4_333333" />
<corners android:radius="@dimen/dp_33" />
</shape>

View File

@@ -8,9 +8,11 @@
<androidx.appcompat.widget.AppCompatImageView
android:id="@+id/b4_aciv_right_bg"
android:layout_width="@dimen/dp_217"
android:layout_height="@dimen/dp_476"
android:src="@drawable/b4_p_driver_info_right"
android:layout_width="@dimen/dp_185"
android:layout_height="@dimen/dp_380"
android:src="@color/black"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" />
@@ -24,10 +26,10 @@
<com.mogo.och.shuttle.weaknet.passenger.ui.line.autopilot.status.B4StatusView
android:id="@+id/b4_auto_tv"
android:layout_width="@dimen/dp_142"
android:layout_height="@dimen/dp_96"
android:layout_width="@dimen/dp_118"
android:layout_height="@dimen/dp_69"
android:layout_marginBottom="@dimen/dp_3"
android:background="@drawable/b4_status_basic"
android:background="@color/b4_333333"
android:gravity="center"
android:text="@string/b4_autopilot_status"
android:textColor="@color/common_ffffffff"

View File

@@ -4,6 +4,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:background="@color/black"
tools:parentTag="androidx.constraintlayout.widget.ConstraintLayout">
<TextView
@@ -11,7 +12,7 @@
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="60"
android:textColor="@color/common_203555"
android:textColor="@color/white"
android:textSize="@dimen/dp_100"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
@@ -22,7 +23,7 @@
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/dp_112"
android:text="KM/H"
android:textColor="@color/common_203555"
android:textColor="@color/white"
android:textSize="@dimen/dp_24"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"

View File

@@ -2,52 +2,51 @@
<androidx.constraintlayout.widget.ConstraintLayout 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="@dimen/dp_142"
android:layout_height="@dimen/dp_96"
android:visibility="visible"
tools:background="@color/common_203555">
android:layout_width="@dimen/dp_119"
android:layout_height="@dimen/dp_65"
android:visibility="visible">
<FrameLayout
android:id="@+id/b4_turn_light_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_gravity="top|center_horizontal"
android:background="@drawable/b4_turn_light_bg"
android:background="@drawable/b4_turen_light_bg"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/b4_left_nor_image"
android:layout_width="@dimen/dp_64"
android:layout_height="@dimen/dp_64"
android:layout_width="@dimen/dp_34"
android:layout_height="@dimen/dp_37"
android:layout_gravity="left|center_vertical"
android:layout_marginLeft="@dimen/dp_12"
android:layout_marginLeft="@dimen/dp_20"
android:src="@drawable/shuttle_p_b4_zuozhuan_un_open" />
<ImageView
android:id="@+id/b4_right_nor_image"
android:layout_width="@dimen/dp_64"
android:layout_height="@dimen/dp_64"
android:layout_width="@dimen/dp_34"
android:layout_height="@dimen/dp_37"
android:layout_gravity="right|center_vertical"
android:layout_marginRight="@dimen/dp_12"
android:layout_marginRight="@dimen/dp_20"
android:src="@drawable/shuttle_p_b4_youzhuan_un_open" />
<ImageView
android:id="@+id/b4_left_select_image"
android:layout_width="@dimen/dp_64"
android:layout_height="@dimen/dp_64"
android:layout_width="@dimen/dp_34"
android:layout_height="@dimen/dp_37"
android:layout_gravity="left|center_vertical"
android:layout_marginLeft="@dimen/dp_12"
android:layout_marginLeft="@dimen/dp_20"
android:src="@drawable/shuttle_p_b4_zuozhuan_open"
android:visibility="gone" />
<ImageView
android:id="@+id/b4_right_select_image"
android:layout_width="@dimen/dp_64"
android:layout_height="@dimen/dp_64"
android:layout_width="@dimen/dp_34"
android:layout_height="@dimen/dp_37"
android:layout_gravity="right|center_vertical"
android:layout_marginRight="@dimen/dp_12"
android:layout_marginRight="@dimen/dp_20"
android:src="@drawable/shuttle_p_b4_youzhuan_open"
android:visibility="gone" />
</FrameLayout>

View File

@@ -16,4 +16,6 @@
<color name="b4_555555">#555555</color>
<color name="b4_333333">#333333</color>
<color name="b4_7C7C7C">#7C7C7C</color>
<color name="b4_2EACFF">#2EACFF</color>
<color name="b4_9A2EFF">#9A2EFF</color>
</resources>