From d2e620827e9bf45fe397de8e84ef4c21005a4617 Mon Sep 17 00:00:00 2001 From: xuxinchao Date: Fri, 1 Dec 2023 10:04:44 +0800 Subject: [PATCH] =?UTF-8?q?[6.2.0]=E4=BF=AE=E6=94=B9=E5=B0=8F=E6=99=BA?= =?UTF-8?q?=E8=AF=AD=E9=9F=B3=E6=96=87=E5=AD=97=E6=A0=B7=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/PassengerMsgBoxBubbleAdapter.kt | 23 ++--- .../layout/item_passenger_msg_box_voice.xml | 25 ++++- .../mogo/eagle/core/widget/AlignTextView.java | 14 +++ .../eagle/core/widget/AlignTwoTextView.java | 95 +++++++++++++++++++ .../src/main/res/values/color.xml | 2 + 5 files changed, 141 insertions(+), 18 deletions(-) create mode 100644 core/mogo-core-res/src/main/java/com/mogo/eagle/core/widget/AlignTwoTextView.java diff --git a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/PassengerMsgBoxBubbleAdapter.kt b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/PassengerMsgBoxBubbleAdapter.kt index 01b3a2a77f..6b0bc87b1d 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/PassengerMsgBoxBubbleAdapter.kt +++ b/core/function-impl/mogo-core-function-hmi/src/main/java/com/mogo/eagle/core/function/hmi/ui/msgbox/adapter/PassengerMsgBoxBubbleAdapter.kt @@ -1,8 +1,6 @@ package com.mogo.eagle.core.function.hmi.ui.msgbox.adapter import android.app.Activity -import android.graphics.LinearGradient -import android.graphics.Shader import android.os.CountDownTimer import android.view.LayoutInflater import android.view.View @@ -21,6 +19,7 @@ import com.mogo.eagle.core.function.hmi.R import com.mogo.eagle.core.utilcode.util.TimeUtils import com.mogo.eagle.core.utilcode.util.TimeUtils.getHourMinFormat import com.mogo.eagle.core.widget.AlignTextView +import com.mogo.eagle.core.widget.AlignTwoTextView import com.mogo.eagle.core.widget.RoundCanClickConstraintLayout /** @@ -130,23 +129,16 @@ class PassengerMsgBoxBubbleAdapter(private val activity: Activity): RecyclerView is BubbleVoiceHolder -> { data?.let { val voiceMsg = it[position].msgBoxBean.bean as VoiceMsg - holder.tvPassengerVoiceContent.text = voiceMsg.msg if(voiceMsg.isResp){ //小智说的 - holder.tvPassengerVoiceContent.paint.shader = null - holder.tvPassengerVoiceContent.setTextColor(activity.resources.getColor(R.color.voice_resp)) + holder.tvVoiceRes.text = voiceMsg.msg + holder.tvVoiceRes.visibility = View.VISIBLE + holder.tvPassengerVoiceContent.visibility = View.GONE }else{ //用户说的 - val mUserGradient = LinearGradient( - 0f, - 0f, - 0f, - holder.tvPassengerVoiceContent.paint.textSize, - activity.resources.getColor(R.color.voice_user_start) - ,activity.resources.getColor(R.color.voice_user_end), - Shader.TileMode.CLAMP - ) - holder.tvPassengerVoiceContent.paint.setShader(mUserGradient) + holder.tvPassengerVoiceContent.text = voiceMsg.msg + holder.tvVoiceRes.visibility = View.GONE + holder.tvPassengerVoiceContent.visibility = View.VISIBLE } } } @@ -211,6 +203,7 @@ class PassengerMsgBoxBubbleAdapter(private val activity: Activity): RecyclerView //小智语音消息 class BubbleVoiceHolder(itemView: View): RecyclerView.ViewHolder(itemView){ var tvPassengerVoiceContent: AlignTextView = itemView.findViewById(R.id.tvPassengerVoiceContent) + var tvVoiceRes: AlignTwoTextView = itemView.findViewById(R.id.tvVoiceRes) } } \ No newline at end of file diff --git a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_box_voice.xml b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_box_voice.xml index 1e01f4181e..99c1aab2e6 100644 --- a/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_box_voice.xml +++ b/core/function-impl/mogo-core-function-hmi/src/main/res/layout/item_passenger_msg_box_voice.xml @@ -14,20 +14,39 @@ + + \ No newline at end of file diff --git a/core/mogo-core-res/src/main/java/com/mogo/eagle/core/widget/AlignTextView.java b/core/mogo-core-res/src/main/java/com/mogo/eagle/core/widget/AlignTextView.java index 721e05502f..5afc121e42 100644 --- a/core/mogo-core-res/src/main/java/com/mogo/eagle/core/widget/AlignTextView.java +++ b/core/mogo-core-res/src/main/java/com/mogo/eagle/core/widget/AlignTextView.java @@ -1,8 +1,11 @@ package com.mogo.eagle.core.widget; +import android.annotation.SuppressLint; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Canvas; +import android.graphics.LinearGradient; +import android.graphics.Shader; import android.text.Layout; import android.text.StaticLayout; import android.text.TextPaint; @@ -90,4 +93,15 @@ public class AlignTextView extends AppCompatTextView { } } + @SuppressLint("DrawAllocation") + @Override + protected void onLayout(boolean changed, int left, int top, int right, int bottom) { + super.onLayout(changed, left, top, right, bottom); + if (changed) { + getPaint().setShader(new LinearGradient(0, 0, getWidth(), getHeight(), + getResources().getColor(R.color.voice_user_start), + getResources().getColor(R.color.voice_user_end), + Shader.TileMode.CLAMP)); + } + } } diff --git a/core/mogo-core-res/src/main/java/com/mogo/eagle/core/widget/AlignTwoTextView.java b/core/mogo-core-res/src/main/java/com/mogo/eagle/core/widget/AlignTwoTextView.java new file mode 100644 index 0000000000..245e6ff925 --- /dev/null +++ b/core/mogo-core-res/src/main/java/com/mogo/eagle/core/widget/AlignTwoTextView.java @@ -0,0 +1,95 @@ +package com.mogo.eagle.core.widget; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Canvas; +import android.graphics.LinearGradient; +import android.graphics.Shader; +import android.text.Layout; +import android.text.StaticLayout; +import android.text.TextPaint; +import android.util.AttributeSet; + +import androidx.annotation.Nullable; +import androidx.appcompat.widget.AppCompatTextView; + +public class AlignTwoTextView extends AppCompatTextView { + private boolean alignOnlyOneLine; + + public AlignTwoTextView(Context context) { + this(context, null); + } + + public AlignTwoTextView(Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0); + } + + public AlignTwoTextView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(context, attrs); + } + + private void init(Context context, AttributeSet attrs) { + TypedArray typedArray = context.obtainStyledAttributes(attrs, R.styleable.AlignTextView); + alignOnlyOneLine = typedArray.getBoolean(R.styleable.AlignTextView_alignOnlyOneLine, false); + typedArray.recycle(); + } + + protected void onDraw(Canvas canvas) { + + TextPaint paint = getPaint(); + paint.setColor(getCurrentTextColor()); + paint.drawableState = getDrawableState(); + + CharSequence content = getText(); + if (!(content instanceof String)) { + super.onDraw(canvas); + return; + } + String text = (String) content; + Layout layout = getLayout(); + + for (int i = 0; i < layout.getLineCount(); ++i) { + int lineBaseline = layout.getLineBaseline(i) + getPaddingTop(); + int lineStart = layout.getLineStart(i); + int lineEnd = layout.getLineEnd(i); + if (alignOnlyOneLine && layout.getLineCount() == 1) {//只有一行 + String line = text.substring(lineStart, lineEnd); + float width = StaticLayout.getDesiredWidth(text, lineStart, lineEnd, paint); + this.drawScaledText(canvas, line, lineBaseline, width, paint); + } else if (i == layout.getLineCount() - 1) {//最后一行 + canvas.drawText(text.substring(lineStart), getPaddingLeft(), lineBaseline, paint); + break; + } else {//中间行 + String line = text.substring(lineStart, lineEnd); + float width = StaticLayout.getDesiredWidth(text, lineStart, lineEnd, paint); + this.drawScaledText(canvas, line, lineBaseline, width, paint); + } + } + + } + + private void drawScaledText(Canvas canvas, String line, float baseLineY, float lineWidth, TextPaint paint) { + + if (line.length() < 1) { + return; + } + float x = getPaddingLeft(); + boolean forceNextLine = line.charAt(line.length() - 1) == 10; + int length = line.length() - 1; + if (forceNextLine || length == 0) { + canvas.drawText(line, x, baseLineY, paint); + return; + } + + float d = (getMeasuredWidth() - lineWidth - getPaddingLeft() - getPaddingRight()) / length; + + for (int i = 0; i < line.length(); ++i) { + String c = String.valueOf(line.charAt(i)); + float cw = StaticLayout.getDesiredWidth(c, paint); + canvas.drawText(c, x, baseLineY, paint); + x += cw + d; + } + } +} diff --git a/core/mogo-core-res/src/main/res/values/color.xml b/core/mogo-core-res/src/main/res/values/color.xml index b10969f33a..e6a9a12ef4 100644 --- a/core/mogo-core-res/src/main/res/values/color.xml +++ b/core/mogo-core-res/src/main/res/values/color.xml @@ -21,5 +21,7 @@ #323C6F #8E9DD4 + #FF005EA0 + #FF1E32D9 \ No newline at end of file