SpannableString,多个textview合为一个,还可以为TextView添加图片

       最近产品提出一个需求,就是模仿微信朋友圈,然后就想怎么做,本文主要来讲的是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顾名思义就是设置背景色,构造器中的第一个参数是要设置的字体颜色,第二个参数是从某个位置开始,第三个参数是从某个位置结束,第四个参数的意思是下面自己翻译一下。
/**
 * 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.
 */
接着就是给textview添加图片,
  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的对象,第二个参数是点击事件的起始位置,第三个参数是点击事件的结束位置,也就是这两个参数就设置了点击事件的区域.
     常用的也就这些用法了,以后遇到别的用法再补充。


        

你可能感兴趣的:(Android)