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
相关产品推荐
相关产品推荐

