TextView 实现的微博话题标记的效果

实现微博的@用户 #话题# 等效果

需要实现的功能

@用户 展示位蓝色块,和其他普通文字区分开来
@用户 点击这一块文本可以跳转到用户主页
@用户 删除到这一块时直接删除整块,不会留下其他字符
@用户 光标不会落到这块区域,只会在其前后位置出现

对于怎么实现具体用户和文本映射关系

  1. 可以采用特定格式的文本来映射对象关系
  2. 纯文本不映射,把对象关系放到另外一个字段来记录位置对应关系

实现颜色,点击事件

使用ForegroundColorSpan实现不同颜色的区分
使用ClickableSpan 实现点击事件处理

实现整块区域操作

1.维护 map 集合,复杂,不好用

用一个 map 集合来保存对应的关系
参考:http://blog.csdn.net/u014702653/article/details/52799715

2.使用自定义 span,简单,效率高

利用 Span 的用法,

// 获取指定 span 的开始位置
public int getSpanStart(Object what)
// 获取指定 span 的结束位置
public int getSpanEnd(Object what)
// 获取指定 span 的 flag
public int getSpanFlags(Object what)
// 获取指定区域间所有的 span 对象
public <T> T[] getSpans(int queryStart, int queryEnd, @Nullable Class<T> kind)

比如自定一个 UserSpan,TopicSpan, 可以用来区分不同的 span

public class UserSpan{
...
}

public class TopicSpan{
...
}

一般这些自定义 span 可以继承 SpannableString,用来直接显示文字, 内部在设置这个 span 为 ClickableSpan,就是具备可以点击的文字了.

注意使用span 的一些问题

TextView 的 Editor 具体实现是SpannableStringBuilder,
在我们使用的append, insert,replace 都是最终调用到 replace 了.
当我们把自定义的 span replace 时,此时在这个 SpannableStringBuilder 中是不知道这个 span 的,只会当做 CharSequence 来处理,所以需要在 replace 后再次调用setSpan 一下,最后才能把这个 span 设置上去.

public SpannableStringBuilder replace(final int start, final int end,
            CharSequence tb, int tbstart, int tbend)
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,306评论 19 139
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 14,193评论 4 61
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 174,963评论 25 709
  • 车展过后的我们还是充满激情,一大早都按时到了,大家也聊了聊车展的工作,以及这周的工作展望! 早上培训老师果...
    Smuedward阅读 3,043评论 0 0
  • 突然想让你背负我的青春 我经常在想 如果我一直喜欢你 喜欢个七八年 你会怎么样
    叶孤绝阅读 1,501评论 0 0