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;iif(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);
    }
}