分享

TextView中分段改变文字的样式

 QCamera 2015-05-19

接触android不深的童鞋们是不是以为TextView只能整体设置颜色,大小啊?我最开始就是这么认为的。但是看到新浪微博客户端的效果时发现,这里有得搞。仔细看看android.text包,你会很有收获。这里不单可以分段改变TextView中的文字的样式,还可以向里面插入图片!有意思吧。android.text的包结构看起来丰满吧,这里主要用到Spanable和Span两部分(这哥俩都是接口,从命名方式也能看得出来)。Spanable说明实现类的样式可以被改变,Span说明实现类可以去改变别的类的样式。

下面写了一个用于改变文本样式的工具类,看我都用了小半年了,还是很管用的。

  1. /** 
  2.  * 目的:用list给一个view设置不同的样式<br /> 
  3.  * 包括:1. 字体的颜色和大小,2. 点击效果 
  4.  *  
  5.  * @author Daniel 
  6.  * @version 创建时间:2012-3-16 下午3:43:17 
  7.  */  
  8. public class TextParser {  
  9.     private List<TextBean> textList;  
  10.   
  11.     public TextParser() {  
  12.         textList = new LinkedList<TextBean>();  
  13.     }  
  14.   
  15.     /** 
  16.      * 添加文字 
  17.      * */  
  18.     public TextParser append(String text, int size, int color) {  
  19.         if (text == null) {  
  20.             return this;  
  21.         }  
  22.         TextBean bean = new TextBean();  
  23.         bean.text = text;  
  24.         bean.size = size;  
  25.         bean.color = color;  
  26.         textList.add(bean);  
  27.   
  28.         return this;  
  29.     }  
  30.   
  31.     /** 
  32.      * 添加带链接的文字 
  33.      * */  
  34.     public TextParser append(String text, int size, int color,  
  35.             OnClickListener onClickListener) {  
  36.         if (text == null) {  
  37.             return this;  
  38.         }  
  39.         TextBean bean = new TextBean();  
  40.         bean.text = text;  
  41.         bean.size = size;  
  42.         bean.color = color;  
  43.         bean.onClickListener = onClickListener;  
  44.         textList.add(bean);  
  45.   
  46.         return this;  
  47.     }  
  48.   
  49.     /** 
  50.      * 写入TextView 
  51.      * */  
  52.     public void parse(TextView textView) {  
  53.         // 先将文字放在一起,传入到SpannableBuilder中  
  54.         // 后面做的是对文本进行修饰和替换  
  55.         StringBuilder sBuilder = new StringBuilder();  
  56.         for (TextBean bean : textList) {  
  57.             sBuilder.append(bean.text);  
  58.         }  
  59.   
  60.         // 所有的文字和效果都要写在Spannable中,SpanableStringBuilder用于创建Spannable,  
  61.         // 其实它也是Spannable的一个实现类  
  62.         SpannableStringBuilder style = new SpannableStringBuilder(sBuilder);  
  63.         int position = 0;  
  64.         for (TextBean bean : textList) {  
  65.             if (bean.onClickListener != null) {  
  66.                 // 如果有点击,则在上面添加点击处理的Span  
  67.                 style.setSpan(new MyClickableSpan(bean.onClickListener),// Span接口用于实现对文本的修饰的具体内容  
  68.                         position,// 修饰的起始位置  
  69.                         position + bean.text.length(),// 修饰的结束位置  
  70.                         Spannable.SPAN_EXCLUSIVE_INCLUSIVE);  
  71.             }  
  72.             // 字体上色,字体的背景颜色也可以单独改变  
  73.             style.setSpan(new ForegroundColorSpan(bean.color), position,  
  74.                     position + bean.text.length(),  
  75.                     Spannable.SPAN_EXCLUSIVE_INCLUSIVE);  
  76.             // 改变字体大小  
  77.             style.setSpan(new AbsoluteSizeSpan(bean.size), position, position  
  78.                     + bean.text.length(), Spannable.SPAN_EXCLUSIVE_INCLUSIVE);  
  79.             /* 
  80.              * 如上所示,Spannalbe接口是说这个类可以被改变,Span说的是这个类可以去改变别的类 
  81.              * 整个改变样式做的就是用Span去改变Spannable中的内容。 
  82.              */  
  83.             position += bean.text.length();  
  84.         }  
  85.   
  86.         // 设置TextView让文字可以被点击  
  87.         textView.setMovementMethod(LinkMovementMethod.getInstance());  
  88.         textView.setText(style);  
  89.     }  
  90.   
  91.     /** 
  92.      * 用于记录文本的内容,字体,大小和监听器 
  93.      * */  
  94.     private class TextBean {  
  95.         public OnClickListener onClickListener;  
  96.         public String text;  
  97.         public int size;  
  98.         public int color;  
  99.     }  
  100.   
  101.     /** 
  102.      * 用于更改文字点击的事件和效果 
  103.      * */  
  104.     private static class MyClickableSpan extends ClickableSpan {  
  105.         private OnClickListener mOnClickListener;  
  106.   
  107.         public MyClickableSpan(OnClickListener onClickListener) {  
  108.             mOnClickListener = onClickListener;  
  109.         }  
  110.   
  111.         @Override  
  112.         public void onClick(View widget) {  
  113.             if (mOnClickListener != null) {  
  114.                 mOnClickListener.onClick(widget);  
  115.             }  
  116.         }  
  117.   
  118.         @Override  
  119.         public void updateDrawState(TextPaint ds) {  
  120.         }  
  121.   
  122.     }  
  123.   
  124. }  

使用这个类改变文本样式共分三布:

  1. 创建TextParser类
  2. 通过append向TextParser中添加文本和样式参数
  3. 调用parse将结果输出到TextView中
简单吧。以下是例子
  1. TextView textView=new TextView(context);  
  2. TextParser textParser=new TextParser();  
  3. textParser.append("A text in one style, ", 20, Color.BLUE);  
  4. textParser.append("and a text in another style.", 10, Color.GREEN);  
  5. textParser.parse(textView);  
结果就是生成半蓝半绿的文本。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多