Drawing multiple lines in edittext e.g. notepad

后端 未结 4 1687
不思量自难忘°
不思量自难忘° 2020-11-27 19:43

I was taking a look at the notepad sample in the android SDK see here: http://developer.android.com/resources/samples/NotePad/src/com/example/android/notepad/NoteEditor.html

相关标签:
4条回答
  • 2020-11-27 20:21
    <com.example.goh2.pronoornotepad.LinedEditText
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:background="#ffffcc4b"
            android:gravity="top|left"
            android:singleLine="false"
            android:text=""
         />
    

    The above XML works with the code from Max4ever's answer:

       public class LinedEditText extends EditText {
        private Rect mRect;
        private Paint mPaint;
    
    // we need this constructor for LayoutInflater
       public LinedEditText(Context context, AttributeSet attrs) {
        super(context, attrs);
    
        mRect = new Rect();
        mPaint = new Paint();
        mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
        mPaint.setColor(R.color.edit_note_line); //SET YOUR OWN COLOR HERE
    }
    
    @Override
    protected void onDraw(Canvas canvas) {
        //int count = getLineCount();
    
        int height = getHeight();
        int line_height = getLineHeight();
    
        int count = height / line_height;
    
        if (getLineCount() > count)
            count = getLineCount();//for long text with scrolling
    
        Rect r = mRect;
        Paint paint = mPaint;
        int baseline = getLineBounds(0, r);//first line
    
        for (int i = 0; i < count; i++) {
    
            canvas.drawLine(r.left, baseline + 1, r.right, baseline + 1, paint);
            baseline += getLineHeight();//next line
        }
    
        super.onDraw(canvas);
        }
     }
    
    0 讨论(0)
  • 2020-11-27 20:36

    I think this is what you need:

    public class LinedEditText extends EditText {
    
        private static Paint linePaint;
    
        static {
            linePaint = new Paint();
            linePaint.setColor(Color.BLACK);
            linePaint.setStyle(Style.STROKE);
        }
    
        public LinedEditText(Context context, AttributeSet attributes) {
            super(context, attributes);
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            Rect bounds = new Rect();
            int firstLineY = getLineBounds(0, bounds);
            int lineHeight = getLineHeight();
            int totalLines = Math.max(getLineCount(), getHeight() / lineHeight);
    
            for (int i = 0; i < totalLines; i++) {
                int lineY = firstLineY + i * lineHeight;
                canvas.drawLine(bounds.left, lineY, bounds.right, lineY, linePaint);
            }
    
            super.onDraw(canvas);
        }
    
    
    }
    
    0 讨论(0)
  • 2020-11-27 20:36

    maybe after that for loop, you draw estimated* additional lines.

    getHeight() will return EditText's height in pixels getLineHeight() will height of one standard line

    so getHeight/getlineHeight-getCount will be number of lines left to draw.

    you can't use getLineBounds, using the above functions you could calculate the position of the remaining lines to draw.

    *Estimated since formatting of text could change the line height, but since there is no text in these lines yet that shouldnt be an issue. But for that same reason you should only draw the remaining lines, and not use this to draw all the lines.

    0 讨论(0)
  • 2020-11-27 20:41

    This is the code, based on jkhouws1's suggestion and google's note editor

    public class LinedEditText extends EditText {
        private Rect mRect;
        private Paint mPaint;
    
        // we need this constructor for LayoutInflater
        public LinedEditText(Context context, AttributeSet attrs) {
            super(context, attrs);
    
            mRect = new Rect();
            mPaint = new Paint();
            mPaint.setStyle(Paint.Style.FILL_AND_STROKE);
            mPaint.setColor(R.color.edit_note_line); //SET YOUR OWN COLOR HERE
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            //int count = getLineCount();
    
            int height = getHeight();
            int line_height = getLineHeight();
    
            int count = height / line_height;
    
            if (getLineCount() > count)
                count = getLineCount();//for long text with scrolling
    
            Rect r = mRect;
            Paint paint = mPaint;
            int baseline = getLineBounds(0, r);//first line
    
            for (int i = 0; i < count; i++) {
    
                canvas.drawLine(r.left, baseline + 1, r.right, baseline + 1, paint);
                baseline += getLineHeight();//next line
            }
    
            super.onDraw(canvas);
        }
    }
    

    In Eclipse IDE press Ctrl+Shift+O to add all needed imports

    0 讨论(0)
提交回复
热议问题