package com.shejiaomao.widget; import java.util.regex.Pattern; import com.cattong.commons.ServiceProvider; import com.cattong.weibo.FeaturePatternUtils; import android.content.Context; import android.net.Uri; import android.text.Spannable; import android.text.TextPaint; import android.text.method.LinkMovementMethod; import android.text.style.URLSpan; import android.text.util.Linkify; import android.util.AttributeSet; import android.widget.TextView; public class RichTextView extends TextView { public static final Uri URI_PERSONAL_INFO = Uri.parse("shejiaomao://info/"); // 用户资料查看地址 public static final Uri URI_TOPIC = Uri.parse("shejiaomao://topic/"); // 话题查看地址 private int off; //字符串的偏移值 private String[] highlightArray; //平台 private ServiceProvider provider = ServiceProvider.Sina; public RichTextView(Context context, AttributeSet attrs) { super(context, attrs); this.getPaint().setUnderlineText(false); } public RichTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); this.getPaint().setUnderlineText(false); } @Override public boolean getDefaultEditable() { return false; } @Override public void setText(CharSequence text, BufferType type) { Spannable s; if (text instanceof Spannable) { s = (Spannable) text; } else { if (text == null) { text = ""; } s = Spannable.Factory.getInstance().newSpannable(text); } //email Linkify.addLinks(s, Linkify.EMAIL_ADDRESSES); //metion Pattern mentionPattern = FeaturePatternUtils.getMentionPattern(provider); if (mentionPattern != null) { Linkify.addLinks(s, mentionPattern, URI_PERSONAL_INFO.toString()); } //topic Pattern topicPattern = FeaturePatternUtils.getTopicPattern(provider); if (topicPattern != null) { Linkify.addLinks(s, topicPattern, URI_TOPIC.toString()); } //url Pattern urlPattern = FeaturePatternUtils.getUrlPattern(provider); if (urlPattern != null) { Linkify.addLinks(s, urlPattern, "http://"); } stripUnderlines(s); text = s; super.setText(text, type); if (this.getLinksClickable()) { setMovementMethod(LinkMovementMethod.getInstance()); } } private void stripUnderlines(Spannable s) { URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class); for (URLSpan span: spans) { int start = s.getSpanStart(span); int end = s.getSpanEnd(span); s.removeSpan(span); span = new URLSpanNoUnderline(span.getURL()); s.setSpan(span, start, end, 0); } } private class URLSpanNoUnderline extends URLSpan { public URLSpanNoUnderline(String url) { super(url); } @Override public void updateDrawState(TextPaint tp) { super.updateDrawState(tp); tp.setUnderlineText(false); } } public ServiceProvider getProvider() { return provider; } public void setProvider(ServiceProvider provider) { this.provider = provider; } private final static String TAG = "RichTextView"; }