删除TextView上下内边距

原理参考: https://blog.csdn.net/harvic880925/article/details/50423762

通过自定义控件删除上下内边距, UI走查时就不用担心间距不对了。


image.png

代码:

public class MyTextView extends TextView {

  public MyTextView(Context context) {
    super(context);
  }

  public MyTextView(Context context, AttributeSet attrs) {
    super(context, attrs);

    setGravity(getGravity() | Gravity.CENTER_VERTICAL);
    setIncludeFontPadding(false);
  }

  public MyTextView(Context context,  AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
  }

  @Override protected void onDraw(Canvas canvas) {
    Paint.FontMetrics fm = getPaint().getFontMetrics();
    if (fm != null) {
      if (getScrollY() != (int)(fm.ascent-fm.top)) {
        setScrollY((int) (fm.ascent - fm.top));
      }
    }

    super.onDraw(canvas);
  }

  @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    super.onMeasure(widthMeasureSpec, heightMeasureSpec);

    int padding = 0;
    Paint.FontMetrics fm = getPaint().getFontMetrics();
    if (fm != null) {
      padding = (int) Math.abs(fm.top - fm.ascent) + (int) Math.abs(fm.bottom - fm.descent);
      int width = getMeasuredWidth();
      int heiht = getMeasuredHeight();

      if (getText().toString().contains("g")
           || getText().toString().contains("y")
           || getText().toString().contains("p")) {
        setMeasuredDimension(width, heiht - padding);
      } else {
        setMeasuredDimension(width, heiht - padding - (int)(getTextSize()*0.1));
      }
    }
  }

缺陷:
因为无法判断TextView的字符下边界是否超过其它字符, 如果都是中文就没问题。 但p、q、g等字符下边界比较低, 这类字符需要单独判断, 可能会漏掉一些字符。

你可能感兴趣的:(删除TextView上下内边距)