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()