美文网首页Android技术知识Android开发Android知识
SpannableString----让TextView实现炫酷

SpannableString----让TextView实现炫酷

作者: 邢二创 | 来源:发表于2017-01-16 17:17 被阅读718次

    在我们平时的开发过程中,肯定会遇见过一些图文混排的东西,甚至,同一段文字中,还有不同的字体、不同颜色、还有下划线、中间删除线、在我上家公司开发中的过程中,产品狗经常会问我们,这些字体能不能变得粗一点。这些需求。当时的思路就是很复杂的去自定义一些空间也能实现这样的需求,殊不知TextView就有这样的功能。这些复杂的功能就用一个TextView去实现,确实很让我吃惊。现在我就把我实现的这些效果的流程给走一遍。其实使用是很简单的。

    一、首先我们先看一个我做的效果图。


    效果.png

    二、使用的步骤

    1.实现TextView中部分文字的文字颜色、文字背景颜色。如果一般的开发人员就会选择利用多个TextView实现这样一段文字不同文字不用颜色、不同背景色的功能。

    实现代码如下
    
    /**
     * 设置文字背景色和文字颜色
     */
    private void setBackAndForeColor(){
        String content = "Iloveandroid!";
        SpannableStringBuilder builder = new SpannableStringBuilder(content);
        //背景颜色
        BackgroundColorSpan span = new BackgroundColorSpan(Color.RED);
        //设置文字的颜色
        ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.BLUE);
        builder.setSpan(span,2,5,Spannable.SPAN_INCLUSIVE_INCLUSIVE);
        builder.setSpan(foregroundColorSpan,5,7,Spannable.SPAN_INCLUSIVE_INCLUSIVE);
        SpannableStringBuilder builder1 = new SpannableStringBuilder(content);
        first.setText(builder);
    }
    

    </code>

    代码中有我们比较熟悉的代码,一般情况下我们会这样直接调用TextView.setText()设置TextView的文本内容。

            String content = "Iloveandroid!";
           first.setText(builder);
    

    2.TextView实现不同样式的步骤,最后在总结的时候在同阐述各个效果类、方法参数的含义</br>
    1.首先我们先对content进行处理

    SpannableStringBuilder builder = new SpannableStringBuilder(content);
    

    创建不同样式的对象,在这里咱们的代码是实现,部分位置的文字颜色、文字背景色的效果。就需要创建一个背景颜色的对象和一个文字颜色的对象。分别为

    //背景颜色
    BackgroundColorSpan span = new BackgroundColorSpan(Color.RED);
    //设置文字的颜色
    ForegroundColorSpan foregroundColorSpan = new   ForegroundColorSpan(Color.BLUE);
    

    3.把样式设置给要显示的文本,并且要设置一定的显示规则。

      builder.setSpan(span,2,5,Spannable.SPAN_INCLUSIVE_INCLUSIVE);
    

    4.把处理好的文本,设置给我们的控件,也是我们常用的。

     first.setText(builder);
    

    到这儿咱们就实现了在同一个TextView中实现复杂的样式效果。

    三、总结
    先看下TextView.setText()方法。参数为:setText(CharSequence text);
    在看一下CharSequence的继承关系
    如下图所示


    `6V$S9}6[)]@K(%GNR9W@AV.png

    SpannableStringBuilder 和 我们平时使用的String都是CharSequence 子类,所以我们可以这样使用。

    我们在看看 都有什么样式类
    ![ZB~80{D5A)$V0{R{L7}4OM.png
    我们先罗列出几个样式的类
    使用的基本上都是和设置文字颜色和背景颜色都是相同的

     * AbsoluteSizeSpan: 设置部分字体的大小
     * MaskFilterSpan:设置字体效果、模糊等
     * StyleSpan:
     * StrikethroughSpan:设置文字的删除线
     * UnderlineSpan:设置文字的下划线
     * ImageSpan:插入图片
     * ClickableSpan:为部分文字 加入点击事件 加入点击事件的时候当在为textview加入点击事件就会失效,这是事件分发机制的问题。可以自己解决
    

    添加点击事件的代码如下
    * private void setClick(){
    String content = "Iloveandroid!";
    SpannableStringBuilder builder = new SpannableStringBuilder(content);
    ClickableSpan span = new ClickableSpan() {
    @Override
    public void onClick(View widget) {
    Toast.makeText(MainActivity.this,"click",Toast.LENGTH_SHORT).show();
    }
    };
    builder.setSpan(span,3,7,Spanned.SPAN_INCLUSIVE_INCLUSIVE);
    tv5.setMovementMethod(LinkMovementMethod.getInstance());//这段代码一定要加上,否则点击事件没有响应。
    tv5.setText(builder);
    }
    */
    builder.setSpan(foregroundColorSpan,5,7,Spannable.SPAN_INCLUSIVE_INCLUSIVE);
    第一个参数是样式的对象
    第二个参数是开始位置
    第三个参数是结束位置
    第四个参数是显示的模式如下:

     /**
      * Spannable.SPAN_EXCLUSIVE_EXCLUSIVE目标位置前后都不应用span效果
      * Spannable.SPAN_SPAN_INCLUSIVE_INCLUSIVE标位置前不应用span效果,后面应用
      * Spannable.SPAN_EXCLUSIVE_INCLUSIVE标位置前不应用span效果,后应用
       * Spannable.SPAN_INCLUSIVE_EXCLUSIVE标位置前后都应用span效果
       */
    

    相关文章

      网友评论

        本文标题:SpannableString----让TextView实现炫酷

        本文链接:https://www.haomeiwen.com/subject/wdxgyttx.html