Android Span 介绍

概要

在安卓开发中,为了UI的美观,通常遇到UI设计会将一堆文字中的部分关键字突出显示,如下图。如果我们采用四个TextView来实现这种效果,确实能够完成,但是势必为对性能有一定的影响,我们完全可以通过一个TextView再借用Android提供的Span类来完成相同的效果。
这里写图片描述

Android Span 框架

Android Span 中主要有四大接口,分别为CharacterStyle、ParagraphStyle、UpdateAppearance、UpdateLayout。
CharacterStyle: 主要控制字符层次上的文字格式;
ParagraphStyle:主要控制段落层次上的文字格式;
UpdateAppearance:主要控制字符层次上的文字外观;
UpdateLayout: 主要控制字符层次上的度量或者尺寸;
Android提供了大量具体实现类,我们在使用的时候只需要利用具体实现类即可完成所需。

CharacterStyle 实现类主要有:

这里写图片描述

UpdateAppearance 实现类主要有:

这里写图片描述

其他连个接口可以通过AS自行查找,不在截图。

关于具体的细节使用可以参考下面这篇文档:
Android中各种Span的用法

案例

下面通过代码实现文档开始介绍的效果,效果如下:
这里写图片描述
首先看activity的布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context="com.example.androidqunyinhui.android.TextSpanTestActivity">

    <TextView
        android:id="@+id/tv_text_1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_margin="10dp"
        android:textSize="15sp"
        android:textColor="#cccccc"/>

</LinearLayout>

具体代码实现:

private void testSpan(){
        TextView tvInfo = (TextView) findViewById(R.id.tv_text_1);
        String text = "超越\n90%竞争者";

        SpannableStringBuilder ssb = new SpannableStringBuilder(text);
        // 设置文字相对大小,指相对于文本设定的大小的相对比例。
        ssb.setSpan(new RelativeSizeSpan(2.0f), 2, text.length()-4, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
        ssb.setSpan(new RelativeSizeSpan(1.2f), text.length()-4, text.length()-3, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
        // 设置文字颜色。
        ssb.setSpan(new ForegroundColorSpan(Color.BLUE), 2, text.length()-3, Spanned.SPAN_INCLUSIVE_INCLUSIVE);
        tvInfo.setText(ssb);
    }

通过如上的简单代码,即可。

参考文档

http://blog.csdn.net/u012422440/article/details/52133037
http://blog.csdn.net/qq_16430735/article/details/50427978

Android 中,SpannableString 和 SpannableStringBuilder 类可以用于构建富文本字符串,其中可以包含多种样式和事件响应。为了从 SpannableString 中获取特定类型的 Span 对象,可以使用 getSpans() 方法,该方法返回一个数组,其中包含了指定类型的所有 Span 对象。以下是一个示例: ```java SpannableString spannableString = new SpannableString("Hello, world!"); spannableString.setSpan(new StyleSpan(Typeface.BOLD), 0, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); spannableString.setSpan(new ForegroundColorSpan(Color.RED), 7, 12, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 获取所有的 StyleSpan StyleSpan[] styleSpans = spannableString.getSpans(0, spannableString.length(), StyleSpan.class); for (StyleSpan styleSpan : styleSpans) { int start = spannableString.getSpanStart(styleSpan); int end = spannableString.getSpanEnd(styleSpan); int flags = spannableString.getSpanFlags(styleSpan); // do something } // 获取所有的 ForegroundColorSpan ForegroundColorSpan[] colorSpans = spannableString.getSpans(0, spannableString.length(), ForegroundColorSpan.class); for (ForegroundColorSpan colorSpan : colorSpans) { int start = spannableString.getSpanStart(colorSpan); int end = spannableString.getSpanEnd(colorSpan); int flags = spannableString.getSpanFlags(colorSpan); // do something } ``` 在上面的代码示例中,我们使用 getSpans() 方法获取了所有的 StyleSpan 和 ForegroundColorSpan,然后遍历数组,获取每个 Span 对象的起始和结束位置以及标志位,并且可以对这些 Span 对象进行相应的操作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值