自定义文本标签,自动换行 WordWrapTextView

来源:互联网 发布:淘宝水果店铺名字 编辑:程序博客网 时间:2024/05/23 14:25
package com.reacnnCn.android.view;import java.util.ArrayList;import java.util.List;import android.content.Context;import android.content.res.Resources;import android.graphics.Canvas;import android.text.Layout;import android.text.Layout.Alignment;import android.text.StaticLayout;import android.text.TextUtils.TruncateAt;import android.util.AttributeSet;import android.util.TypedValue;import android.widget.TextView;//自定义文本标签,自动换行public class WordWrapTextView extends TextView {private static final String ELLIPSIS = "...";private final List<EllipsizeListener> ellipsizeListeners = new ArrayList<EllipsizeListener>();private boolean isEllipsized;private boolean isStale;private boolean programmaticChange;private String fullText;private int maxLines = -1;private float lineSpacingMultiplier = 1.0f;private float lineAdditionalVerticalPadding = 0.0f;public WordWrapTextView(Context context) {this(context, null);init();}public WordWrapTextView(Context context, AttributeSet attrs, int defStyle) {super(context, attrs, defStyle);init();}public WordWrapTextView(Context context, AttributeSet attrs) {this(context, attrs, 0);init();}void init() {Context c = getContext();Resources r;if (c == null)r = Resources.getSystem();elser = c.getResources();setTextSize(TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10,r.getDisplayMetrics()));setMaxWidth(r.getDisplayMetrics().widthPixels);setMaxLines(2);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);}public interface EllipsizeListener {void ellipsizeStateChanged(boolean ellipsized);}public void addEllipsizeListener(EllipsizeListener listener) {if (listener == null) {throw new NullPointerException();}ellipsizeListeners.add(listener);}public void removeEllipsizeListener(EllipsizeListener listener) {ellipsizeListeners.remove(listener);}public boolean isEllipsized() {return isEllipsized;}@Overridepublic void setMaxLines(int maxLines) {super.setMaxLines(maxLines);this.maxLines = maxLines;isStale = true;}public int getMaxLines() {return maxLines;}@Overridepublic void setLineSpacing(float add, float mult) {this.lineAdditionalVerticalPadding = add;this.lineSpacingMultiplier = mult;super.setLineSpacing(add, mult);}@Overrideprotected void onTextChanged(CharSequence text, int start, int before,int after) {super.onTextChanged(text, start, before, after);if (!programmaticChange) {fullText = text.toString();isStale = true;}}@Overrideprotected void onDraw(Canvas canvas) {if (isStale) {super.setEllipsize(null);resetText();}super.onDraw(canvas);}private void resetText() {int maxLines = getMaxLines();String workingText = fullText;boolean ellipsized = false;if (maxLines != -1) {Layout layout = createWorkingLayout(workingText);if (layout.getLineCount() > maxLines) {workingText = fullText.substring(0,layout.getLineEnd(maxLines - 1)).trim();Layout layout2 = createWorkingLayout(workingText + ELLIPSIS);while (layout2.getLineCount() > maxLines) {int lastSpace = workingText.lastIndexOf(' ');if (lastSpace == -1) {break;}workingText = workingText.substring(0, lastSpace);}workingText = workingText + ELLIPSIS;ellipsized = true;}}if (!workingText.equals(getText())) {programmaticChange = true;try {setText(workingText);} finally {programmaticChange = false;}}isStale = false;if (ellipsized != isEllipsized) {isEllipsized = ellipsized;for (EllipsizeListener listener : ellipsizeListeners) {listener.ellipsizeStateChanged(ellipsized);}}}private Layout createWorkingLayout(String workingText) {return new StaticLayout(workingText, getPaint(), getWidth()- getPaddingLeft() - getPaddingRight(), Alignment.ALIGN_NORMAL,lineSpacingMultiplier, lineAdditionalVerticalPadding, false);}@Overridepublic void setEllipsize(TruncateAt where) {// Ellipsize settings are not respected } }}}

原创粉丝点击