TextView默认padding

2019-04-22  本文已影响0人  胡洁_ec66

又是一周新的开始,天气还是有点不好,雾霾还是比较严重。
不吐槽天气了,今天把日程开发中最常用控件的一个小问题做一下记录吧。

TextView 在我们日程开发中是最常用的控件了。TextView在不设置任何padding的情况下,内部仍是有默认padding的,而且会随着字体改变。在有些时候跟我们的需求不太一样,就需要把默认的padding去掉了。

TextView中android:includeFontPadding属性其默认值是true,也就是包含了字体的padding。我们将属性改为false,来去掉字体的padding。改会影响TextView和上方控件的间距,不影响下方控件的间距,此外即使去掉了字体padding,TextView控件和上方的控件仍然会有一定的间距,只是此间距会比有字体padding时要小。
那么要想去掉这个默认的间距只能通过自定义TextView来实现了。

自定义TextView实现

public class NoDefaultPaddingTextView extends TextView {
   private final Paint mPaint = new Paint();

    private final Rect mBounds = new Rect();

    private boolean noDefaultPadding = true;

    public NoDefaultPaddingTextView(Context context) {
        this(context, null);
    }

    public NoDefaultPaddingTextView(Context context, @Nullable AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public NoDefaultPaddingTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        initAttrs(context,attrs,defStyleAttr);
    }

    private void initAttrs(Context context, AttributeSet attrs, int defStyleAttr) {
        TypedArray ta = context.obtainStyledAttributes(attrs, R.styleable.NoDefaultPaddingTextView);
        noDefaultPadding = ta.getBoolean(R.styleable.NoDefaultPaddingTextView_no_defalut_padding,true);
        ta.recycle();
    }


    @Override
    protected void onDraw(@NonNull Canvas canvas) {
        if(noDefaultPadding){
            final String text = calculateTextParams();
            final int left = mBounds.left;
            final int bottom = mBounds.bottom;
            mBounds.offset(-mBounds.left, -mBounds.top);
            mPaint.setAntiAlias(true);
            mPaint.setColor(getCurrentTextColor());
            canvas.drawText(text, -left, mBounds.bottom - bottom, mPaint);
        }else {
            super.onDraw(canvas);
        }
    }


    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        if(noDefaultPadding){
            calculateTextParams();
            setMeasuredDimension(mBounds.right - mBounds.left, -mBounds.top + mBounds.bottom);
        }

    }

    private String calculateTextParams() {
        final String text = getText().toString();
        final int textLength = text.length();
        mPaint.setTextSize(getTextSize());
        mPaint.getTextBounds(text, 0, textLength, mBounds);
        if (textLength == 0) {
            mBounds.right = mBounds.left;
        }
        return text;
    }
}

自定义属性

  <declare-styleable name="NoDefaultPaddingTextView">
        <attr name="no_defalut_padding" format="boolean"/>
  </declare-styleable>

使用就简单了,直接填写属性就可以了。
参考:https://blog.csdn.net/lilealyh/article/details/77468083

上一篇下一篇

猜你喜欢

热点阅读