From 8f4c6abfd3cee0c19a927b03f15d115c80527136 Mon Sep 17 00:00:00 2001 From: juntao Date: Tue, 23 Jun 2020 16:44:28 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B8=B8=E6=88=8F=E8=AF=A6=E6=83=85=E8=87=AA?= =?UTF-8?q?=E5=AE=9A=E4=B9=89=E6=A0=8F=E7=9B=AE=E5=AF=8C=E6=96=87=E6=9C=AC?= =?UTF-8?q?=E6=AD=A3=E6=96=87=E5=85=BC=E5=AE=B9=E4=BD=8E=E7=89=88=E6=9C=AC?= =?UTF-8?q?=E5=AE=89=E5=8D=93=E7=B3=BB=E7=BB=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/com/gh/common/util/Extensions.kt | 15 ++++++++++++++- .../com/gh/common/view/ExpandTextView.java | 18 +++++++++++++++--- .../gh/common/view/GradientAlphaTextSpan.kt | 9 +++------ 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/com/gh/common/util/Extensions.kt b/app/src/main/java/com/gh/common/util/Extensions.kt index c1c3e39ecd..1067855388 100644 --- a/app/src/main/java/com/gh/common/util/Extensions.kt +++ b/app/src/main/java/com/gh/common/util/Extensions.kt @@ -3,6 +3,7 @@ package com.gh.common.util import android.animation.Animator import android.content.ClipboardManager import android.content.Context +import android.os.Build import android.text.* import android.text.style.ClickableSpan import android.text.style.ImageSpan @@ -479,7 +480,19 @@ fun ExpandTextView.setTextWithInterceptingInternalUrl(shrankText: CharSequence, var shrankSsb = shrankText.interceptUrlSpanAndRoundImageSpan() var expandedSsb = expandedText.interceptUrlSpanAndRoundImageSpan() - // 去掉多余的 p 换行 + // 去掉旧版本 Android 系统 [Html.FROM_HTML_MODE_LEGACY] 产生的两个换行符 (丑陋的代码) + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) { + while (shrankSsb.contains("\n\n")) { + val index = shrankSsb.indexOf("\n\n", 0, true) + shrankSsb = SpannableStringBuilder(shrankSsb.subSequence(0, index)).append(shrankSsb.subSequence(index + "\n".length, shrankSsb.length)) + } + while (expandedSsb.contains("\n\n")) { + val index = expandedSsb.indexOf("\n\n", 0, true) + expandedSsb = SpannableStringBuilder(expandedSsb.subSequence(0, index)).append(expandedSsb.subSequence(index + "\n".length, expandedSsb.length)) + } + } + + // 去掉多余的 P 标签换行 if (expandedSsb.endsWith("\n", true)) { expandedSsb = SpannableStringBuilder((expandedSsb.subSequence(0, expandedSsb.length - 2))) } diff --git a/app/src/main/java/com/gh/common/view/ExpandTextView.java b/app/src/main/java/com/gh/common/view/ExpandTextView.java index ed5fc678e5..9028891e8a 100644 --- a/app/src/main/java/com/gh/common/view/ExpandTextView.java +++ b/app/src/main/java/com/gh/common/view/ExpandTextView.java @@ -10,6 +10,7 @@ import android.text.Spanned; import android.text.TextPaint; import android.text.TextUtils; import android.text.style.ClickableSpan; +import android.text.style.ForegroundColorSpan; import android.util.AttributeSet; import android.view.View; @@ -66,7 +67,6 @@ public class ExpandTextView extends AppCompatTextView { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); - // TODO 复用有问题 if (mShowExpandTextRegardlessOfMaxLines && !mIsExpanded) { updateMaxLines(); } @@ -75,7 +75,8 @@ public class ExpandTextView extends AppCompatTextView { private void updateMaxLines() { mMaxLines = getLineCount() - 1; - mMaxLinesCalculatedCallback.onMaxLinesCalculated(getLineCount() - 1); + setMaxLines(mMaxLines); + mMaxLinesCalculatedCallback.onMaxLinesCalculated(mMaxLines); } @Override @@ -211,7 +212,18 @@ public class ExpandTextView extends AppCompatTextView { } } }, startPosition + mEndText.length(), msp.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); - msp.setSpan(new GradientAlphaTextSpan(), startPosition, startPosition + finalEndText.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + + int paintColor = paint.getColor(); + + // 找到最后一个 ForegroundSpan 并获取颜色给 GradientAlphaTextSpan + ForegroundColorSpan[] foregroundColorSpans = msp.getSpans(0, startPosition, ForegroundColorSpan.class); + if (foregroundColorSpans.length != 0) { + int endPosition = msp.getSpanEnd(foregroundColorSpans[foregroundColorSpans.length - 1]); + if (endPosition == startPosition) { + paintColor = foregroundColorSpans[foregroundColorSpans.length - 1].getForegroundColor(); + } + } + msp.setSpan(new GradientAlphaTextSpan(paintColor), startPosition, startPosition + finalEndText.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); setText(msp); setMovementMethod(CustomLinkMovementMethod.getInstance()); diff --git a/app/src/main/java/com/gh/common/view/GradientAlphaTextSpan.kt b/app/src/main/java/com/gh/common/view/GradientAlphaTextSpan.kt index 8abd015857..b52d4e3405 100644 --- a/app/src/main/java/com/gh/common/view/GradientAlphaTextSpan.kt +++ b/app/src/main/java/com/gh/common/view/GradientAlphaTextSpan.kt @@ -1,20 +1,17 @@ package com.gh.common.view -import android.graphics.Canvas -import android.graphics.LinearGradient -import android.graphics.Paint -import android.graphics.Shader +import android.graphics.* import android.text.style.ReplacementSpan import androidx.core.graphics.ColorUtils -class GradientAlphaTextSpan() : ReplacementSpan() { +class GradientAlphaTextSpan(var textColor: Int) : ReplacementSpan() { override fun getSize(paint: Paint, text: CharSequence?, start: Int, end: Int, fm: Paint.FontMetricsInt?): Int { return paint.measureText(text, start, end).toInt() } override fun draw(canvas: Canvas, text: CharSequence?, start: Int, end: Int, x: Float, top: Int, y: Int, bottom: Int, paint: Paint) { - val originalColor = paint.color + val originalColor = textColor val originalColorWithAlphaChanged = ColorUtils.setAlphaComponent(paint.color, 1) val textWidth = paint.measureText(text, start, end).toInt()