在edittext中绘制多行,例如记事本

我正在看Android SDK中的记事本示例,请看这里: http : //developer.android.com/resources/samples/NotePad/src/com/example/android/notepad/NoteEditor.html

事情是只绘制光标所在的当前行,例如http://cdn2.staztic.com/screenshots/simple-notepad-app-al-1.jpg

但是我想要显示填满屏幕的行,例如http://www.itismyworld.info/wp-content/uploads/2010/03/AK-notebook.png

任何build议将是伟大的。 代码的相关部分似乎在这里:

protected void onDraw(Canvas canvas) { // Gets the number of lines of text in the View. int count = getLineCount(); // Gets the global Rect and Paint objects Rect r = mRect; Paint paint = mPaint; /* * Draws one line in the rectangle for every line of text in the EditText */ for (int i = 0; i < count; i++) { // Gets the baseline coordinates for the current line of text int baseline = getLineBounds(i, r); /* * Draws a line in the background from the left of the rectangle to the right, * at a vertical position one dip below the baseline, using the "paint" object * for details. */ canvas.drawLine(r.left, baseline + 1, r.right, baseline + 1, paint); } // Finishes up by calling the parent method super.onDraw(canvas); } 

这是基于jkhouws1的build议和谷歌笔记编辑器的代码

 public class LinedEditText extends EditText { private Rect mRect; private Paint mPaint; // we need this constructor for LayoutInflater public LinedEditText(Context context, AttributeSet attrs) { super(context, attrs); mRect = new Rect(); mPaint = new Paint(); mPaint.setStyle(Paint.Style.FILL_AND_STROKE); mPaint.setColor(R.color.edit_note_line); //SET YOUR OWN COLOR HERE } @Override protected void onDraw(Canvas canvas) { //int count = getLineCount(); int height = getHeight(); int line_height = getLineHeight(); int count = height / line_height; if (getLineCount() > count) count = getLineCount();//for long text with scrolling Rect r = mRect; Paint paint = mPaint; int baseline = getLineBounds(0, r);//first line for (int i = 0; i < count; i++) { canvas.drawLine(r.left, baseline + 1, r.right, baseline + 1, paint); baseline += getLineHeight();//next line } super.onDraw(canvas); } } 

在Eclipse IDE中,按Ctrl + Shift + O添加所有需要的导入

我认为这是你需要的:

 public class LinedEditText extends EditText { private static Paint linePaint; static { linePaint = new Paint(); linePaint.setColor(Color.BLACK); linePaint.setStyle(Style.STROKE); } public LinedEditText(Context context, AttributeSet attributes) { super(context, attributes); } @Override protected void onDraw(Canvas canvas) { Rect bounds = new Rect(); int firstLineY = getLineBounds(0, bounds); int lineHeight = getLineHeight(); int totalLines = Math.max(getLineCount(), getHeight() / lineHeight); for (int i = 0; i < totalLines; i++) { int lineY = firstLineY + i * lineHeight; canvas.drawLine(bounds.left, lineY, bounds.right, lineY, linePaint); } super.onDraw(canvas); } } 

也许在循环之后,你画估计的*额外的线。

getHeight()将以像素为单位返回EditText的高度getLineHeight()将标准线的高度

所以getHeight / getlineHeight-getCount将是剩下的线数。

你不能使用getLineBounds,使用上面的函数可以计算剩下的线的位置来绘制。

*由于文本的格式化可能会改变行高,但由于这些行中没有文本,所以不应该是一个问题。 但是出于同样的原因,你应该只绘制其余的线,而不是用这个绘制所有的线。

 <com.example.goh2.pronoornotepad.LinedEditText android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ffffcc4b" android:gravity="top|left" android:singleLine="false" android:text="" /> 

上面的XML与Max4ever的答案中的代码一起工作 :

  public class LinedEditText extends EditText { private Rect mRect; private Paint mPaint; // we need this constructor for LayoutInflater public LinedEditText(Context context, AttributeSet attrs) { super(context, attrs); mRect = new Rect(); mPaint = new Paint(); mPaint.setStyle(Paint.Style.FILL_AND_STROKE); mPaint.setColor(R.color.edit_note_line); //SET YOUR OWN COLOR HERE } @Override protected void onDraw(Canvas canvas) { //int count = getLineCount(); int height = getHeight(); int line_height = getLineHeight(); int count = height / line_height; if (getLineCount() > count) count = getLineCount();//for long text with scrolling Rect r = mRect; Paint paint = mPaint; int baseline = getLineBounds(0, r);//first line for (int i = 0; i < count; i++) { canvas.drawLine(r.left, baseline + 1, r.right, baseline + 1, paint); baseline += getLineHeight();//next line } super.onDraw(canvas); } }