📜  电子邮件开发中的 Android 6 行高问题 (1)

📅  最后修改于: 2023-12-03 15:40:57.240000             🧑  作者: Mango

电子邮件开发中的 Android 6 行高问题

在 Android 6 中,为了遵从 Material Design Guidelines,行高(line height)的默认值被改变,这导致了一些排版上的问题,特别是对于那些使用了 HTML 的邮件客户端。

问题描述

在 Android 6 中,TextView 的行高默认为 1.2,而在之前的版本中默认是 1.0。这造成了以下两个问题:

  1. 行距(行间距)显得太大,导致邮件内容过于稀疏;
  2. 行高和字号的比例不像之前那么合理,导致文字显得过于紧凑。

这两个问题都影响了邮件排版的美观度和可读性。

解决方案
方案一:在 HTML 中设置行高

通过在 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 设置行高

另一种解决方案是通过使用 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

自定义 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 中的行高问题虽然造成了让人困扰,但是通过以上的解决方案,我们仍可以在邮件开发中实现良好的视觉效果。