Android学习之Span的使用方法详解

目录
  • Span集合
    • 段落类Span
    • 其他Span
  • 展示效果
  • 小试牛刀
  • 小结

Span集合

段落类Span

BulletSpan

为段落开头增加项目符号并支持大小、颜色、弧度

span.append(SpannableString("BulletSpan").also {
    it.setSpan(BulletSpan(40, Color.RED), 0, 10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
})

QuoteSpan

为段落开头增加垂直引用线

span.append(SpannableString("\nQuoteSpan").also {
    it.setSpan(QuoteSpan(Color.BLUE), 0, 9, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
})

AlignmentSpan

影响段落对齐方式,支持三种模式:常规、居中、反方向对齐

span.append(SpannableString("\nAlignmentSpan ALIGN_CENTER").also {
    it.setSpan(
        AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER),
        0,
        "AlignmentSpan ALIGN_CENTER".length,
        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
    )
})

UnderlineSpan

为文本段落增加下划线

span.append(SpannableString("\nUnderlineSpan").also {
    it.setSpan(
        UnderlineSpan(),
        0,
        "UnderlineSpan".length,
        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
    )
})

StrikethroughSpan

为文本段落增加删除线

span.append(SpannableString("\nStrikethroughSpan").also {
    it.setSpan(
        StrikethroughSpan(),
        0,
        "StrikethroughSpan".length,
        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
    )
})

SubscriptSpan

为文本段落实现下标字符效果,缩小文本大小。

span.append(SpannableString("\n123SubscriptSpan456").also {
    it.setSpan(
        SubscriptSpan(),
        3,
        "SubscriptSpan".length,
        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
    )
})

SuperscripSpan

为文本段落实现上标字符效果,缩小文本大小。

span.append(SpannableString("\n123SuperscriptSpan456").also {
    it.setSpan(
        SuperscriptSpan(),
        3,
        "SuperscriptSpan".length,
        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
    )
})

TextApperanceSpan

根据配置文件信息为文本添加样式,可塑性更方便易用和复写。

span.append(SpannableString("\nTextAppearanceSpan").also {
    it.setSpan(
        TextAppearanceSpan(this@FuncSpannableAc,R.style.specialTextAppearance),
        0,
        "TextAppearanceSpan".length,
        Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
    )
})

结合xml文件样式配置使用

<style name="specialTextAppearance" parent="@android:style/TextAppearance">
    <item name="android:textColor">@android:color/holo_red_dark</item>
    <item name="android:textColorHighlight">@android:color/holo_blue_bright</item>
    <item name="android:textColorHint">@color/purple_700</item>
    <item name="android:textColorLink">@color/purple_200</item>
    <item name="android:textSize">20sp</item>
    <item name="android:textStyle">italic</item>
</style>

其他Span

BackgroundColorSpan

为文本段落增加背景色效果。

span.setSpan(BackgroundColorSpan(Color.BLUE), 0, 9, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)

ForegroundColorSpan

修改文本颜色,主要是因为在一个段落中可能需要修改某几个字符颜色。

span.setSpan(ForegroundColorSpan(Color.RED), 0, 9, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)

TextClickableSpan

为文本段落增加可点击,可以理解为自定义的URLSpan。因此点击事件需要开发者自定义继承实现ClickableSpan

span.setSpan(TextClickableSpan(), 10, 19, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
class TextClickableSpan : ClickableSpan() {
    override fun onClick(widget: View) {
        Toast.makeText(widget.context, "TextClickSpan", Toast.LENGTH_SHORT).show()
    }
}

URLSpan

为文本段落增加超链接点击功能,可跳转到网页(外置浏览器形式)。

另外一个小TipssetSpan是可以在同一下标设置多重样式效果。例如URLSpanForegroundColorSpan可重叠使用,原URLSpan超链接的文本颜色需要替换结合ForegroundColorSpan就能实现。

span.setSpan(
    URLSpan("https://www.baidu.com"),
    20,
    23,
    Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)
// 尝试超链接是否可以修改颜色(结果是可以说明和上述BackgroundColorSpan和ForegroundColorSpan一样)
span.setSpan(ForegroundColorSpan(Color.RED), 20, 23, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)

StyleSpan

修改文本段落样式,可设置样式较为有限。一般还是推荐使用TextApperanceSpan可配置项更多

span.setSpan(StyleSpan(Typeface.BOLD), 38, 47, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)

ImageSpan

支持在段落中插入图片资源,支持类型包括可以是Bitmap图片资源、ResourceId资源文件又或者是本地文件Uri资源。

span.setSpan(
    ImageSpan(this, R.mipmap.ic_launcher, DynamicDrawableSpan.ALIGN_BASELINE),
    47, 48, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
)

展示效果

小试牛刀

对于长文本内容需要设置多种样式时尽量使用SpannableStringBuilder方便定位每个新增setSpan的下标而不需要使用SpannableString来计算定位每个位置来确认样式(容易出错)可以避免需要不必要麻烦和错误。

var spannableString = SpannableString("ColorSpan ClickSpan URL UnderlineSpan StyleSpan ")

spannableString.also { span ->
    span.setSpan(BackgroundColorSpan(Color.BLUE), 0, 9, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
    span.setSpan(ForegroundColorSpan(Color.RED), 0, 9, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
    ......
}
var spannableString2 = SpannableStringBuilder("")
spannableString2.also { span ->
    span.append(SpannableString("BulletSpan").also {
        it.setSpan(BulletSpan(40, Color.RED), 0, 10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
    })
    span.append(SpannableString("\nQuoteSpan").also {
        it.setSpan(QuoteSpan(Color.BLUE), 0, 9, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
    })
}

两者代码一对比就能知道采用SpannableStringBuilder形式代码结构和可读性以及出现样式定位错误的情况会小很多。

如图所示过去对于这种样式开发者或许会选择使用两个TextView来实现,前面为固定文本后面是参数内容。在了解如何使用Span为TextView增加样式只需一个TextView就能实现,同时也减轻一些业务开发量(当参数为空时整个view不展示、view布局关系依赖和层级更简单等)

var spannableString3 = SpannableStringBuilder("")
spannableString3.also { span ->
    span.append(SpannableString("人均费用:").also {
        it.setSpan(StyleSpan(Typeface.BOLD), 0, "人均费用".length + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE)
    })
    span.append(SpannableString("99元/人"))
}

小结

学会使用Span对于文本样式开发会有所帮助,能够快速开发易用方便的文本样式效果。但对于其他一些效果或许无法达成例如形状样式结合文本共用同一个TextView开发会存在困难。

到此这篇关于Android学习之Span的使用方法详解的文章就介绍到这了,更多相关Android Span使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Android使用Span打造丰富多彩的文本详解

    目录 1.引言 2.SpannableStringBuilder的基本用法 3.使用Span给文本添加效果 3.1 AbsoluteSizeSpan 3.2 BackgroundColorSpan 3.3 ClickableSpan 3.4 DrawableMarginSpan 3.5 DynamicDrawableSpan 3.6 ForegroundColorSpan 3.7 IconMarginSpan 3.8 ImageSpan 3.9 MaskFilterSpan 3.10 Quote

  • Android 自定义 View 中使用 Spannable的实例详解

    我们都知道 Android 中使用 Spannable 可以实现 TextView 富文本的显示,但是在自定义控件中如何使用 Spannable 绘制不同样式的文字呢? 例如这种效果,标题中的 分数字61 是粗体,分 是常规字体,并且相对于 61 更小些. 第一反应可能是使用 SpannableString.setSpan() 设置 RelativeSizeSpan, 然后在 onDraw() 中进行绘制,事实是这样实现是没有效果的,因为 onDraw() 中只能获取到 SpannableStr

  • Android中的SpannableString与SpannableStringBuilder详解

    前言 最近在学习Android开发,发现确实有太多东西需要去整理,去学习.慢慢来吧,任何东东的深入学习都是不简单的.今天稍微整理下SpannableString与SpannableStringBuilder,因为在上篇中,我们曾讲到过有关CharSequence的东东,有关CharSequence的话,这两个类是必谈的,所以这里加以整理. 一.概述 1.SpannableString.SpannableStringBuilder与String的关系 首先SpannableString.Spann

  • Android利用SpannableString实现格式化微博内容

    前言 在Android开发中,有许多信息展示需要通过TextView来展现,如果只是普通的信息展现,使用TextView setText(CharSequence str)设置即可,但是当在TextView里的这段内容需要截取某一部分字段,可以被点击以及响应响应的操作,这时候就需要用到SpannableString了,SpannableString 配合 TextView 可以轻松实现对特定的文本做特定处理,例如可以修改文字颜色.背景色.将文字替换为图片实现,点击效果等. 首先看看最终实现的效果

  • Android自定义可点击的ImageSpan并在TextView中内置View

    有的时候可能想在TextView中添加一些图片,比如下图,发短信输入联系人时,要把联系人号码换成一个图片,但这个图片无法用固定的某张图,而是根据内容进行定制的,这更像一个view. 当然,如果你不是view而是固定的图片,比如发信息时用表情图片替代特殊符号,那么实现起来会更加简单.又或许,你希望这个图片是可点击的.这里,笔者要介绍的就是怎么用一个自定义的ImageSpan来实现在文本里插入可点击的图片或View. 在此之前,如果你还不了解SpannableString.setSpan(),不了解

  • Android SpannableString设置超链接、颜色、字体等属性

    Android SpannableString设置超链接.颜色.字体等属性 在Android中,TextView是我们最常用的用来显示文本的控件. 一般情况下,TextView中的文本都是一个样式.那么如何对于TextView中各个部分的文本来设置字体,大小,颜色,样式,以及超级链接等属性呢?下面我们通过SpannableString的具体实例操作来演示一下. package com.snowdream; import java.io.IOException; import org.xmlpul

  • Android学习之Span的使用方法详解

    目录 Span集合 段落类Span 其他Span 展示效果 小试牛刀 小结 Span集合 段落类Span BulletSpan 为段落开头增加项目符号并支持大小.颜色.弧度 span.append(SpannableString("BulletSpan").also { it.setSpan(BulletSpan(40, Color.RED), 0, 10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE) }) QuoteSpan 为段落开头增加垂直引用线 sp

  • Android学习之本地广播使用方法详解

    本地广播信息只能在应用程序内部传递,同时广播接收器也只能接收应用程序内部的广播消息. MainActivity代码 package com.example.luobo.mybroadcastreceiver; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; imp

  • Android程序打包为APK的方法详解

    Andriod安装包文件(Android Package),简称APK,后缀名为.apk. 1.生成未签名的安装包 Build -> Build Bundle(s)/APK(s) -> Build APK(s)    会生成一个未签名的apk文件,默认为debug版,可以正常安装使用. 可以 Build -> Select Build Variant -> 选择生成的apk版本(debug.release),再 Build -> Build Bundle(s)/APK(s)

  • Android适配底部虚拟按键的方法详解

    最近项目进行适配的时候发现部分(如华为手机)存在底部虚拟按键的手机会因为虚拟按键的存在导致挡住部分界面,因为需要全屏显示,故调用虚拟按键隐藏方法使之隐藏,然而发现出现如下问题: 手动操作隐藏虚拟按键后出现长白条区域 不自动隐藏 滑出状态栏后虚拟按键也出来,状态栏隐藏后虚拟却不跟着隐藏 在没有虚拟按键的设备上影响了SurfaceView全屏显示图传(原本全屏显示的图传在切出去再进来时变成了小屏显示) 通过google了很多方法并尝试终于解决了这个问题,达到如下效果: 每次进入界面时虚拟按键自动隐藏

  • Android 通过代码安装 APK的方法详解

    在 APK 开发中,通过 Java 代码来打开系统的安装程序以安装 APK 并不是什么难事,一般的 Android 系统都有开放这一功能. 但随着 Android系统版本的迭代,其对于权限的把控越来越严格,或者说是变得越来越注重安全性.这就导致了以前可以通过很简单的几行代码就能实现的功能,现在要复杂很多. 对于通过代码打开系统安装程序这一功能的限制,其分水岭在 Android7.0,即 Android N 上.通常在 Android N以上的系统使用一种做法,以下则使用另一种做法. 传统的通过代

  • jsp学习之scriptlet的使用方法详解

    scriptlet的使用 jsp页面中分三种scriptlet: 第一种:<% %> 可以在里面写java的代码.定义java变量以及书写java语句. 第二种:<%! %> 可以在里面定义全局变量以及方法,类. 第三种:<%=%> 用于打印变量或者输出值. <% %>的使用 <html> <head> <title>this is java page</title> </head> <bod

  • 利用Android实现光影流动特效的方法详解

    目录 前言 MaskFilter 类简介 MaskFilter 的几种效果对比 光影流动 光影流动效果1 光影流动效果2 光影流动效果3 光影流动效果4:光影沿贝塞尔曲线流动 总结 前言 Flutter 的画笔类 Paint 提供了很多图形绘制的配置属性,来供我们绘制更丰富多彩的图形.前面几篇我们介绍了 shader 属性来绘制全屏渐变的聊天气泡背景.渐变流动的边框和毛玻璃效果的背景图片,具体可以参考下面几篇文章. 让你的聊天气泡丰富多彩! 手把手教你实现一个流动的渐变色边框 利用光影变化构建立

  • Android使用jni调用c++/c方法详解

    1.下载ndk 2.编写jni的加载类 参考例子: public class JniTest { public native String append(String str1, String str2); static { System.loadLibrary("JniTest"); } } 以上append方法就是要调用c++/c中的方法. JniTest是在Android.mk里约束好的,关于Android.mk的编写具体在后面详解. 3.使用javah -jni生成.h文件 编

  • Android编程自定义AlertDialog样式的方法详解

    本文实例讲述了Android编程自定义AlertDialog样式的方法.分享给大家供大家参考,具体如下: 开发的时候,通常我们要自定义AlertDialog来满足我们的功能需求: 比如弹出对话框中可以输入信息,或者要展示且有选择功能的列表,或者要实现特定的UI风格等.那么我们可以通过以下方式来实现. 方法一:完全自定义AlertDialog的layout.如我们要实现有输入框的AlertDialog布局custom_dialog.xml: <?xml version="1.0"

  • Android编程解析XML文件的方法详解【基于XmlPullParser】

    本文实例讲述了Android编程解析XML文件的方法.分享给大家供大家参考,具体如下: 前言 在学习Android的Framework层源码时,Android大量的使用XmlPullParser来解析xml文件的源码.因此,这里也顺道介绍一下XmlPullParser的使用. XML XML(eXtensible Markup Language)中文名为可扩展标记语言.标记指计算机所能理解的信息符号,通过此种标记,计算机之间可以处理包含各种信息的文章等. 用途 XML设计用了传送及携带数据信息,

随机推荐