一 无图言屌 先看看神奇的效果 仅用一个TextView实现

二 SpannableStringBuilder

Google官方介绍

This is the class for text whose content and markup can both be changed.

翻译过来

这是用于文本的类,其内容和标记都可以更改。

继承关系

SpannableStringBuilder实现了CharSequence 因此 可以直接在TextView#setText()中使用

三 用法

在xml中创建一个TextView

<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:layout_marginHorizontal="60dp"
android:textSize="16sp" />

1. 字体颜色

TextView textView = findViewById(R.id.text);
SpannableStringBuilder builder = new SpannableStringBuilder("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
ForegroundColorSpan span = new ForegroundColorSpan(Color.parseColor("#0094FF"));
builder.setSpan(span, 0, 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); //位置含头不含尾
textView.setText(builder);

2. 背景颜色

TextView textView = findViewById(R.id.text);
SpannableStringBuilder builder = new SpannableStringBuilder("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
BackgroundColorSpan span = new BackgroundColorSpan(Color.parseColor("#0094FF"));
builder.setSpan(span, 0, 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); //位置含头不含尾
textView.setText(builder);

3. 字体大小 绝对

TextView textView = findViewById(R.id.text);
SpannableStringBuilder builder = new SpannableStringBuilder("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
AbsoluteSizeSpan span = new AbsoluteSizeSpan(ScreenUtils.sp2px(20));
builder.setSpan(span, 0, 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); //位置含头不含尾
textView.setText(builder);

4. 字体大小 相对

TextView textView = findViewById(R.id.text);
SpannableStringBuilder builder = new SpannableStringBuilder("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
RelativeSizeSpan span = new RelativeSizeSpan(0.5F);
builder.setSpan(span, 0, 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); //位置含头不含尾
textView.setText(builder);

5. 字体风格

TextView textView = findViewById(R.id.text);
SpannableStringBuilder builder = new SpannableStringBuilder("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
StyleSpan span = new StyleSpan(Typeface.BOLD); //Typeface.BOLD=粗体 Typeface.ITALIC=斜体 Typeface.BOLD_ITALIC=粗斜体
builder.setSpan(span, 0, 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); //位置含头不含尾
textView.setText(builder);

6. 删除线

TextView textView = findViewById(R.id.text);
SpannableStringBuilder builder = new SpannableStringBuilder("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
StrikethroughSpan span = new StrikethroughSpan();
builder.setSpan(span, 0, 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); //位置含头不含尾
textView.setText(builder);

7. 下划线

TextView textView = findViewById(R.id.text);
SpannableStringBuilder builder = new SpannableStringBuilder("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
UnderlineSpan span = new UnderlineSpan();
builder.setSpan(span, 0, 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); //位置含头不含尾
textView.setText(builder);

8. 图片 原始大小

TextView textView = findViewById(R.id.text);
SpannableStringBuilder builder = new SpannableStringBuilder("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
ImageSpan span = new ImageSpan(this, R.mipmap.ic_launcher);
builder.setSpan(span, 0, 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); //位置含头不含尾
textView.setText(builder);

9. 图片 控制大小

TextView textView = findViewById(R.id.text);
SpannableStringBuilder builder = new SpannableStringBuilder("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
Drawable drawable = getResources().getDrawable(R.mipmap.ic_launcher);
drawable.setBounds(0, 0, ScreenUtils.dp2px(32), ScreenUtils.dp2px(16));
ImageSpan span = new ImageSpan(drawable);
builder.setSpan(span, 0, 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); //位置含头不含尾
textView.setText(builder);

10. 点击事件

TextView textView = findViewById(R.id.text);
SpannableStringBuilder builder = new SpannableStringBuilder("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
ClickableSpan span = new ClickableSpan() {
@Override
public void onClick(@NonNull View view) {
Toast.makeText(view.getContext(), "onClick", Toast.LENGTH_LONG).show();
} @Override
public void updateDrawState(@NonNull TextPaint ds) {
super.updateDrawState(ds);
ds.setColor(Color.parseColor("#0094FF"));
ds.setUnderlineText(true); //设置下划线
ds.setFakeBoldText(true); //设置粗体
}
};
builder.setSpan(span, 0, 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); //位置含头不含尾
textView.setText(builder);
// 去除点击时的背景色
textView.setHighlightColor(ContextCompat.getColor(textView.getContext(), android.R.color.transparent));
// 点击事件生效
textView.setMovementMethod(LinkMovementMethod.getInstance());

11. 点击事件+图片

TextView textView = findViewById(R.id.text);
SpannableStringBuilder builder = new SpannableStringBuilder("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ");
ClickableSpan span = new ClickableSpan() {
@Override
public void onClick(@NonNull View view) {
Toast.makeText(view.getContext(), "onClick", Toast.LENGTH_LONG).show();
} @Override
public void updateDrawState(@NonNull TextPaint ds) {
super.updateDrawState(ds);
ds.setColor(Color.parseColor("#0094FF"));
ds.setUnderlineText(true); //设置下划线
ds.setFakeBoldText(true); //设置粗体
}
};
builder.setSpan(span, 0, 1, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); //位置含头不含尾
ImageSpan imageSpan = new ImageSpan(this, R.mipmap.ic_launcher);
builder.setSpan(imageSpan, 5, 6, Spannable.SPAN_INCLUSIVE_EXCLUSIVE); //位置含头不含尾
textView.setText(builder);
// 去除点击时的背景色
textView.setHighlightColor(ContextCompat.getColor(textView.getContext(), android.R.color.transparent));
// 点击事件生效
textView.setMovementMethod(LinkMovementMethod.getInstance());

Android 神奇的SpannableStringBuilder的更多相关文章

  1. Android项目实战(一): SpannableString与SpannableStringBuilder(转)

    前言: 曾经在一些APP中的一些类似“帮助”“关于”的界面看过一行文字显示不同的颜色的效果,如下效果: 本软件是一款高.大.上的社区类软件. 一般来说,这应该是由一个TextView来显示的,但是自己 ...

  2. Android项目实战(一): SpannableString与SpannableStringBuilder

    原文:Android项目实战(一): SpannableString与SpannableStringBuilder 前言: 曾经在一些APP中的一些类似“帮助”“关于”的界面看过一行文字显示不同的颜色 ...

  3. Android Animation动画详解(一): 补间动画

    前言 你有没有被一些APP中惊艳的动画效果震撼过,有没有去思考,甚至研究过这些动画是如何实现的呢? 啥?你没有思考,更没有研究过? 好吧,那跟着我一起来学习下如何去实现APP中那些让我们惊羡的动画特效 ...

  4. android XMl 解析神奇xstream 六: 把集合list 转化为 XML文档

    前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...

  5. android XMl 解析神奇xstream 五: 把复杂对象转换成 xml ,并写入SD卡中的xml文件

    前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...

  6. android XMl 解析神奇xstream 四: 将复杂的xml文件解析为对象

    前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...

  7. android XMl 解析神奇xstream 三: 把复杂对象转换成 xml

    前言:对xstream不理解的请看: android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 android XMl 解析神奇xs ...

  8. android XMl 解析神奇xstream 二: 把对象转换成xml

    前言:对xstream不理解的请看:android XMl 解析神奇xstream 一: 解析android项目中 asset 文件夹 下的 aa.xml 文件 1.Javabeen 代码 packa ...

  9. 使用android SpannableStringBuilder实现图文混排

    项目开发中需要实现这种效果 多余两行,两行最后是省略号,省略号后面是下拉更多 之前用过的是Html.fromHtml去处理图文混排的,仅仅是文字后图片或者文字颜色字体什么的, 但是这里需要在最后文字的 ...

随机推荐

  1. scrapy框架基于管道的持久化存储

    scrapy框架的使用 基于管道的持久化存储的编码流程 在爬虫文件中数据解析 将解析到的数据封装到一个叫做Item类型的对象 将item类型的对象提交给管道 管道负责调用process_item的方法 ...

  2. Spring Security OAuth2.0认证授权六:前后端分离下的登录授权

    历史文章 Spring Security OAuth2.0认证授权一:框架搭建和认证测试 Spring Security OAuth2.0认证授权二:搭建资源服务 Spring Security OA ...

  3. CKafka 架构原理

    消息队列 CKafka 技术原理 - 产品简介 - 文档中心 - 腾讯云 https://cloud.tencent.com/document/product/597/10067 消息队列 CKafk ...

  4. 翻页bug 在接口文档中应规范参数的取值区间 接口规范

    <?php$a=array("red","green","blue","yellow","brown&q ...

  5. Linux 中的文件属性

    文件属性 d 开头是: 目录文件.l  开头是: 符号链接(指向另一个文件,类似于瘟下的快捷方式).s 开头是: 套接字文件(sock).b 开头是: 块设备文件,二进制文件.c 开头是: 字符设备文 ...

  6. mysql和oracle的字符拼接方法

    不同的数据库,相应的字符串拼接方式不同,通过对比加深一下记忆. 一.MySQL字符串拼接 1.CONCAT函数 语法格式:CONCAT(char c1, char c2, ..., char cn) ...

  7. 成功解决Git:fatal: refusing to merge unrelated histories

    Get 报错 如果合并了两个不同的开始提交的仓库,在新的 git 会发现这两个仓库可能不是同一个,为了防止开发者上传错误,于是就给下面的提示 fatal: refusing to merge unre ...

  8. centos /usr/local 和/opt 安装软件你什么不同../configure --prefix=/usr...

    /usr/local下一般是你安装软件的目录,这个目录就相当于在windows下的programefiles这个目录(所有文件在一个文件夹) /opt这个目录是一些大型软件的安装目录,或者是一些服务程 ...

  9. nginx详解、反向代理、负载均衡和LNMP架构

    资源池 nginx官方网站:http://nginx.org/ nginx官方文档:http://nginx.org/en/docs/ 本章资源: 点击这里 资源提取码:u2jv 1.nginx简介 ...

  10. 换一种视角看DNS(采坑篇)

    换一种视角看DNS 我们尽量用精炼的语言,尽可能的规划DNS的全貌(当然笔者水平有限,如有错误请不吝赐教). 通常啊我们在个人PC中能看到DNS的配置身影就是在上网的时候,通常如果你不配置DNS可能找 ...