zoukankan      html  css  js  c++  java
  • Android学习之——SpannableString和TextView的使用及研究

    前言

    相信大家对Android的TextView的使用已经相当熟悉了,但有没有发现TextView的文字总是那么单调,可以修改的就字体大小,颜色等等。要想实现自定义的文字,就要用到我们今天的主角——SpannableString了。

    定义

    This is the class for text whose content is immutable but to which markup objects can be attached and detached.
    SpannableString是文本内容不可改变,但标记对象可以绑定和解绑的类。

    官方文档中前半句话好理解,后半句就不怎么好理解了。问题就来了:

    • 什么是标记对象呢(markup objects)?
    • 绑定和解绑(attached and detached)又是什么意思呢?
    标记对象

    标记语言(也称置标语言、标记语言、标志语言、标识语言)是一种将文本(Text)以及文本相关的其他信息结合起来,展现出关于文档结构和数据处理细节的计算机文字编码。至于标记对象则是和标记语言一个意思,就是能设置文本的各种样式的方法。

    绑定和解绑

    至于什么事绑定和解绑,意思就是对于一个已经设置了标记对象的文本(已绑定标记对象)则可以移除它的标记对象。

    示例代码

       public class MainActivity extends ActionBarActivity {
       TextView mTextView;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mTextView = (TextView) findViewById(R.id.text);
        //创建SpannableString对象,内容不可修改
        SpannableString ss=new SpannableString("字体测试字体绝对大小相对大小缩放大小" +
                "前景颜色背景颜色字体样式下划线删除线上标X2下标Y3链接" +
                "字体外表图图图图");
        //使用setSpan()方法设置标记对象
        //使用removeSpan()解绑标记对象
        //public void setSpan (Object what, int start, int end, int flags)
        //绑定特定的标记对象(Object what)到起始为start,终止为end的text对象上(若已绑定标记对象则先移除)
        //设置字体TypefaceSpan()
        //设置字体大小(绝对值)AbsoluteSizeSpan()
        //设置字体大小(相对值)RelativeSizeSpan()
        //设置字体大小(相对值,默认字体宽度的倍数)ScaleXSpan()
        //设置字体的前景色ForegroundColorSpan()
        //设置字体的背景色BackgroundColorSpan()
        //设置字体的样式StyleSpan()
        //设置下划线UnderlineSpan()
        //删除线StrikethroughSpan()
        //上标SuperscriptSpan()
        //下标SubscriptSpan()
        //链接URLSpan()-->需要添加setMovementMethod方法附加响应
        //字体外观设置(依次包括字体名称,字体大小,字体样式,字体颜色,链接颜色)TextAppearanceSpan()
        //项目符号BulletSpan()
        //图片ImageSpan()
    
        //设置字体(default,default-bold,monospace,serif,sans-serif)
        ss.setSpan(new TypefaceSpan("sans-serif"),0,4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        ss.setSpan(new AbsoluteSizeSpan(30,true),4,10,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        ss.setSpan(new RelativeSizeSpan(0.5f),10,14,Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
        ss.setSpan(new ScaleXSpan(1.5f),14,18,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        ss.setSpan(new ForegroundColorSpan(Color.BLUE),18,22,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        ss.setSpan(new BackgroundColorSpan(Color.YELLOW),22,26,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        ss.setSpan(new StyleSpan(Typeface.BOLD),26,30,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        ss.setSpan(new UnderlineSpan(),30,33,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        ss.setSpan(new StrikethroughSpan(),33,36,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        ss.setSpan(new SuperscriptSpan(),39,40,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        ss.setSpan(new SubscriptSpan(),43,44,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        ss.setSpan(new URLSpan("http://www.baidu.com"),44,46,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    
    
        ColorStateList color = null;
        ColorStateList linkColor = null;
    
        XmlResourceParser parser = getResources().getXml(R.drawable.colorselector);
        try {
            color = ColorStateList.createFromXml(getResources(),parser);
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            linkColor = ColorStateList.createFromXml(getResources(),parser);
        } catch (XmlPullParserException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        ss.setSpan(new TextAppearanceSpan("serif",Typeface.BOLD_ITALIC,40,color,linkColor),46,50,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    
        Drawable drawable = getResources().getDrawable(R.mipmap.ic_launcher);
        drawable.setBounds(0,0,drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight());
        ss.setSpan(new ImageSpan(drawable), 50, 54, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        ss.setSpan(new BulletSpan(BulletSpan.STANDARD_GAP_WIDTH,Color.RED),0,ss.length(),Spanned.SPAN_COMPOSING);
        mTextView.setMovementMethod(LinkMovementMethod.getInstance());
        mTextView.setText(ss);
     }
    }
    

    效果示例

    效果示例图

  • 相关阅读:
    Windows下Git多账号配置,同一电脑多个ssh-key的管理
    Android ScrollView监听滑动到顶部和底部的两种方式(你可能不知道的细节)
    处理Linux下subversion尝试连接自建的VisualSVN server报“Key usage violation in certificate has been detected”错误的问题
    #Linux学习笔记# Linux文件的属性以及权限说明
    #Linux学习笔记# Linux文件的所有者、群组和其他人
    #Linux学习笔记# Linux在线帮助文档man page
    #Linux学习笔记# Linux系统查看文件内容的命令
    #Linux学习笔记# 自定义shell终端提示符
    Docker私有仓库Registry的搭建验证
    LinuxMint下Docker的安装部署和验证
  • 原文地址:https://www.cnblogs.com/JohnTsai/p/4547716.html
Copyright © 2011-2022 走看看