又是一周新的开始,天气还是有点不好,雾霾还是比较严重。
不吐槽天气了,今天把日程开发中最常用控件的一个小问题做一下记录吧。
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
网友评论