Android TextView多行显示后仍可以展示...

多行显示后仍可以展示...
/**
 * 多行显示后仍可以展示...的TextView
 */

public class EllipsizeSupportTextView extends AppCompatTextView {
    private static final String ELLIPSIZE_END = "...";
    private int mShowMaxLine;
    /**
     * 原始文本
     */
    private CharSequence mOriginalText;

    private boolean registedPreDrawListener;


    public EllipsizeSupportTextView(Context context) {
        this(context, null);
    }


    public EllipsizeSupportTextView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    @Override
    public void setTextColor(int color) {
        super.setTextColor(color);
    }

    public EllipsizeSupportTextView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        mShowMaxLine = getMaxLines();
    }

    @Override
    public void setText(final CharSequence text, final BufferType type) {
        if (TextUtils.isEmpty(text) || mShowMaxLine <= 0) {
            super.setText(text, type);
        } else {
            if (!registedPreDrawListener) {
                getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
                    @Override
                    public boolean onPreDraw() {
                        getViewTreeObserver().removeOnPreDrawListener(this);
                        registedPreDrawListener = true;
                        formatText(text, type);
                        return true;
                    }
                });
            } else {
                formatText(text, type);
            }
        }
    }

    private void formatText(CharSequence text, final BufferType type) {
        mOriginalText = text;
        Layout layout = getLayout();
        if (layout == null || !layout.getText().equals(mOriginalText)) {
            super.setText(mOriginalText, type);
            layout = getLayout();
        }
        if (layout == null) {
            getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
                @Override
                public void onGlobalLayout() {
                    getViewTreeObserver().removeOnGlobalLayoutListener(this);
                    translateText(getLayout(), type);
                }
            });
        } else {
            translateText(layout, type);
        }
    }

    private void translateText(Layout layout, BufferType type) {
        try {
            if (layout == null) {
                super.setText(mOriginalText, type);
                return;
            }
            if (layout.getLineCount() > mShowMaxLine) {
                SpannableStringBuilder span = new SpannableStringBuilder();
                int start = layout.getLineStart(mShowMaxLine - 1);
                int end = layout.getLineVisibleEnd(mShowMaxLine - 1);
                TextPaint paint = getPaint();
                end = end - paint.breakText(mOriginalText, start, end, false, getTextWidth(ELLIPSIZE_END), null) - 1;
                if (end < start) {
                    end = start;
                }
                CharSequence subOriginalText;
                if (mOriginalText.length() >= end) {
                    subOriginalText = mOriginalText.subSequence(0, end);
                } else {
                    subOriginalText = mOriginalText;
                }
                span.append(subOriginalText);
                span.append(ELLIPSIZE_END);
                setText(span, type);
            }
        } catch (Exception e) {
            super.setText(mOriginalText, type);
        }
    }

    private float getTextWidth(String text) {
        Paint paint = getPaint();
        return paint.measureText(text);
    }
}

你可能感兴趣的:(android,开发语言,java)