咨询:如何实现带方框编号的自定义EditText设计
实现图中分段横线样式的EditText方案
要做出图里这种类似笔记本横线的EditText,有几个实用的实现方式:
方案一:自定义背景Drawable(最简单)
直接给EditText设置带重复横线的背景,不用写Java/Kotlin代码:
- 在
res/drawable文件夹下新建edittext_notebook_bg.xml:
<?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android"> <!-- 输入框的底边框 --> <item> <shape android:shape="rectangle"> <solid android:color="#ffffff" /> <stroke android:width="1dp" android:color="#cccccc" /> </shape> </item> <!-- 重复的横向分隔线 --> <item> <bitmap android:src="@drawable/horizontal_line" android:tileMode="repeat" android:gravity="top" /> </item> </layer-list>
- 再建
horizontal_line.xml(用来做重复的单条横线):
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="line"> <stroke android:width="1dp" android:color="#cccccc" /> <!-- 这里的height对应每行的高度,要和EditText的行高匹配 --> <size android:height="48dp" /> </shape>
- 布局里用这个EditText:
<EditText android:id="@+id/notebook_et" android:layout_width="match_parent" android:layout_height="wrap_content" android:background="@drawable/edittext_notebook_bg" android:padding="16dp" android:lineSpacingExtra="8dp" android:gravity="top" />
方案二:自定义EditText(最灵活)
如果需要随输入行数自动调整横线数量、改线的颜色/粗细,就自己写个EditText子类重写绘制逻辑:
import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.util.AttributeSet; import android.widget.EditText; public class NotebookEditText extends EditText { private Paint linePaint; public NotebookEditText(Context context) { super(context); initPaint(); } public NotebookEditText(Context context, AttributeSet attrs) { super(context, attrs); initPaint(); } public NotebookEditText(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); initPaint(); } private void initPaint() { // 初始化横线画笔 linePaint = new Paint(); linePaint.setColor(getResources().getColor(R.color.gray_light)); // 替换成你要的颜色 linePaint.setStrokeWidth(1f); // 关掉默认背景,避免和自定义横线冲突 setBackground(null); } @Override protected void onDraw(Canvas canvas) { int lineHeight = getLineHeight(); int totalLines = getLineCount(); int visibleLines = getHeight() / lineHeight; // 绘制所有可见的横线,包括输入框内的空白行 for (int i = 0; i < visibleLines || i < totalLines; i++) { float y = (i + 1) * lineHeight + getPaddingTop(); canvas.drawLine(getPaddingLeft(), y, getWidth() - getPaddingRight(), y, linePaint); } // 先画横线再画文字,防止文字被盖住 super.onDraw(canvas); } }
布局里直接用这个自定义View:
<com.yourpackagename.NotebookEditText android:layout_width="match_parent" android:layout_height="240dp" android:padding="16dp" android:lineSpacingExtra="4dp" android:gravity="top" />
方案三:快速凑活版
如果只是临时要个类似效果,也可以用android:drawableTop加重复Drawable,但灵活性差,适合快速测试:
<EditText android:layout_width="match_parent" android:layout_height="wrap_content" android:drawableTop="@drawable/horizontal_line" android:drawablePadding="0dp" android:background="@drawable/edittext_border" />
内容的提问来源于stack exchange,提问作者groff07
相关产品推荐
相关产品推荐

