最近项目需要,做一个类似日记编写的界面。
大家都知道,一个单纯的EditText是没有类似下划线的分行标记的。所以看起来会比较吃力。当我们在编辑一段很长的文本的时候。首先想到的就是一个像纸质笔记本一样的平面,有一行一行的分在那里。这样,看上去就会舒服很多。就如一本泛黄的笔记本,有一种让人书写的欲望。
这个控件的使用场合是大块的文本编辑框,比如你想要一个EditText在没有任何编辑输入的时候就充满你们半个屏幕或者更大,你就可能会用到这个控件。来看一下效果图:
图1.
下面是我编辑了很多行之后的效果:
图2
在使用这个控件的时候,可以设定你需要的空白显示行数,也就是在没有任何编辑的情况下,需要这个输入框显示多少行。调用setNotesMinLines这个方法。很显然,我的demo里面我是设定了7行,如图1。其他的还有需要注意的是,下划线的位移差。根据edittext字的大小不同,还有行间距的不同,为了使下划线画的更自然,我们可以设定一个下划线针对文字的位移差。一般,字大小在20sp,行间距是1.2倍行间距,采用10的这么一个位移差较合适。你们可以根据不同的需要自行调整。下划线的颜色也可以自行修改。这里我没有封装方法,写死掉了。
以下是该控件的主要代码:
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.widget.EditText;
public class NoteEditor extends EditText{
/**
* 提前需要画的线的条数
*/
private int drawLine = 1;
/**
* 为了不让指针压线太明显,将线下移的像素,可根据字体大小和行间距自己调整
*/
public int lineDis = 8;
private Rect mRect;
private Paint mPaint;
public NoteEditor(Context context, AttributeSet attrs) {
super(context, attrs);
// TODO Auto-generated constructor stub
mRect = new Rect();
mPaint = new Paint();
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setColor(0x800000FF);
}
public void setNotesMinLines(int lines){
this.drawLine = lines;
setMinLines(lines);
}
@Override
protected void onDraw(Canvas canvas) {
int count = getLineCount();
Rect r = mRect;
Paint paint = mPaint;
int basicline = 0;
//第一次画第一条线。以后每次输入,换行时仍然检测,继续画线
for (int i = 0; i < count; i++) {
int baseline = getLineBounds(i, r);
basicline = baseline;
canvas.drawLine(r.left, baseline + lineDis, r.right, baseline + lineDis, paint);
}
//根据判定条件,画出固定条数的线,从第二套开始画
if(count < drawLine){
for (int j = 1; j < drawLine; j++) {
int baseline = basicline+j*getLineHeight();
canvas.drawLine(r.left, baseline + lineDis, r.right, baseline + lineDis, paint);
}
}
super.onDraw(canvas);
}
}
demo下载地址: 点这里