📅  最后修改于: 2023-12-03 15:40:57.240000             🧑  作者: Mango
在 Android 6 中,为了遵从 Material Design Guidelines,行高(line height)的默认值被改变,这导致了一些排版上的问题,特别是对于那些使用了 HTML 的邮件客户端。
在 Android 6 中,TextView 的行高默认为 1.2,而在之前的版本中默认是 1.0。这造成了以下两个问题:
这两个问题都影响了邮件排版的美观度和可读性。
通过在 HTML 中设置行高,可以覆盖 Android 6 的默认值。
<table cellpadding="0" cellspacing="0" border="0">
<tr>
<td style="line-height:1.0;">
This is a line of text.
</td>
</tr>
</table>
另一种解决方案是通过使用 StyleSpan 来设置文本的行高。这种方法可以在不改变整个视图布局的情况下改变行高。
SpannableStringBuilder sb = new SpannableStringBuilder("This is a line of text.");
sb.setSpan(new StyleSpan(android.graphics.Typeface.NORMAL), 0, sb.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
sb.setSpan(new LineHeightSpan() {
@Override
public void chooseHeight(CharSequence text, int start, int end, int spanstartv, int v, FontMetricsInt fm) {
fm.descent += fm.descent - fm.bottom;
fm.bottom = fm.descent - (int) (fm.descent / 3.0F); // 自定义行高
fm.ascent -= (fm.descent - fm.bottom);
fm.top = fm.ascent;
}
}, 0, sb.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(sb);
自定义 TextView 也是一种解决方案,可以实现完全自定义的行高。
public class CustomTextView extends TextView {
private int lineHeight;
public CustomTextView(Context context) {
this(context, null);
}
public CustomTextView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public CustomTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
TypedArray a = context.obtainStyledAttributes(attrs, new int[]{android.R.attr.lineHeight});
lineHeight = a.getDimensionPixelSize(0, 0);
a.recycle();
}
@Override
protected void onDraw(Canvas canvas) {
Paint.FontMetrics fm = getPaint().getFontMetrics();
float paddingTop = (lineHeight - (fm.descent - fm.ascent)) / 2.0f;
canvas.translate(0, paddingTop);
super.onDraw(canvas);
}
}
在布局文件中使用 CustomTextView:
<com.example.CustomTextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="This is a line of text."
android:lineHeight="24dp" />
Android 6 中的行高问题虽然造成了让人困扰,但是通过以上的解决方案,我们仍可以在邮件开发中实现良好的视觉效果。