功能背景:
为了用户分享的笔记更美观,对用户编辑的描述增加划线
功能实现原理:
其实很简单就是在EditText调用绘制方法(onDraw())的时候,我们手动的绘制一条条直线即可
功能的具体实现:
第一步:初始化View
private float mStrokeWidth;
private Paint mPaint;
Rect mRect;
private Paint.FontMetrics fm;
private float mDescemt;
private int mTextHeight;
private int mLineSpace;
public LineEditText(Context context) {
this(context, null);
}
public LineEditText(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public LineEditText(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
//文本置顶
setGravity(Gravity.TOP);
mStrokeWidth = DisplayUtils.dipToPixel(getContext(), 0.5f);
mPaint = new Paint();
//抗锯齿,
mPaint.setAntiAlias(true);
//画笔颜色
mPaint.setColor(getResources().getColor(R.color.ff_ececec));
//画笔宽度
mPaint.setStrokeWidth(mStrokeWidth);
//用于计算每一行文字的基线位置
mRect = new Rect();
fm = getPaint().getFontMetrics();
//文字的基线
mDescemt = fm.descent;
mTextHeight = (int) (fm.bottom - fm.top);
//这里是线与线的高度
mLineSpace = DisplayUtils.dipToPixel(getContext(), 10f);
}
第二步:绘制
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
int lineCount = getLineCount();
for (int i = 0, size = (lineCount < 3 ? 3 : lineCount); i < size; i++) {
if (i < lineCount) {
canvas.drawLine(0, getLineBounds(i, mRect) + mDescemt
, getWidth(), getLineBounds(i, mRect) + mDescemt, mPaint);
} else {
canvas.drawLine(0, (mLineSpace * i + (getLineBounds(0, mRect) + mDescemt) * (i + 1))
, getWidth(), (mLineSpace * i + (getLineBounds(0, mRect) + mDescemt) * (i + 1)), mPaint);
}
}
}
总结: 这里直接继承的EditText