TextView进阶用法
在Android中TextView是我们最熟悉不过的控件了,但是它的进阶用法你知道多少呢?下面就来聊一聊TextView的进阶用法。
1.显示多种颜色
在做项目中经常会遇到一行字显示多种颜色的需求。用两个或多个TextView也可以实现,但这样比较费事,而且可能还要多一级布局嵌套。接下来我们需要用到SpannableStringBuilder这个类。
TextView textView = (TextView) findViewById(R.id.textview); String text = "TextView进阶用法"; SpannableStringBuilder ssb = new SpannableStringBuilder(text); ssb.setSpan(new ForegroundColorSpan(Color.RED),0,8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); ssb.setSpan(new ForegroundColorSpan(Color.GREEN),8,text.length(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); textView.setText(ssb);
效果如下:
TextView多种颜色
SpannableStringBuilder类实现了CharSequence接口,所以可以直接通过setText()设置值,它更像一个StringBuilder,同时也有append()方法。这样的话无论要指定多少颜色,都可以通过setSpan()来根据字符串的索引长度来解决。
注意:
1.参数start为闭区间,end为开区间。即本例中的0,8实际代表从0~7的长度。 2.int flags:取值有如下四个 Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前后都不包括,即在指定范围的前面和后面插入新字符都不会应用新样式 Spannable.SPAN_EXCLUSIVE_INCLUSIVE:前面不包括,后面包括。即仅在范围字符的后面插入新字符时会应用新样式 Spannable.SPAN_INCLUSIVE_EXCLUSIVE:前面包括,后面不包括。 Spannable.SPAN_INCLUSIVE_INCLUSIVE:前后都包括。 大家可以自己试下取不同flags时的效果,可以用EditText试验。
2.显示不同大小
将ForegroundColorSpan改为AbsoluteSizeSpan。
ssb.setSpan(new AbsoluteSizeSpan(80),0,8,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
3.删除线(StrikethroughSpan)
ssb.setSpan(new StrikethroughSpan(),0,8,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
4.下划线(UnderlineSpan)
ssb.setSpan(new UnderlineSpan(),0,8,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
5.加粗斜体(StyleSpan)
粗体:ssb.setSpan(new StyleSpan(Typeface.BOLD),0,8,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); 斜体:ssb.setSpan(new StyleSpan(Typeface.ITALIC),0,8,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
6.设置点击事件
ssb.setSpan(new ClickableSpan() { @Override public void onClick(View widget) { Toast.makeText(getApplicationContext(),"被点击了",Toast.LENGTH_SHORT).show(); } },0,8,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //须调用此方法,不然点击无效textView.setMovementMethod(LinkMovementMethod.getInstance());
最终效果如下:
TextView多种颜色
当然,如果你想及设置点击又设置颜色或下划线的话,ClickableSpan也提供了一个回调方法来设置颜色下划线等属性。
@Overridepublic void updateDrawState(TextPaint ds) { ds.setColor(Color.RED); ds.setUnderlineText(true); }
附上完整代码
TextView textView = (TextView) findViewById(R.id.textview); String text = "TextView进阶用法"; SpannableStringBuilder ssb = new SpannableStringBuilder(text); ssb.setSpan(new ForegroundColorSpan(Color.RED),0,8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); ssb.setSpan(new ForegroundColorSpan(Color.GREEN),8,text.length(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); ssb.setSpan(new AbsoluteSizeSpan(80),0,8,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); ssb.setSpan(new StrikethroughSpan(),0,8,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); ssb.setSpan(new UnderlineSpan(),0,8,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); ssb.setSpan(new StyleSpan(Typeface.BOLD),0,8,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); ssb.setSpan(new StyleSpan(Typeface.ITALIC),0,8,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); ssb.setSpan(new ClickableSpan() { @Override public void onClick(View widget) { Toast.makeText(getApplicationContext(),"被点击了",Toast.LENGTH_SHORT).show(); } @Override public void updateDrawState(TextPaint ds) { ds.setColor(Color.RED); ds.setUnderlineText(true); } },0,8,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //须调用此方法,不然点击无效 textView.setMovementMethod(LinkMovementMethod.getInstance()); textView.setText(ssb);
作者:程序猿Jeffrey
链接:https://www.jianshu.com/p/6e9ab528bfb3
点击查看更多内容
1人点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦