方法一:
TextView 重写以下方法
@Override
public boolean onTouchEvent(MotionEvent event) {
if (question != null) {
int action = event.getAction();
if (action == MotionEvent.ACTION_UP) {
CharSequence text = getText();
if (text instanceof SpannableStringBuilder || text instanceof SpannedString
|| text instanceof SpannableString) {
int x = (int) event.getX();
int y = (int) event.getY();
x -= getTotalPaddingLeft();
y -= getTotalPaddingTop();
x += getScrollX();
y += getScrollY();
int line = getLayout().getLineForVertical(y);
int off = getLayout().getOffsetForHorizontal(line, x);
ClickableSpan[] spans= getSpans(text, off);
if (spans.length != 0) {
link[0].onClick(this);
return true;
}
}
//todo 处理TextView事件
}
}
return true;
}
private ClickableSpan[] getSpans(CharSequence text, int off) {
ClickableSpan[] spans;
if (text instanceof SpannableStringBuilder) {
spans= ((SpannableStringBuilder) text).getSpans(off, off, QuestionClickableSpan.class);
} else if (text instanceof SpannableString) {
spans= ((SpannableString) text).getSpans(off, off, QuestionClickableSpan.class);
} else {
spans= ((SpannedString) text).getSpans(off, off, QuestionClickableSpan.class);
}
return spans;
}
方法二:
public class LinkMovementMethod extends LinkMovementMethod {
private static LinkMovementMethod instance;
public static LinkMovementMethod getInstance() {
if (instance == null) {
instance = new QuestionLinkMovementMethod();
}
return instance;
}
@Override
public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
int action = event.getAction();
if (action == MotionEvent.ACTION_UP ||
action == MotionEvent.ACTION_DOWN) {
int x = (int) event.getX();
int y = (int) event.getY();
x -= widget.getTotalPaddingLeft();
y -= widget.getTotalPaddingTop();
x += widget.getScrollX();
y += widget.getScrollY();
Layout layout = widget.getLayout();
int line = layout.getLineForVertical(y);
int off = layout.getOffsetForHorizontal(line, x);
ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class);
if (link.length != 0) {
if (action == MotionEvent.ACTION_UP) {
link[0].onClick(widget);
}
return true;
}
}
return true;
}
}
public class OnGlobalLayoutListenerByEllipsize implements ViewTreeObserver.OnGlobalLayoutListener {
private TextView textView;
private int maxLines;
public OnGlobalLayoutListenerByEllipsize(TextView textView, int maxLines) {
if (maxLines <= 0) {
throw new IllegalArgumentException("maxLines不能小于等于0");
}
this.textView = textView;
this.maxLines = maxLines;
this.textView.setMaxLines(this.maxLines + 1);
this.textView.setSingleLine(false);
}
@Override
public void onGlobalLayout() {
if (textView.getLineCount() > maxLines) {
int line = textView.getLayout().getLineEnd(maxLines - 1);
//定义成CharSequence类型,是为了兼容emoji表情,如果使用String类型则会造成emoji无法显示
CharSequence truncate = "...";
CharSequence text = textView.getText();
try {
text = text.subSequence(0, line - 2);
} catch (Exception e) {
truncate = "";
text = textView.getText();
}
TextUtils.TruncateAt at = textView.getEllipsize();
if (at == TextUtils.TruncateAt.START) {
textView.setText(truncate);
textView.append(text);
} else if (at == TextUtils.TruncateAt.MIDDLE) {
textView.setText(text.subSequence(0, text.length() / 2));
textView.append(truncate);
textView.append(text.subSequence(text.length() / 2, text.length()));
} else {
textView.setText(text);
textView.append(truncate);
}
}
}
}