有关TextView的进阶应用(二)

SpannableString&SpannableStringBuilder定制文本

今天突然发现安卓里竟然还有 SpannableString 和 SpannableStringBuilder 这么个玩意,学习了下,做点笔记在这。

两者都是用来存储字符串的,区别在于前者针对的是不可变文本,而后者则是针对可变文本。主要是两者有一个SetSpan()的方法,能够给他自己存储的String添加样式,比如在原来String上加下划线、加背景色、改变字体颜色、用图片把指定的文字给替换掉,等等,这是他们俩优于String的地方。

两者的区别在于 SpannableString像一个String一样,构造对象的时候传入一个String,之后再无法更改String的内容,也无法拼接多个 SpannableString;而SpannableStringBuilder则更像是StringBuilder,它可以利用其append()方法来拼接多个String。

有关SetSpan()方法

void setSpan (Object what, int start, int end, int flags)

函数意义:给SpannableString或SpannableStringBuilder特定范围的字符串设定Span样式,可以设置多个(比如同时加上下划线和删除线等),Falg参数标识了当在所标记范围前和标记范围后紧贴着插入新字符时的动作,即是否对新插入的字符应用同样的样式。下面提一下这几个参数的含义:
Object what:对应各种span样式,

  • SpannableString可供我们使用的API有下面这些:
    BackgroundColorSpan 背景色
    ClickableSpan 文本可点击,有点击事件
    ForegroundColorSpan 文本颜色(前景色)
    MaskFilterSpan 修饰效果,如模糊(BlurMaskFilter)、浮雕(EmbossMaskFilter)
    MetricAffectingSpan 父类,一般不用
    RasterizerSpan 光栅效果
    StrikethroughSpan 删除线(中划线)
    SuggestionSpan 相当于占位符
    UnderlineSpan 下划线
    AbsoluteSizeSpan 绝对大小(文本字体)
    DynamicDrawableSpan 设置图片,基于文本基线或底部对齐。
    ImageSpan 图片
    RelativeSizeSpan 相对大小(文本字体)
    ReplacementSpan 父类,一般不用
    ScaleXSpan 基于x轴缩放
    StyleSpan 字体样式:粗体、斜体等
    SubscriptSpan 下标(数学公式会用到)
    SuperscriptSpan 上标(数学公式会用到)
    TextAppearanceSpan 文本外貌(包括字体、大小、样式和颜色)
    TypefaceSpan 文本字体
    URLSpan 文本超链接

int start:开始应用指定Span的位置,索引从0开始
int end:结束应用指定Span的位置,特效并不包括这个位置。
int flags:取值有如下四个
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前后都不包括,即在指定范围的前面和后面插入新字符都不会应用新样式
Spannable.SPAN_EXCLUSIVE_INCLUSIVE :前面不包括,后面包括。即仅在范围字符的后面插入新字符时会应用新样式
Spannable.SPAN_INCLUSIVE_EXCLUSIVE :前面包括,后面不包括。
Spannable.SPAN_INCLUSIVE_INCLUSIVE :前后都包括。

然后上DEMO截图和代码:
这里写图片描述

MainActivity.java代码

package com.example.dreamcreationman.androiddemo;

import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.BackgroundColorSpan;
import android.text.style.ImageSpan;
import android.text.style.URLSpan;
import android.text.style.UnderlineSpan;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView textView1=(TextView)findViewById(R.id.tv_1);
        TextView textView2=(TextView)findViewById(R.id.tv_2);

        SpannableString spannableString=new SpannableString("Hello Android! Hello Java!");
        spannableString.setSpan(new BackgroundColorSpan(Color.RED),0,4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        spannableString.setSpan(new UnderlineSpan(),5,10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        spannableString.setSpan(new URLSpan("tel:4155551212"),11,16, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        Drawable drawable=getResources().getDrawable(R.mipmap.ic_launcher);
        drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
        ImageSpan imageSpan=new ImageSpan(drawable,ImageSpan.ALIGN_BASELINE);
        spannableString.setSpan(imageSpan,17,20, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

        textView1.setText(spannableString);
    }
}

好了有关Android Studio里SpannableString&SpannableStringBuilder定制文本的分享就到这里了,欢迎在评论区留言指出错误,希望和大家一起进步!

谢谢观看。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值