Android开发 SpannableString开发详解
前言
SpannableString,是google提供用来处理富文本的功能类.支持很多文本内容的效果变化.另外,它也是Android实现富文本编辑器的关键.
关键API详解
String content ="先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。";SpannableString spannableString = new SpannableString(content);spannableString.setSpan(new ForegroundColorSpan(Color.parseColor("#FFFF0C00")), content.indexOf("创业"), content.indexOf("而中"), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);mTextView.setText(spannableString);
这是一个简单使用的demo,我们用这个demo来讲解一些关键点.
这行代码的关键是setSpan(Object what, int start, int end, int flags)方法,这个方法在后面的文字处理将会一直使用到. setSpan有四个参数我们一个一个来讲解:
第一个参数 Object what 这个参数主要是提供你需要改变字符串的效果实现类,后续会一一讲解并且给出效果图
第二个参数 int start 这个参数是需要改变的字符串的起始位置
第三个参数 int end 这个参数是需要改变的字符串的结束位置
第四个参数 int flags 是一些字符串新增效果的影响范围,您可以参考这篇博客https://www.jianshu.com/p/1956e15c9a27这位大神讲解的十分详细了.本着就算是看懂了也要敲一敲代码记录的想法,下面也会说明一下常用的4种方法
public static final int SPAN_INCLUSIVE_EXCLUSIVE = SPAN_MARK_MARK;
在前面/范围内增加字符,新增字符会跟随效果.
在后面增加字符,新增字符不会跟随效果
效果图:
public static final int SPAN_INCLUSIVE_INCLUSIVE = SPAN_MARK_POINT;
在前面/范围内/后面增加字符,新增字符会跟随效果.
效果图:
public static final int SPAN_EXCLUSIVE_EXCLUSIVE = SPAN_POINT_MARK;
在范围内增加字符,新增字符会跟随效果.
在前面/后面增加字符,新增字符不会跟随效果
效果图:
public static final int SPAN_EXCLUSIVE_INCLUSIVE = SPAN_POINT_POINT;
在范围内/后面增加字符,新增字符会跟随效果.
在前面增加字符,新增字符不会跟随效果.
效果图:
代码里还有一些其他的常量,但是测试后其他都是这四种基本里一样的效果.也实在是没看懂google的注释.....
文字颜色
以下代码将一段文字变成红色
String content ="先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。";SpannableString spannableString = new SpannableString(content);spannableString.setSpan(new ForegroundColorSpan(Color.parseColor("#FFFF0C00")), content.indexOf("创业"), content.indexOf("而中"), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);mTextView.setText(spannableString);
ForegroundColorSpan 注意这个类是关键,他实现文字颜色改变.
效果图:
文字背景颜色
String content ="先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。";SpannableString spannableString = new SpannableString(content);spannableString.setSpan(new BackgroundColorSpan(Color.parseColor("#FFFF0C00")), content.indexOf("创业"), content.indexOf("而中"), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);mTextView.setText(spannableString);
BackgroundColorSpan 注意这个类是关键,他实现文字背景颜色改变.
效果图:
字体
String content ="先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。";SpannableString spannableString = new SpannableString(content);spannableString.setSpan(new TypefaceSpan("sans-serif") //new TypefaceSpan(Typeface.SANS_SERIF) 或者使用这个方法, content.indexOf("创业"), content.indexOf("而中"), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);mTextView.setText(spannableString);
效果图(系统自带的演示字体效果不明显):
字体大小
String content ="先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。";SpannableString spannableString = new SpannableString(content);spannableString.setSpan(new AbsoluteSizeSpan(50), content.indexOf("创业"), content.indexOf("而中"), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);mTextView.setText(spannableString);
效果图:
粗体
String content ="先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。";SpannableString spannableString = new SpannableString(content);spannableString.setSpan(new StyleSpan(Typeface.BOLD), content.indexOf("创业"), content.indexOf("而中"), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);mTextView.setText(spannableString);
效果图:
斜体
String content ="先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。";SpannableString spannableString = new SpannableString(content);spannableString.setSpan(new StyleSpan(Typeface.ITALIC), content.indexOf("创业"), content.indexOf("而中"), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);mTextView.setText(spannableString);
效果图:
粗体和斜体
String content ="先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。";SpannableString spannableString = new SpannableString(content);spannableString.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), content.indexOf("创业"), content.indexOf("而中"), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);mTextView.setText(spannableString);
另外还有一个Typeface.NORMAL 正常值就不演示了
效果图:
删除线
String content ="先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。";SpannableString spannableString = new SpannableString(content);spannableString.setSpan(new StrikethroughSpan(), content.indexOf("创业"), content.indexOf("而中"), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);mTextView.setText(spannableString);
效果图:
下划线
String content ="先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。";SpannableString spannableString = new SpannableString(content);spannableString.setSpan(new UnderlineSpan(), content.indexOf("创业"), content.indexOf("而中"), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);mTextView.setText(spannableString);
效果图:
上标
String content ="先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。";SpannableString spannableString = new SpannableString(content);spannableString.setSpan(new SuperscriptSpan(), content.indexOf("创业"), content.indexOf("而中"), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);mTextView.setText(spannableString);
效果图:
下标
String content ="先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。";SpannableString spannableString = new SpannableString(content);spannableString.setSpan(new SubscriptSpan(), content.indexOf("创业"), content.indexOf("而中"), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);mTextView.setText(spannableString);
效果图:
插入图片
String content ="先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。";Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);ImageSpan span = new ImageSpan(bitmap);SpannableString spannableString = new SpannableString(content);spannableString.setSpan(span, 0, 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);mTextView.setText(spannableString);
或者
String content ="先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。";Drawable drawable = getResources().getDrawable(R.mipmap.ic_launcher, null); //读取图片drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());//设置边界 图片显示范围ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE);//ImageSpan.ALIGN_BASELINE 是对齐方式,这个是基线对齐SpannableString spannableString = new SpannableString(content);spannableString.setSpan(span, 0, 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);mTextView.setText(spannableString);
效果图:
点击事件
mTextView.setMovementMethod(LinkMovementMethod.getInstance());//这是关键,只有TextView添加这个后才能有点击事件mTextView.setHighlightColor(getResources().getColor(R.color.fontRed, null));//修改点击后的背景色String content ="先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。";ClickableSpan clickableSpan = new ClickableSpan() {@Overridepublic void onClick(@NonNull View widget) {Toast.makeText(MainActivity.this, "你点击了创业未半", Toast.LENGTH_SHORT).show();}@Overridepublic void updateDrawState(@NonNull TextPaint ds) {//改变选中文字的颜色或者样式,注意这里的TextPaint 其实是Paint,可以参考Paint的绘制添加其他效果. ds.setColor(Color.RED); // super.updateDrawState(ds); }};SpannableString spannableString = new SpannableString(content);spannableString.setSpan(clickableSpan, content.indexOf("创业"), content.indexOf("而中"), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);mTextView.setText(spannableString);
setMovementMethod是重中之重,只有设置了才能有点击
效果图:
超链接
电话
mTextView.setMovementMethod(LinkMovementMethod.getInstance());//这是关键,只有TextView添加这个后才能有点击事件mTextView.setHighlightColor(getResources().getColor(R.color.fontRed, null));//修改点击后的背景色String content ="先帝创业未半而中道崩殂,今天下三分,益州疲弊,此诚危急存亡之秋也。";SpannableString spannableString = new SpannableString(content);spannableString.setSpan(new URLSpan("tel:10086"), content.indexOf("创业"), content.indexOf("而中"), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);mTextView.setText(spannableString);
注意!使用超链接,依然要设置setMovementMethod,另外URLSpan也是可以重写点击事件的.
效果图:
与使用Intent的超链接类似,也是支持几个通用的超链接,都需要你输入正确的前缀
mailto:123456@qq.com
http://www.baidu.com
sms:123456
mms:123456
geo: 38.899533,-77.036476
其他Span
上面的span只是一些常用的span演示,但是其实还有更多的span可以选择和使用,他们都在这个目录中.在这个目录下还有以下这些span.如果后续有时间我会一一实验使用这些span以判断他们的功能.
END
转载于:https://www.cnblogs.com/guanxinjing/p/11227711.html
Android开发 SpannableString开发详解相关推荐
- Android:SpannableString使用详解
在Android开发过程中,我们有时会需要TextView 显示各种格式的文本,包括字体颜色,大小,下划线,表情符号等等.对于这种需求,我们应该如何实现呢?答案是:SpannableString. 我 ...
- 【Android 应用开发】Ubuntu 下 Android Studio 开发工具使用详解 (旧版本 | 仅作参考)
. 基本上可以导入项目开始使用了 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21035637 ...
- Android开发入门一之Android应用程序架构详解
Android应用程序架构详解如下: src/ java源代码存放目录 gen/自动生成目录 gen 目录中存放所有由Android开发工具自动生成的文件.目录中最重要的就是R.java文件.这个文件 ...
- Android网络开发技术实战详解
<Android网络开发技术实战详解> 基本信息 作者: 朱桂英 丛书名: Android移动开发技术丛书 出版社:电子工业出版社 ISBN:9787121173493 上架时间:2012 ...
- Android应用开发—Intent组件详解
转载自:Android中Intent组件详解 Intent是不同组件之间相互通讯的纽带,封装了不同组件之间通讯的条件. Intent本身是定义为一个类别(Class),一个Intent对象表达一个目的 ...
- 微信小程序开发登录界面mysql_微信小程序 欢迎界面开发的实例详解
微信小程序 欢迎界面 市面上大多数的app都会有一个欢迎界面,下面将演示如何通过微信小程序实现一个欢迎界面. 下面将会按照以下的顺序介绍: 布局的实现 逻辑的实现 样式的实现 1.布局的实现 整个布局 ...
- java web编码详解_java web 开发 编码问题详解
java web 开发 编码问题详解 浏览器 IE/FireFox ------------->Servlet容器-------------------------->显示页面 编码 ...
- webpack搭建php服务器,webpack搭建react开发环境步骤详解
这次给大家带来webpack搭建react开发环境步骤详解,webpack搭建react开发环境的注意事项有哪些,下面就是实战案例,一起来看一下.mkdir react-redux && ...
- STM32开发 -- 低功耗模式详解(2)
如需转载请注明出处:https://juyou.blog.csdn.net/article/details/98631012 上一篇文章 STM32开发 – 低功耗模式详解(1) 简单的总结了一下低功 ...
- php 实例 规范,PHP开发规范实例详解
本文主要和大家分享PHP开发规范实例详解,希望能帮助到大家. 源文件 代码使用<?php开头 ,忽略闭合标签?> 文件格式必须是无BOM UTF-8格式 一个文件只声明一种类型,如clas ...
最新文章
- Android开发常用开源框架:图片处理
- ServletActionContext.getRequest().getSession() 和 ActionContext.getContext().getSession()的区别
- html设置照片模糊效果,CSS如何实现照片模糊?
- 软考信息安全工程师学习笔记四(1.4 信息安全标准化知识)
- Spring AOP看这个就够了
- Android 系统(135)---Android anr 分析步骤总结
- CentOS+Subversion
- 贪婪算法matlab程序,matlab贪婪算法
- java缓存有几种_JAVA几种缓存技术介绍说明
- 自主开发新媒体,湖南卫视封杀网络转播权
- SitePoint Podcast#167:炉边聊天
- 你知道你的手机上有哪些传感器吗?
- linux监控系统catic,网络设备监控-Catic添加H3C的监控图解
- 【Centos7进入root权限是报错:sudo: /etc/sudo.conf is owned by uid 1000, should be 0】
- Excel三维地图打不开
- svn拉取和提交大概步骤
- AVI音视频封装格式学习(三)——AVI 数据结构解析
- Java IO Steam
- Python Matplotlib 3D绘图详解(汇总)
- 南理工计算机学院老师联系电话,於东军(计算机科学与技术学院)老师 - 南京理工大学 - 院校大全...
热门文章
- vue生命周期学习(watch跟computed)
- 笔记本锁定计算机功能键,笔记本电脑键盘锁定键是哪个
- 数学建模——使用matlab神经网络工具箱训练和预测
- 新手,如何快速建立一个网站?
- 相对传统桌面设计器,在线报表设计器价值何在?
- 为什么鸿蒙不掉符,教你如何使用鸿蒙符 鸿蒙符的挽歌一波流的逆袭
- 魔兽三界血歌鸿蒙武器怎么合成,魔兽RPG剑域N3剧情攻略 特殊副本武器合成指南[多图]...
- 【数据结构】经典习题
- 2010年会考计算机试题,2010年浙江省信息技术会考试题 选择题 - 多媒体 - 图文
- 计算机主板维修试卷,计算机主板维修试卷.doc