惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

U
Unit 42
C
Cybersecurity and Infrastructure Security Agency CISA
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Know Your Adversary
Know Your Adversary
S
Securelist
I
Intezer
AWS News Blog
AWS News Blog
L
LINUX DO - 热门话题
P
Privacy International News Feed
Recent Announcements
Recent Announcements
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
博客园 - 聂微东
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Attack and Defense Labs
Attack and Defense Labs
N
News and Events Feed by Topic
The GitHub Blog
The GitHub Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
Schneier on Security
Schneier on Security
N
Netflix TechBlog - Medium
爱范儿
爱范儿
B
Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
C
CERT Recently Published Vulnerability Notes
Hacker News: Ask HN
Hacker News: Ask HN
Google DeepMind News
Google DeepMind News
Engineering at Meta
Engineering at Meta
Blog — PlanetScale
Blog — PlanetScale
WordPress大学
WordPress大学
S
Secure Thoughts
K
Kaspersky official blog
N
News | PayPal Newsroom
O
OpenAI News
Last Week in AI
Last Week in AI
C
Check Point Blog
D
Darknet – Hacking Tools, Hacker News & Cyber Security
Cyberwarzone
Cyberwarzone
Application and Cybersecurity Blog
Application and Cybersecurity Blog
T
Tor Project blog
大猫的无限游戏
大猫的无限游戏
Vercel News
Vercel News
D
Docker
Hugging Face - Blog
Hugging Face - Blog
T
Threat Research - Cisco Blogs
Cisco Talos Blog
Cisco Talos Blog
The Register - Security
The Register - Security
博客园 - 司徒正美
Martin Fowler
Martin Fowler
人人都是产品经理
人人都是产品经理
P
Palo Alto Networks Blog

土土哥的Blog

好久没有更新博客=。= 阿里巴巴国际无线技术部 - 招人啦~求iOS、Android、Java 转-阿里巴巴国际无线技术部 - 在这里遇见最好的自己 反编译分析并模拟实现methodSignatureForSelector方法 反编译分析Xcode8的Bug, release下连续两次调用有二级指针参数的空方法会Crash 有趣的Autolayout示例5-Masonry实现 在对象dealloc的后期执行Task-开源库TTGDeallocTaskHelper 用QuartzCode快速实现一个收藏动画 开源项目-拼图验证控件TTGPuzzleVerify的实现 Swift开源Mac App - BingWallPaper 有趣的Autolayout示例4-Masonry实现 翻译-为什么objc_msgSend必须用汇编实现 API返回结果设计经验与总结 结合访问Out Parameters出现EXC_BAD_ACCESS的例子,反编译汇编解读__autoreleasing 总结一些iOS项目中组织代码的方法 对组件化与模块化的思考与总结 开源项目-TTGTagCollectionView 有趣的Autolayout示例3-Masonry实现 Swift开源项目: TTGEmojiRate的实现 Swift写的库-TTGSnackbar 有趣的Autolayout示例2-Masonry实现 解决iOS项目的版本兼容问题-结合宏、Category和Runtime 用Runtime的手段填充任意NSObject对象的nil属性 有趣的Autolayout示例-Masonry实现 UITextView编辑时插入自定义表情-续-自定义表情图片的大小 RPC框架Thrift例子-PHP调用C++后端程序 GCD使用经验与技巧浅谈 为GCD队列绑定NSObject类型上下文数据-利用__bridge_retained(transfer)转移内存管理权 Enum-枚举的正确使用-Effective-Objective-C-读书笔记-Item-5 @autoreleasepool-内存的分配与释放 有关宏定义的经验与技巧-简化代码-增强Log Effective-Objective-C-读书笔记-Item-4-如何正确定义常量 UITextView编辑时插入自定义表情-简单的图文混编 关于评论不见了=。= Entity和Model的不同-关于代码的数据层 一次审核被拒的经历-关于iCloud到底应该备份什么数据 Block类型变量-缓存Http请求与回调 提升UITableView性能-复杂页面的优化 NSString的Copy与内存分配 利用NSProxy实现消息转发-模块化的网络接口层设计-原创 Effective-Objective-C-读书笔记-Item-3 Effective-Objective-C-读书笔记-Item-2 Effective-Objective-C-读书笔记-Item-1 iOS项目的目录结构-原创 第一篇Blog
Android开源库-LinkTextView-原创
土土哥 · 2014-11-02 · via 土土哥的Blog

前言

近来因为项目的缘故,仔细研究了一下如何在Android的TextView里面绑定可以点击的链接,并且定制链接的颜色,包括正常状态、按下去时的文字、背景的颜色,当然,还有点击后的回调。

为了以后方便自己,也为了方便更多的人,就把这些封装成了一个简单的开源库,也算是我自己的第一个开源库吧。

LinkTextView

名称:LinkTextView。喜欢的话就Star一下吧。

Example

示例

功能:

  1. 可以方便的对TextView里面的文字增加可点击链接,并且绑定回调。
  2. 可以为每个链接单独设置文字、链接背景正常按下状态下的颜色。
  3. 可以为每个链接绑定任意类型的“附件”对象,作为点击链接时的回调参数。

讲解

下面分重点讲解一下。

1. 为文字增加可点击链接,绑定回调。

为文字增加链接,已经是老生常谈了,真是一搜一大把,不过在这里还是简单讲一下。

用过TextView应该都知道这个接口:

1
public final void setText (CharSequence text)

其中CharSequence接口的子接口里面有Spannable,而由这个接口派生出来的类SpannableString,就是我们可以对TextView里面的文字做附加效果的原因。如改变颜色、增加超链接等,有兴趣的各位可以去仔细查查。下面简单的说说怎么加可点击的链接。

首先创建SpannableString

1
SpannableString text = new SpannableString("LinkTextView dadada");

绑定ClickableSpan回调

1
2
3
4
5
6
7
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void onClick(View view) {

}
};
text.setSpan(clickableSpan, 0, 5, 0);

最后再setText

1
textView.setText(text);

看,绑定可以点击的链接就是这么简单。

2. 改变正常、按下时的文字、链接背景颜色。

往往系统默认的链接颜色是不能满足我们的需求的,所以最好能对链接的文字、背景的按下、松开时的颜色做定制。

但是好坑=。=,Google居然没有为ClickableSpan增加按下时的回调

那就只好自己造轮子了。

首先

必须要能获取到链接按下时的回调,应该是onTouch什么的,于是,就查到了类:LinkMovementMethod。
在TextView中可以用方法:public final void setMovementMethod (MovementMethod movement)设定监听,而LinkMovementMethod类里面就可以监听到链接的onTouch!

LinkMovementMethod的onTouch就是介个样子的

1
boolean	 onTouchEvent(TextView textView, Spannable spannable, MotionEvent event)

于是,我们可以通过event来判断是按下还是移动等等操作。
但是问题是,这里的spannable是整个TextView全部的文字,所以,只能通过event里面的x、y坐标,找到具体点击的是哪个链接。这里,要感谢stack overflow上的大神的帖子

具体的找点击链接的方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
private TouchableSpan getPressedSpan(TextView textView, Spannable spannable, MotionEvent event) {

int x = (int) event.getX();
int y = (int) event.getY();

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的方法里面,除了

1
void onClick(View widget);

还有就是:

1
public void updateDrawState(TextPaint textPaint);

很明显,就是更新文字渲染效果的。我们用如下两个方法,就能实现:

1
2
public void setColor (int color);
bgColor属性

最后

到目前为止,我们已经可以捕捉到链接的点击状态,能获取到真正的点击的链接,还有能刷新链接的颜色了,相信聪明的你一定能自己琢磨出来,怎么样实现文章开头的效果。=v=

本文参考

  1. Android官方文档。
  2. StackOverFlow的:Change the text color of a ClickableSpan when pressed。