前言
近来因为项目的缘故,仔细研究了一下如何在Android的TextView里面绑定可以点击的链接,并且定制链接的颜色,包括正常状态、按下去时的文字、背景的颜色,当然,还有点击后的回调。
为了以后方便自己,也为了方便更多的人,就把这些封装成了一个简单的开源库,也算是我自己的第一个开源库吧。
LinkTextView
名称:LinkTextView。喜欢的话就Star一下吧。
Example

功能:
- 可以方便的对TextView里面的文字增加可点击链接,并且绑定回调。
- 可以为每个链接单独设置文字、链接背景的正常、按下状态下的颜色。
- 可以为每个链接绑定任意类型的“附件”对象,作为点击链接时的回调参数。
讲解
下面分重点讲解一下。
1. 为文字增加可点击链接,绑定回调。
为文字增加链接,已经是老生常谈了,真是一搜一大把,不过在这里还是简单讲一下。
用过TextView应该都知道这个接口:
public final void setText (CharSequence text)
其中CharSequence接口的子接口里面有Spannable,而由这个接口派生出来的类SpannableString,就是我们可以对TextView里面的文字做附加效果的原因。如改变颜色、增加超链接等,有兴趣的各位可以去仔细查查。下面简单的说说怎么加可点击的链接。
首先创建SpannableString:
SpannableString text = new SpannableString("LinkTextView dadada");
绑定ClickableSpan回调
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View view) {
//点击了链接,做你想干的事吧=。=
}
};
text.setSpan(clickableSpan, 0, 5, 0);
最后再setText
textView.setText(text);
看,绑定可以点击的链接就是这么简单。
2. 改变正常、按下时的文字、链接背景颜色。
往往系统默认的链接颜色是不能满足我们的需求的,所以最好能对链接的文字、背景的按下、松开时的颜色做定制。
但是好坑=。=,Google居然没有为ClickableSpan增加按下时的回调
那就只好自己造轮子了。
首先
必须要能获取到链接按下时的回调,应该是onTouch什么的,于是,就查到了类:LinkMovementMethod。 在TextView中可以用方法:public final void setMovementMethod (MovementMethod movement)设定监听,而LinkMovementMethod类里面就可以监听到链接的onTouch!
LinkMovementMethod的onTouch就是介个样子的
boolean onTouchEvent(TextView textView, Spannable spannable, MotionEvent event)
于是,我们可以通过event来判断是按下还是移动等等操作。 但是问题是,这里的spannable是整个TextView全部的文字,所以,只能通过event里面的x、y坐标,找到具体点击的是哪个链接。这里,要感谢stack overflow上的大神的帖子。
具体的找点击链接的方法如下:
private TouchableSpan getPressedSpan(TextView textView, Spannable spannable, MotionEvent event) {
//获取点击的x、y坐标
int x = (int) event.getX();
int y = (int) event.getY();
//减去Padding
x -= textView.getTotalPaddingLeft();
y -= textView.getTotalPaddingTop();
//加上滚动的偏移
x += textView.getScrollX();
y += textView.getScrollY();
//获取第几行、以及偏移
Layout layout = textView.getLayout();
int line = layout.getLineForVertical(y);
int off = layout.getOffsetForHorizontal(line, x);
//获取真正点击的链接
TouchableSpan[] link = spannable.getSpans(off, off, TouchableSpan.class);
TouchableSpan touchedSpan = null;
if (link.length > 0) {
touchedSpan = link[0];
}
return touchedSpan;
}
到此,我们已经能获取到链接的点击状态,并且捕捉到具体点击的ClickableSpan。
接着
就是改变链接的文字、背景颜色。
ClickableSpan的方法里面,除了
void onClick(View widget);
还有就是:
public void updateDrawState(TextPaint textPaint);
很明显,就是更新文字渲染效果的。我们用如下两个方法,就能实现:
public void setColor (int color);
bgColor属性
最后
到目前为止,我们已经可以捕捉到链接的点击状态,能获取到真正的点击的链接,还有能刷新链接的颜色了,相信聪明的你一定能自己琢磨出来,怎么样实现文章开头的效果。=v=
本文参考
- Android官方文档。
- StackOverFlow的:Change the text color of a ClickableSpan when pressed。