You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Studio中如何实现TextView底部半高高亮背景效果

你当前代码的核心问题是使用了固定的30dp、20dp数值,仅适配特定高度的TextView,一旦TextView的文字大小、内边距发生变化,高亮位置就会错位。可以按以下两种方案调整:


方案1:Layer-List Drawable(适配单行文本文案,API 23+)

直接修改drawable文件内容如下,不需要固定数值,自动适配任意高度的TextView:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 底层背景层,不需要可以直接删除 -->
    <item>
        <shape android:shape="rectangle">
            <solid android:color="#f3f3f3" />
        </shape>
    </item>
    <!-- 底部高亮层,高度占TextView总高度的50% -->
    <item android:gravity="bottom" android:height="50%p">
        <shape android:shape="rectangle">
            <solid android:color="#FFC107" />
        </shape>
    </item>
</layer-list>

使用时直接给TextView的android:background属性设置为这个drawable即可。


方案2:自定义Span(适配多行文本,全版本兼容)

如果需要多行文本每一行都有底部高亮效果,或者需要兼容API 23以下的系统,可以用Span实现:

class BottomHighlightSpan(val highlightColor: Int) : LineBackgroundSpan {
    override fun drawBackground(
        canvas: Canvas, paint: Paint, left: Int, right: Int, top: Int, 
        baseline: Int, bottom: Int, text: CharSequence, start: Int, 
        end: Int, lineNum: Int
    ) {
        val originColor = paint.color
        paint.color = highlightColor
        // 仅绘制行高下半部分的高亮
        canvas.drawRect(
            left.toFloat(),
            (top + (bottom - top) / 2).toFloat(),
            right.toFloat(),
            bottom.toFloat(),
            paint
        )
        paint.color = originColor
    }
}

// 调用方式
val content = "需要显示的文本内容"
val spannable = SpannableString(content)
spannable.setSpan(
    BottomHighlightSpan(Color.parseColor("#FFC107")),
    0,
    content.length,
    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
textView.text = spannable

内容的提问来源于stack exchange,提问作者SSS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 15:54:03