[6.5.0]融合红绿灯

This commit is contained in:
xuxinchao
2024-06-28 20:03:43 +08:00
parent 10043d3ba7
commit 6437946ab1
4 changed files with 154 additions and 12 deletions

View File

@@ -3,6 +3,7 @@ package com.mogo.eagle.core.function.datacenter.v2x
import android.content.Context
import android.os.CountDownTimer
import android.os.Handler
import android.util.Log
import com.mogo.eagle.core.data.biz.trafficlight.TrafficLightResult
import com.mogo.eagle.core.data.biz.trafficlight.TrafficLightStatus
import com.mogo.eagle.core.data.biz.trafficlight.currentRoadTrafficLight
@@ -241,7 +242,7 @@ class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLight
"${SceneConstant.M_D_C}${TAG}",
"resetTrafficLight ------> isReset = $isReset ---hasObuLightStatus = $hasObuLightStatus"
)
if (!hasObuLightStatus && !hasAutopilotPerception) {
if (!hasObuLightStatus && !hasAutopilotPerception && !hasFusionLightStatus) {
if (isReset) {
hide("云端重置红绿灯数据", DataSourceType.AICLOUD)
}
@@ -259,6 +260,7 @@ class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLight
if (filterTelematicUnion(sourceType)) {
return
}
Log.i("xuxinchao","hide msg="+msg+" sourceType="+sourceType)
CallerTrafficLightListenerManager.disableTrafficLight()
}
@@ -282,6 +284,10 @@ class TrafficLightDispatcher : IMoGoAutopilotIdentifyListener, IMoGoTrafficLight
if (filterTelematicUnion(lightSource)) {
return
}
if(currentState == TrafficLightEnum.BLACK || nextState == TrafficLightEnum.BLACK
|| nextTwoState == TrafficLightEnum.BLACK){
return
}
hasObuLightStatus = false
hasAutopilotPerception = false
hasAiLightStatus = false

View File

@@ -2,15 +2,22 @@ package com.mogo.eagle.core.function.hmi.ui.widget
import android.content.Context
import android.util.AttributeSet
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import androidx.constraintlayout.widget.ConstraintLayout
import androidx.core.content.ContextCompat
import com.mogo.eagle.core.data.enums.DataSourceType
import com.mogo.eagle.core.data.enums.TrafficLightEnum
import com.mogo.eagle.core.function.api.datacenter.union.IMoGoTrafficLightListener
import com.mogo.eagle.core.function.call.v2x.CallerTrafficLightListenerManager
import com.mogo.eagle.core.function.hmi.R
import com.mogo.eagle.core.utilcode.util.UiThreadHandler
import kotlinx.android.synthetic.main.hmi_view_fusion_traffic_light.view.fusionTrafficLightNum
import kotlinx.android.synthetic.main.hmi_view_fusion_traffic_light.view.fusionTrafficLightPointer
import kotlinx.android.synthetic.main.hmi_view_fusion_traffic_light.view.fusionTrafficLightProportion
import kotlinx.android.synthetic.main.hmi_view_fusion_traffic_light.view.fusionTrafficLightScale
import kotlinx.android.synthetic.main.hmi_view_fusion_traffic_light.view.fusionTrafficLightState
/**
* 融合红绿灯View
@@ -44,6 +51,7 @@ class FusionTrafficLightView @JvmOverloads constructor(
*/
override fun disableTrafficLight() {
super.disableTrafficLight()
Log.i("xuxinchao","disableTrafficLight 关闭红绿灯预警展示")
UiThreadHandler.post{
mCurrentLightId = TrafficLightEnum.BLACK
this@FusionTrafficLightView.visibility = GONE
@@ -72,9 +80,68 @@ class FusionTrafficLightView @JvmOverloads constructor(
if(this@FusionTrafficLightView.visibility == View.GONE){
this@FusionTrafficLightView.visibility = View.VISIBLE
//首次展示,需要将当前、下一、下二灯态的时间占比绘制出来,只绘制一次
val proportionList = ArrayList<Int>()
//按照绿、黄、红的顺序将灯态时间添加到数组
when (currentState) {
TrafficLightEnum.GREEN -> {
proportionList.add(0,currentDuration)
}
TrafficLightEnum.YELLOW -> {
proportionList.add(1,currentDuration)
}
else -> {
proportionList.add(2,currentDuration)
}
}
when(nextState){
TrafficLightEnum.GREEN -> {
proportionList.add(0,nextDuration)
}
TrafficLightEnum.YELLOW -> {
proportionList.add(1,nextDuration)
}
else -> {
proportionList.add(2,nextDuration)
}
}
when(nextTwoState){
TrafficLightEnum.GREEN -> {
proportionList.add(0,nextTwoDuration)
}
TrafficLightEnum.YELLOW -> {
proportionList.add(1,nextTwoDuration)
}
else -> {
proportionList.add(2,nextTwoDuration)
}
}
fusionTrafficLightProportion.updateProportion(proportionList)
}
//根据当前灯态设置转盘、刻度、指针背景
when(currentState){
TrafficLightEnum.GREEN -> {
fusionTrafficLightState.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_green))
fusionTrafficLightScale.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_green_scale))
fusionTrafficLightPointer.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_green_pointer))
}
TrafficLightEnum.YELLOW -> {
fusionTrafficLightState.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_yellow))
fusionTrafficLightScale.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_yellow_scale))
fusionTrafficLightPointer.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_yellow_pointer))
}
else -> {
fusionTrafficLightState.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_red))
fusionTrafficLightScale.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_red_scale))
fusionTrafficLightPointer.setImageDrawable(ContextCompat.getDrawable(context,R.drawable.icon_light_red_pointer))
}
}
//更新当前灯态倒计时时间
if(currentDuration>0){
fusionTrafficLightNum.text = currentDuration.toString()
}else{
fusionTrafficLightNum.text = "0"
}
//TODO 更新指针指向
}
}

View File

@@ -3,11 +3,19 @@ package com.mogo.eagle.core.function.hmi.ui.widget;
import android.content.Context;
import android.content.res.TypedArray;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.SweepGradient;
import android.util.AttributeSet;
import android.util.Log;
import android.view.View;
import androidx.annotation.Nullable;
import com.mogo.eagle.core.function.hmi.R;
import java.util.ArrayList;
import java.util.List;
import me.jessyan.autosize.utils.AutoSizeUtils;
/**
@@ -16,11 +24,19 @@ import me.jessyan.autosize.utils.AutoSizeUtils;
*/
public class ProportionChartView extends View {
private static int DEFAULT_RING_WIDTH = 5;
private static final int DEFAULT_RING_WIDTH = 8;
private float mRingWidth = 0;
private Paint mRingPaint;
private float mRadius;
// private List<Float>
private RectF mRectF;
//红绿灯绿灯、黄灯、红灯灯色时间
private List<Integer> proportionList = new ArrayList<>();
//一轮灯态的总时长
private int totalDuration = 0;
int[] greenColorArray = new int[]{Color.parseColor("#5EFDE3"),Color.parseColor("#3CCFB9")};
int[] yellowColorArray = new int[]{Color.parseColor("#FFEA3D"),Color.parseColor("#D49840")};
int[] redColorArray = new int[]{Color.parseColor("#FF7373"),Color.parseColor("#CB564E")};
public ProportionChartView(Context context) {
super(context);
@@ -35,6 +51,21 @@ public class ProportionChartView extends View {
init();
}
/**
* 更新红绿灯时间
* @param list 时间列表
*/
public void updateProportion(List<Integer> list){
if(list != null){
this.proportionList = list;
totalDuration = 0;
for(int element: proportionList){
totalDuration += element;
}
postInvalidate();
}
}
public ProportionChartView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initAttr(context, attrs);
@@ -71,6 +102,7 @@ public class ProportionChartView extends View {
* 初始化画笔
*/
private void init(){
mRectF = new RectF();
mRingPaint = new Paint();
//抗锯齿
mRingPaint.setAntiAlias(true);
@@ -99,6 +131,7 @@ public class ProportionChartView extends View {
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Log.i("xuxinchao","onDraw canvas");
drawRingView(canvas);
}
@@ -106,8 +139,35 @@ public class ProportionChartView extends View {
* 画Ring
*/
private void drawRingView(Canvas canvas){
Log.i("xuxinchao","drawRingView 画Ring");
float sweepAngle = 0f;
float startAngle = 0f;
float startAngle = -90f;
//矩形坐标
mRectF.set(getPaddingLeft() + mRingWidth / 2 , getPaddingTop() + mRingWidth / 2 ,
getWidth() - getPaddingRight() - mRingWidth / 2, getHeight() - getPaddingBottom() - mRingWidth / 2 );
for(int i=0;i<proportionList.size();i++){
startAngle += sweepAngle;
sweepAngle = 360f*proportionList.get(i)/totalDuration;
SweepGradient sweepGradient;
//设置渐变颜色
if(i == 0){
//设置绿灯渐变色
sweepGradient = new SweepGradient(getWidth()/2f,(getPaddingTop() + getHeight() - getPaddingBottom())/2f,
greenColorArray,null);
}else if(i == 1){
//设置黄灯渐变色
sweepGradient = new SweepGradient(getWidth()/2f,(getPaddingTop() + getHeight() - getPaddingBottom())/2f,
yellowColorArray,null);
}else{
//设置红灯渐变色
sweepGradient = new SweepGradient(getWidth()/2f,(getPaddingTop() + getHeight() - getPaddingBottom())/2f,
redColorArray,null);
}
mRingPaint.setShader(sweepGradient);
//画圆环
canvas.drawArc(mRectF, startAngle, sweepAngle - 2, false, mRingPaint);
}
}
}

View File

@@ -2,14 +2,14 @@
<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:id="@+id/fusion_traffic_light_bg"
android:id="@+id/fusionTrafficLightBg"
android:layout_width="@dimen/dp_250"
android:layout_height="@dimen/dp_250"
android:background="@drawable/bg_fusion_traffic_light_p"
>
<ImageView
android:id="@+id/fusion_traffic_light_state"
android:id="@+id/fusionTrafficLightState"
android:layout_width="@dimen/dp_147"
android:layout_height="@dimen/dp_147"
app:layout_constraintTop_toTopOf="parent"
@@ -21,7 +21,7 @@
/>
<ImageView
android:id="@+id/fusion_traffic_light_scale"
android:id="@+id/fusionTrafficLightScale"
android:layout_width="@dimen/dp_148"
android:layout_height="@dimen/dp_148"
app:layout_constraintTop_toTopOf="parent"
@@ -33,10 +33,10 @@
/>
<ImageView
android:id="@+id/fusion_traffic_light_pointer"
android:id="@+id/fusionTrafficLightPointer"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintCircle="@id/fusion_traffic_light_state"
app:layout_constraintCircle="@id/fusionTrafficLightState"
app:layout_constraintCircleRadius="@dimen/dp_60"
android:src="@drawable/icon_light_green_pointer"
android:contentDescription="@string/fusion_traffic_light_pointer"
@@ -44,7 +44,7 @@
/>
<com.mogo.eagle.core.function.hmi.ui.widget.TypefaceTextView
android:id="@+id/fusion_traffic_light_num"
android:id="@+id/fusionTrafficLightNum"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:layout_constraintTop_toTopOf="parent"
@@ -56,5 +56,14 @@
android:textStyle="bold"
/>
<com.mogo.eagle.core.function.hmi.ui.widget.ProportionChartView
android:id="@+id/fusionTrafficLightProportion"
android:layout_width="@dimen/dp_170"
android:layout_height="@dimen/dp_170"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
/>
</androidx.constraintlayout.widget.ConstraintLayout>