实现本子那种可以呈现很多行分割线的文本框遇到问题,尝试了多种EditText组件的功能仍然不能实现对应的效果。虽然EditText提供了多行输入的功能但是并没有为每行绘制出对应的分割线。
实现以上效果的xml文件设置如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/background_color"
android:orientation="vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/title"
android:textSize="18dp"
android:textStyle="bold|italic"
android:layout_marginLeft="8dp"
/>
<EditText android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="@string/title"
android:textSize="16dp"
android:layout_marginRight="45dp"
android:id="@+id/edit_memorandum_title"/>
<com.zyhust.memorandum.MyMultiLineEditText
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginRight="50dp"
android:layout_marginLeft="15dp"
android:gravity="top"
android:singleLine="false"
android:hint="@string/context"
/>
</LinearLayout>
重头戏来了以下是实现多行文本框的代码:
package com.zyhust.memorandum;
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.util.AttributeSet;
import android.widget.EditText;
/**
* Created by Administrator on 2015/12/6.
*/
public class MyMultiLineEditText extends EditText {
private static final String TAG = "MyMultiLineEditText";
private Paint linePaint;
private float margin;
private int paperColor;
private Rect mRect;
public MyMultiLineEditText(Context paramContext, AttributeSet paramAttributeSet){
super(paramContext, paramAttributeSet);
mRect = new Rect();
linePaint = new Paint();
}
public void onDraw(Canvas paramCanvas){
//设置画笔的颜色
paramCanvas.drawColor(this.paperColor);
Rect r = mRect;
//获取text的行数这个行数是基于当前输入的文本的内容的行数
int lineCount = getLineCount();
//获取EditText组件的高度
int height = getHeight();
//获取EditText组件一行的高度
int lineHeight = getLineHeight();
int m = 1 + height / lineHeight;
if (lineCount < m)
lineCount = m;
//返回指定的的baseline这里的baseline指的是0-getLineHeight()-1;
//getLineBounds返回的值是baseline的y坐标
int n = getLineBounds(0, r);
paramCanvas.drawLine(0.0F, n, getRight(), n, this.linePaint);
for (int i = 0;; i++) {
if (i >= lineCount) {
setPadding(10 + (int) this.margin, 0, 0, 0);
super.onDraw(paramCanvas);
paramCanvas.restore();
return;
}
//绘制每一行的分割线
n += lineHeight;
paramCanvas.drawLine(0.0F, n, getRight(), n, this.linePaint);
paramCanvas.save();
}
}
}