如何缩小RecyclerView子项中TextView两行文本间的间距?
解决RecyclerView子项TextView两行文本间距缩小的问题
你当前已经通过lineSpacingExtra和lineSpacingMultiplier调整了行间距,若要进一步缩小,可尝试以下几种方案:
方案一:优化现有样式参数
调整lineSpacingExtra的负值,或配合微调lineSpacingMultiplier,进一步压缩行间距:
<style name="m_ui_medium_02" parent="@android:style/Widget.TextView"> <item name="android:textSize">12sp</item> <!-- 增大负值(如-4dp),注意避免文字过度重叠 --> <item name="android:lineSpacingExtra">-4dp</item> <!-- 可适当调小multiplier(如0.4),增强压缩效果 --> <item name="android:lineSpacingMultiplier">0.4</item> <item name="android:textColor">@color/ink_lightest</item> </style>
注意:负值不能过大,否则会导致上下行文字重叠影响可读性,建议在不同分辨率设备上测试适配效果。
方案二:自定义TextView手动控制行间距
通过重写onDraw方法,直接调整每行文本的绘制位置,灵活性最高:
public class CompactLineSpacingTextView extends androidx.appcompat.widget.AppCompatTextView { // 自定义行间距偏移值(单位px,负值为缩小间距) private int mExtraLineOffset = -6; public CompactLineSpacingTextView(Context context) { super(context); } public CompactLineSpacingTextView(Context context, AttributeSet attrs) { super(context, attrs); } public CompactLineSpacingTextView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override protected void onDraw(Canvas canvas) { TextPaint paint = getPaint(); paint.setColor(getCurrentTextColor()); paint.drawableState = getDrawableState(); String text = getText().toString(); if (text.isEmpty()) { super.onDraw(canvas); return; } Layout layout = getLayout(); float lineHeight = layout.getLineHeight(); for (int i = 0; i < layout.getLineCount(); i++) { float x = layout.getLineLeft(i); // 计算每行Y坐标,默认基础上叠加自定义偏移 float y = layout.getLineTop(i) + getPaddingTop() + (lineHeight - paint.getFontMetrics().bottom + paint.getFontMetrics().top) / 2 - paint.getFontMetrics().top; if (i > 0) { y += mExtraLineOffset; } canvas.drawText(text, layout.getLineStart(i), layout.getLineEnd(i), x, y, paint); } } // 提供动态设置偏移值的方法 public void setExtraLineOffset(int offset) { mExtraLineOffset = offset; invalidate(); } }
布局中使用该自定义TextView:
<your.package.name.CompactLineSpacingTextView android:layout_width="wrap_content" android:layout_height="wrap_content" style="@style/m_ui_medium_02" android:text="你的两行文本内容"/>
方案三:使用自定义LineHeightSpan
通过SpannableString设置自定义Span,无需修改TextView:
public class CompactLineHeightSpan implements LineHeightSpan { private final int mExtraSpacing; // 单位px,负值为缩小间距 public CompactLineHeightSpan(int extraSpacing) { mExtraSpacing = extraSpacing; } @Override public void chooseHeight(CharSequence text, int start, int end, int spanstartv, int v, Paint.FontMetricsInt fm) { fm.bottom += mExtraSpacing; fm.descent += mExtraSpacing; } }
代码中给TextView应用该Span:
TextView textView = findViewById(R.id.your_text_view); String content = "你的两行文本内容"; SpannableString spannableString = new SpannableString(content); // 传入负值(如-8px),根据需求调整 spannableString.setSpan(new CompactLineHeightSpan(-8), 0, content.length(), Spanned.SPAN_INCLUSIVE_INCLUSIVE); textView.setText(spannableString);
额外适配建议
建议使用工具类将dp转为px,保证多设备适配:
public static int dpToPx(Context context, int dp) { return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, context.getResources().getDisplayMetrics()); }
内容的提问来源于stack exchange,提问作者Priyanka Kadam
相关产品推荐
相关产品推荐

