I had the same problem and decided to create an EllipsizeLineSpan class. You can wrap each line that you want to ellipse with it.
Example for marking with this line:
SpannableStringBuilder textspan = new SpannableStringBuilder("#1.Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\n"+ "Protect from ellipsizing #2.Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\n"+ "#3.Lorem ipsum dolor sit amet, consectetur adipisicing elit\n"+ "#4.Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.\n"); // find ellipsizable text (from '#' to newline) Pattern pattern = Pattern.compile("#.*\\n", Pattern.CASE_INSENSITIVE); Matcher matcher = pattern.matcher(textspan); while(matcher.find()) { textspan.setSpan(new EllipsizeLineSpan(), matcher.start(), matcher.end(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); }
EllipsizeLineSpan:
public class EllipsizeLineSpan extends ReplacementSpan implements LineBackgroundSpan { int layoutLeft = 0; int layoutRight = 0; public EllipsizeLineSpan () { } @Override public void drawBackground (Canvas c, Paint p, int left, int right, int top, int baseline, int bottom, CharSequence text, int start, int end, int lnum) { Rect clipRect = new Rect(); c.getClipBounds(clipRect); layoutLeft = clipRect.left; layoutRight = clipRect.right; } @Override public int getSize (Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) { return layoutRight - layoutLeft; } @Override public void draw (Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) { float textWidth = paint.measureText(text, start, end); if (x + (int) Math.ceil(textWidth) < layoutRight) {