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

posted on 2019-07-22 18:47 观心静 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/guanxinjing/p/11227711.html

Android开发 SpannableString开发详解相关推荐

  1. Android:SpannableString使用详解

    在Android开发过程中,我们有时会需要TextView 显示各种格式的文本,包括字体颜色,大小,下划线,表情符号等等.对于这种需求,我们应该如何实现呢?答案是:SpannableString. 我 ...

  2. 【Android 应用开发】Ubuntu 下 Android Studio 开发工具使用详解 (旧版本 | 仅作参考)

    . 基本上可以导入项目开始使用了 ... . 作者 : 万境绝尘 转载请注明出处 : http://blog.csdn.net/shulianghan/article/details/21035637 ...

  3. Android开发入门一之Android应用程序架构详解

    Android应用程序架构详解如下: src/ java源代码存放目录 gen/自动生成目录 gen 目录中存放所有由Android开发工具自动生成的文件.目录中最重要的就是R.java文件.这个文件 ...

  4. Android网络开发技术实战详解

    <Android网络开发技术实战详解> 基本信息 作者: 朱桂英 丛书名: Android移动开发技术丛书 出版社:电子工业出版社 ISBN:9787121173493 上架时间:2012 ...

  5. Android应用开发—Intent组件详解

    转载自:Android中Intent组件详解 Intent是不同组件之间相互通讯的纽带,封装了不同组件之间通讯的条件. Intent本身是定义为一个类别(Class),一个Intent对象表达一个目的 ...

  6. 微信小程序开发登录界面mysql_微信小程序 欢迎界面开发的实例详解

    微信小程序 欢迎界面 市面上大多数的app都会有一个欢迎界面,下面将演示如何通过微信小程序实现一个欢迎界面. 下面将会按照以下的顺序介绍: 布局的实现 逻辑的实现 样式的实现 1.布局的实现 整个布局 ...

  7. java web编码详解_java web 开发 编码问题详解

    java web 开发 编码问题详解 浏览器 IE/FireFox ------------->Servlet容器-------------------------->显示页面 编码   ...

  8. webpack搭建php服务器,webpack搭建react开发环境步骤详解

    这次给大家带来webpack搭建react开发环境步骤详解,webpack搭建react开发环境的注意事项有哪些,下面就是实战案例,一起来看一下.mkdir react-redux && ...

  9. STM32开发 -- 低功耗模式详解(2)

    如需转载请注明出处:https://juyou.blog.csdn.net/article/details/98631012 上一篇文章 STM32开发 – 低功耗模式详解(1) 简单的总结了一下低功 ...

  10. php 实例 规范,PHP开发规范实例详解

    本文主要和大家分享PHP开发规范实例详解,希望能帮助到大家. 源文件 代码使用<?php开头 ,忽略闭合标签?> 文件格式必须是无BOM UTF-8格式 一个文件只声明一种类型,如clas ...

最新文章

  1. Android开发常用开源框架:图片处理
  2. ServletActionContext.getRequest().getSession() 和 ActionContext.getContext().getSession()的区别
  3. html设置照片模糊效果,CSS如何实现照片模糊?
  4. 软考信息安全工程师学习笔记四(1.4 信息安全标准化知识)
  5. Spring AOP看这个就够了
  6. Android 系统(135)---Android anr 分析步骤总结
  7. CentOS+Subversion
  8. 贪婪算法matlab程序,matlab贪婪算法
  9. java缓存有几种_JAVA几种缓存技术介绍说明
  10. 自主开发新媒体,湖南卫视封杀网络转播权
  11. SitePoint Podcast#167:炉边聊天
  12. 你知道你的手机上有哪些传感器吗?
  13. linux监控系统catic,网络设备监控-Catic添加H3C的监控图解
  14. 【Centos7进入root权限是报错:sudo: /etc/sudo.conf is owned by uid 1000, should be 0】
  15. Excel三维地图打不开
  16. svn拉取和提交大概步骤
  17. AVI音视频封装格式学习(三)——AVI 数据结构解析
  18. Java IO Steam
  19. Python Matplotlib 3D绘图详解(汇总)
  20. 南理工计算机学院老师联系电话,於东军(计算机科学与技术学院)老师 - 南京理工大学 - 院校大全...

热门文章

  1. vue生命周期学习(watch跟computed)
  2. 笔记本锁定计算机功能键,笔记本电脑键盘锁定键是哪个
  3. 数学建模——使用matlab神经网络工具箱训练和预测
  4. 新手,如何快速建立一个网站?
  5. 相对传统桌面设计器,在线报表设计器价值何在?
  6. 为什么鸿蒙不掉符,教你如何使用鸿蒙符 鸿蒙符的挽歌一波流的逆袭
  7. 魔兽三界血歌鸿蒙武器怎么合成,魔兽RPG剑域N3剧情攻略 特殊副本武器合成指南[多图]...
  8. 【数据结构】经典习题
  9. 2010年会考计算机试题,2010年浙江省信息技术会考试题 选择题 - 多媒体 - 图文
  10. 计算机主板维修试卷,计算机主板维修试卷.doc