[英]how to Draw points or line in the spaces before text in every line - in Java
我需要一些幫助來實現這個想法,我想要的是在 edittext onDraw 方法的每一行的每個空格之前繪制品脫或線條。 例如,我希望文本或代碼或任何內容看起來像這樣:
_____for (int i=0; i< count; i++) {
___________some code here
____________}
或者看起來像這樣:
.........for (int i=0; i< count; i++) {
............some code here
..............}
我測試並嘗試這樣做,它有效,但我有一個小問題,即當 cursor position 或文本位於線的中心時,我沒有畫線或線短然后開始之間的空間行和文本的開始。
我的問題的圖片:
[:[在此處輸入圖片描述][1]][1] [1]: https.//i.stack.imgur.com/ly5du.png
我使用的代碼是:
import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.util.AttributeSet;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class customEditText extends androidx.appcompat.widget.AppCompatEditText {
private Paint mPaint = new Paint();
private int position;
public customEditText(Context context) {
super(context);
initPaint();
}
public customEditText(Context context, AttributeSet attrs) {
super(context, attrs);
initPaint();
}
public customEditText(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
initPaint();
}
private void initPaint() {
mPaint.setStyle(Paint.Style.STROKE);
mPaint.setColor(0x80000000);
}
@Override
protected void onSelectionChanged(int selStart, int selEnd) {
position = selStart;
}
@Override protected void onDraw(Canvas canvas) {
int left = getLeft();
int paddingLeft = getPaddingLeft();
for (int i = 0; i < getLineCount(); i++) {
int ii = i;
try {
Matcher m = Pattern.compile("^\\s+|\n\\s+").matcher(getText().toString().split("\n")[ii]);
if (m.find()) {
int baseline = getLayout().getLineBaseline(ii);
float x = getLayout().getPrimaryHorizontal(m.end());
canvas.drawLine(left + paddingLeft, baseline, x, baseline, mPaint);
}
} catch (Exception r){
r.printStackTrace();
}
}
super.onDraw(canvas);
}
}
在段落的主要方向上插入新字符的位置
這意味着您將獲得一個像素值,從View
的左邊界開始測量。
如果您只輸入一個空格, x
可能小於left + paddingLeft
。 所以這條線實際上是從startY到startX繪制的。 如果添加更多空格, x
和left + paddingLeft
之間的差異將發生變化,導致該行先消失然后重新出現,但現在實際上是從startX繪制到startY 。
由於getLeft()
僅提供View
的左邊框與其父ViewGroup
的左邊框的距離,因此您無需將 的值添加到直線的起點。
但您可能希望保留getPaddingLeft()
。 如果這樣做,則應將其添加到startX值和startY值:
canvas.drawLine(paddingLeft, baseline, paddingLeft + x, baseline, mPaint);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.