簡體   English   中英

如何在每行文本前的空格中繪制點或線 - Java

[英]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);
    }
}

方法getPrimaryHorizontal()給你

在段落的主要方向上插入新字符的位置

這意味着您將獲得一個像素值,從View的左邊界開始測量。

如果您只輸入一個空格, x可能小於left + paddingLeft 所以這條線實際上是從startYstartX繪制的。 如果添加更多空格, xleft + 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM