最近在做项目的过程中遇到了这个问题,就从网上搜索了一些,但是都没有注释很不好理解,所以就整理下,以供大家学习。
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.widget.EditText;
public class LineEditText extends EditText {
//默认的构造函数
public LineEditText(Context context) {
super(context);
}
private Paint linePaint; //画线需要的画笔
private float margin; //
private int paperColor; //
//EditText构造方法之一
public LineEditText(Context paramContext, AttributeSet paramAttributeSet) {
super(paramContext, paramAttributeSet);
this.linePaint = new Paint(); //新建一个画笔
this.linePaint.setStyle(Paint.Style.STROKE); //设置画笔的风格为空心
this.linePaint.setColor(Color.BLUE); //设置画笔的颜色
}
//写绘画方法
protected void onDraw(Canvas paramCanvas) {
paramCanvas.drawColor(this.paperColor);
int i = getLineCount(); //得到EditText的行数
int j = getHeight(); //得到EditText的高度 单位px
int k = getLineHeight(); //得到每一行的高度
int m = j / k; //得到行数
if (i < m)
{
i = m;
}
int n = getCompoundPaddingTop(); //EditText上方的起点,除去了padding的区域
// paramCanvas.drawLine(0.0F, n, getRight(), n, this.linePaint); //在上方顶部画一条线
for (int ii = 0;; ii++) {
if (ii >= i) {
setPadding(10 + (int) this.margin, 0, 0, 0); //设置了下padding
super.onDraw(paramCanvas); //调用父函数的绘画方法
paramCanvas.restore();
return;
}
n += k;
paramCanvas.drawLine(0.0F, n, getRight(), n, this.linePaint); //在每一行的底部画一条线
paramCanvas.save(); //保存已绘制的对象
}
}
}
另外默认的EditText 都有边框的,所以可以在布局文件中
设置android:background="@null"来消除
而且一般EditText的字体都是居中的,所以要设置
android:gravity="top"使得字体居于上方,与画的线吻合。
附xml的使用:
<com.test.EditText.LineEditText
android:layout_width="match_parent"
android:layout_height="170dp"
android:gravity="top"
android:background="@null"
android:textColor="@android:color/black"
android:inputType="textMultiLine"
/>
注意上述的引用方式跟默认的有所区别。
其余的按照默认使用就可以了。