Android可以在EditText中绘制行号吗?
不包括单词换行? 我想做的是让一个类扩展Android可以在EditText中绘制行号吗?,android,android-edittext,android-canvas,Android,Android Edittext,Android Canvas,不包括单词换行? 我想做的是让一个类扩展EditText在每行的左侧绘制行号。从表面上看,这非常简单,通过迭代行0到super.getLineCount()并在行首绘制索引 但我看到的不是简单的说和做;跳过已包装的行(不以\n结尾的行)。例如,在vim中,它希望: 我用于执行上述场景的内容(行计数不跳过包装行) 受保护的void onDraw(画布){ ... int count=getLineCount(); 对于(int i=0;i
EditText
在每行的左侧绘制行号。从表面上看,这非常简单,通过迭代行0
到super.getLineCount()
并在行首绘制索引
但我看到的不是简单的说和做;跳过已包装的行(不以\n
结尾的行)。例如,在vim中,它希望:
我用于执行上述场景的内容(行计数不跳过包装行)
受保护的void onDraw(画布){
...
int count=getLineCount();
对于(int i=0;i
如何检测哪些行是文字换行,哪些行是换行?我推荐。()
@覆盖
受保护的void onDraw(画布){
int baseline=getBaseline()
对于(int i=0;i
按照Mike所说的,您可以通过检查每个渲染线来完成此操作,查看它是实际线(前面是换行符\n
)还是文字换行线,如果是实际线,则只增加/绘制线号
protected void onDraw(Canvas canvas) {
int count = getLineCount();
int lineNumber = 1;
for (int i = 0; i < count; ++i) {
getLineBounds(i, mRect);
String num = String.valueOf(i + 1);
mPaint.getTextBounds(num, 0, num.length(), mNumberRect);
if (i == 0) {
canvas.drawText(num, NUMBER_LEFT_PAD, mRect.top + mTextHeight - 5, mPaint);
++lineNumber;
} else if (getText().charAt(getLayout().getLineStart(i) - 1) == '\n') {
canvas.drawText(num, NUMBER_LEFT_PAD, mRect.top + mTextHeight - 5, mPaint);
++lineNumber;
}
}
super.onDraw(canvas);
}
受保护的void onDraw(画布){
int count=getLineCount();
int lineNumber=1;
对于(int i=0;i
即兴编写@Lrdwhyt answer中的代码,我实现了EditText的子类,如下所示。它还根据行号文本宽度设置EditText的左填充
public class LineNumberedEditText extends EditText
{
private final Context context;
private Rect rect;
private Paint paint;
public LineNumberedEditText(Context context)
{
super(context);
this.context = context;
init();
}
public LineNumberedEditText(Context context, AttributeSet attrs)
{
super(context, attrs);
this.context = context;
init();
}
public LineNumberedEditText(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
this.context=context;
init();
}
private void init()
{
rect = new Rect();
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.GRAY);
paint.setTextSize(20);
paint.setTypeface(Typeface.MONOSPACE);
}
@Override
protected void onDraw(Canvas canvas) {
int baseline;
int lineCount = getLineCount();
int lineNumber = 1;
for (int i = 0; i < lineCount; ++i)
{
baseline=getLineBounds(i, null);
if (i == 0)
{
canvas.drawText(""+lineNumber, rect.left, baseline, paint);
++lineNumber;
}
else if (getText().charAt(getLayout().getLineStart(i) - 1) == '\n')
{
canvas.drawText(""+lineNumber, rect.left, baseline, paint);
++lineNumber;
}
}
// for setting edittext start padding
if(lineCount<100)
{
setPadding(40,getPaddingTop(),getPaddingRight(),getPaddingBottom());
}
else if(lineCount>99 && lineCount<1000)
{
setPadding(50,getPaddingTop(),getPaddingRight(),getPaddingBottom());
}
else if(lineCount>999 && lineCount<10000)
{
setPadding(60,getPaddingTop(),getPaddingRight(),getPaddingBottom());
}
else if(lineCount>9999 && lineCount<100000)
{
setPadding(70,getPaddingTop(),getPaddingRight(),getPaddingBottom());
}
super.onDraw(canvas);
}
}
公共类LineNumberEditText扩展了EditText
{
私人最终语境;
私人直肠;
私人油漆;
公共LineNumberEditText(上下文)
{
超级(上下文);
this.context=上下文;
init();
}
公共LineNumberEditText(上下文、属性集属性)
{
超级(上下文,attrs);
this.context=上下文;
init();
}
公共LineNumberEditText(上下文上下文、属性集属性、int-defStyle)
{
超级(上下文、属性、定义样式);
this.context=context;
init();
}
私有void init()
{
rect=新的rect();
油漆=新油漆(油漆.防油漆别名标志);
绘制.设置样式(绘制.样式.填充);
油漆。设置颜色(颜色。灰色);
油漆.尺寸(20);
绘制.setTypeface(字体.MONOSPACE);
}
@凌驾
受保护的void onDraw(画布){
int基线;
int lineCount=getLineCount();
int lineNumber=1;
对于(int i=0;i if(lineCount99&&lineCount999&&lineCount9999&&lineCount99&&lineCount这正是我试图在这个问题上努力避免的。我的整个问题都在解释这(我现在拥有的)和我试图完成的之间的区别。无论如何,谢谢。getLayout().getLineStart(I)
将为您提供给定行上第一个字符的位置。检查位置-1
字符是否为\n
,如果是,则不要绘制行号。您需要使用单独的int
来跟踪绘制的行号。
protected void onDraw(Canvas canvas) {
int count = getLineCount();
int lineNumber = 1;
for (int i = 0; i < count; ++i) {
getLineBounds(i, mRect);
String num = String.valueOf(i + 1);
mPaint.getTextBounds(num, 0, num.length(), mNumberRect);
if (i == 0) {
canvas.drawText(num, NUMBER_LEFT_PAD, mRect.top + mTextHeight - 5, mPaint);
++lineNumber;
} else if (getText().charAt(getLayout().getLineStart(i) - 1) == '\n') {
canvas.drawText(num, NUMBER_LEFT_PAD, mRect.top + mTextHeight - 5, mPaint);
++lineNumber;
}
}
super.onDraw(canvas);
}
public class LineNumberedEditText extends EditText
{
private final Context context;
private Rect rect;
private Paint paint;
public LineNumberedEditText(Context context)
{
super(context);
this.context = context;
init();
}
public LineNumberedEditText(Context context, AttributeSet attrs)
{
super(context, attrs);
this.context = context;
init();
}
public LineNumberedEditText(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
this.context=context;
init();
}
private void init()
{
rect = new Rect();
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.GRAY);
paint.setTextSize(20);
paint.setTypeface(Typeface.MONOSPACE);
}
@Override
protected void onDraw(Canvas canvas) {
int baseline;
int lineCount = getLineCount();
int lineNumber = 1;
for (int i = 0; i < lineCount; ++i)
{
baseline=getLineBounds(i, null);
if (i == 0)
{
canvas.drawText(""+lineNumber, rect.left, baseline, paint);
++lineNumber;
}
else if (getText().charAt(getLayout().getLineStart(i) - 1) == '\n')
{
canvas.drawText(""+lineNumber, rect.left, baseline, paint);
++lineNumber;
}
}
// for setting edittext start padding
if(lineCount<100)
{
setPadding(40,getPaddingTop(),getPaddingRight(),getPaddingBottom());
}
else if(lineCount>99 && lineCount<1000)
{
setPadding(50,getPaddingTop(),getPaddingRight(),getPaddingBottom());
}
else if(lineCount>999 && lineCount<10000)
{
setPadding(60,getPaddingTop(),getPaddingRight(),getPaddingBottom());
}
else if(lineCount>9999 && lineCount<100000)
{
setPadding(70,getPaddingTop(),getPaddingRight(),getPaddingBottom());
}
super.onDraw(canvas);
}
}