最近产品提出一个需求,就是模仿微信朋友圈,然后就想怎么做,本文主要来讲的是SpannableString,关于朋友圈设计的其它知识点就不说了。其实用起来很简单,难搞的地方就是位置的计算,一不小心就会角标越界,接下来会说一下SpannableString的常用的用法。
为textview添加文字和图片。
String content = "小凡送给主播跑车3个";
SpannableString sInfo = new SpannableString(content);
sInfo.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.text_white)),content.length()-4, content.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);这是给textview设置字体颜色,ForegroundColorSpan顾名思义就是设置背景色,构造器中的第一个参数是要设置的字体颜色,第二个参数是从某个位置开始,第三个参数是从某个位置结束,第四个参数的意思是下面自己翻译一下。接着就是给textview添加图片,/** * Spans of type SPAN_EXCLUSIVE_EXCLUSIVE do not expand * to include text inserted at either their starting or ending point. * They can never have a length of 0 and are automatically removed * from the buffer if all the text they cover is removed. */CustomImageSpan imageSpan = new CustomImageSpan(goodsDrawable);添加图片需要用到这个类CustomImageSpan,构造器中的参数是Drawable,也就是你要设置的图片,得到CustomImageSpan的对象后,sInfo.setSpan(imageSpan, content.length() + 1, content.length() + 2,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);还是调用上面的方法,这次传的参数除了第一个,其它三个都是一样的,意思也是一样的,第一个参数变为了CustomImageSpan的对象,这样就把图片添加到了你的textview的最后面了,也就是(小凡送给主播跑车3个+图片)。为textview上不同的文字位置添加点击事件。
String content = "小凡送给主播跑车3个";
SpannableString sInfo = new SpannableString(content);sInfo.setSpan(new ClickableSpan() { @Override public void onClick(View view) { //这里就是点击事件了,可以在这里处理你的点击事件 } @Override public void updateDrawState(TextPaint ds) { super.updateDrawState(ds); ds.setColor(mContext.getResources().getColor(R.color.text_red)); ds.setUnderlineText(false); } }, content.length()-4, comment.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);其实和上面添加文字颜色和图片是一样的,只是第一个参数不一样,第一个参数变为了ClickableSpan的对象,第二个参数是点击事件的起始位置,第三个参数是点击事件的结束位置,也就是这两个参数就设置了点击事件的区域.
常用的也就这些用法了,以后遇到别的用法再补充。