2017-08-06 51 views
0

不包括单词包装线?Android可能在EditText中绘制行号?

我想要做的是有一个类延伸EditText画行号到每一行的左边。在它的表面上,通过迭代行0super.getLineCount()并在行首开始绘制索引,这非常简单。

但是我没有看到一个简单的说法;跳过被包装的行(不以\n结束的行)。例如在vim它想:

example

什么我用做上述方案(线数未跳过换行)

protected void onDraw(Canvas canvas) { 

...   
     int count = getLineCount(); 
     for (int i = 0; i < count; ++i) { 
      getLineBounds(i, mRect); 
      String num = String.valueOf(i + 1); 
      mPaint.getTextBounds(num, 0, num.length(), mNumberRect); 
      canvas.drawText(num, NUMBER_LEFT_PAD, mRect.top + mTextHeight - 5, mPaint); 
     } 

... 

    super.onDraw(canvas); 
} 

我怎么会检测哪些线是字包线和哪些线是虚线?

+0

'getLayout()。getLineStart(i)'会给你第一个字符在给定行上的位置。检查'position - 1'字符是否为'\ n',如果是,则不要画出行号。您需要使用单独的“int”来跟踪绘制的线数。 –

回答

-1

我推荐它。(draw line numbers in edittext

@Override 
     protected void onDraw(Canvas canvas) { 
      int baseline = getBaseline() 
      for (int i = 0; i < getLineCount(); i++) { 
       canvas.drawText("" + (i+1), rect.left, baseline, paint); 
       baseline += getLineHeight(); 
      } 
      super.onDraw(canvas); 
     } 
+2

这正是我试图避免这个问题的努力。我的问题的整个身体正在解释这(我现在有什么)和我想要完成的事情之间的区别。不管怎么说,还是要谢谢你。 –

1

都会响起迈克说,你可以通过检查每个渲染管线,看它是否是一个真正的线(由换行符\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); 
}