天天看点

android之SpannableString设置多彩多样的textview

我们在项目中很常用到一个效果,那就是一段文字,设置字体大小不一样,以求突出显示效果,或者为哪几个文字加上不同的色彩,或者加上超链接,电话,邮件等,就像是html里面的那种点击跳转的链接;

其实,Google已经提供了实现这种效果的方法给我们了,只是我们在实际开发中,很少知道有这个方法。以至于我们项目中实现这样的效果,其实都是通过两个及以上的textview来区分实现这样的效果。这样岂不是很麻烦了么;

下面我就给大家介绍实现此效果的方法,直接上代码;

SpannableString ss = new SpannableString("超链接" + "\t" +"唐卡abc");//new 一个SpannableString对象
           

下面是spannablestring对象的使用,直接看注释,都很清楚,就不发效果图了,直接用就OK

SpannableString ss = new SpannableString(mFormat.format(count) + "\t" + unit);
        /**
         * 首先拿到一个TextView,然后构造一个SpannableString,构造方法中传入的参数就是我们要显示的文字,
         * 然后就是一个最终要的方法,通过setSpan来设置背景色,
         * 第一个参数是我们要设置的背景颜色,
         * 第二第三个参数是我们要给哪一段的文字设置背景(该段文字的startIndex和endIndex)
         * 最后一个参数有四个值:
         * SPAN_INCLUSIVE_EXCLUSIVE:前面包括,后面不包括,即在文本前插入新的文本会应用该样式,而在文本后插入新文本不会应用该样式
         * SPAN_INCLUSIVE_INCLUSIVE:前面包括,后面包括,即在文本前插入新的文本会应用该样式,而在文本后插入新文本也会应用该样式
         * SPAN_EXCLUSIVE_EXCLUSIVE:前面不包括,后面不包括
         * SPAN_EXCLUSIVE_INCLUSIVE:前面不包括,后面包括
         *
         */
        ss.setSpan(new BackgroundColorSpan(Color.parseColor("#FFD700")), 0,
                ss.length(), Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
        textView.append("超链接,新加的文字");
        ss.setSpan(new ClickableSpan() { //添加监听回调
            @Override
            public void onClick(View widget) {
                Toast.makeText(mContext, "超链接", Toast.LENGTH_SHORT).show();
            }
        }, 0, 3, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        // 设置textView为可点击状态,以下方法是设置"超链接"为可点击状态
        textView.setMovementMethod(LinkMovementMethod.getInstance());
        //设置前景色
        ss.setSpan(new ForegroundColorSpan(Color.parseColor("#FF3030")), 0,
                ss.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        /**
         *设置删除线效果
         * 以下还有其它的设置,都是在setSpan第一个参数里头进行设置
         * new UnderlineSpan() :设置下划线
         *new ScaleXSpan(2) :ScaleXSpan中的参数大于1表示横向扩大,小于1大于0表示缩小,等于1表示正常显示
         * new StyleSpan(Typeface.BOLD):设置字体粗体样式,Typeface.BOLD_ITALIC:斜体+粗体
         * new BackgroundColorSpan(Color.YELLOW):文字背景颜色
         * new ForegroundColorSpan(Color.BLUE):文字颜色
         * new AbsoluteSizeSpan(36):文字大小
         * new StrikethroughSpan():删除线
         *
         * 上下标的使用:
         * new SubscriptSpan():设置下标
         * new AbsoluteSizeSpan(30):设置下标字体大小
         * new SuperscriptSpan():设置上标
         * new URLSpan("tel:13534884482"):打电话
         * new URLSpan("smsto:13534884482"):发短信
         * new URLSpan("mailto:[email protected]"):发邮件
         * new URLSpan("http://www.baidu.com"):浏览网友
         * 最后都要设置textView的 setMovementMethod(LinkMovementMethod.getInstance())方法
         */
        ss.setSpan(new StrikethroughSpan(), 0, ss.length(),
                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        /**
         * 第一个参数传入一个DynamicDrawableSpan对象,
         * 其中这个对象的构造函数是图片的对齐方式,一共有两种,如注释
         * ,实现该类的getDrawable方法,返回一个Drawable对象即可
         * ,注意这里的图片会替换掉文字(如果我们使用这种效果,很多情况下就是要让图片替换掉文字,
         * 所以这并不算一个问题)
         */
        ss.setSpan(
                // DynamicDrawableSpan.ALIGN_BASELINE表示依照基线对齐
                // DynamicDrawableSpan.ALIGN_BOTTOM表示依照底部对齐
                new DynamicDrawableSpan(DynamicDrawableSpan.ALIGN_BOTTOM) {
                    @Override
                    public Drawable getDrawable() {
                        Drawable d = mContext.getResources().getDrawable(
                                R.drawable.logo_tcl);
                        d.setBounds(0, 0, 150, 150);
                        return d;
                    }
                }, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);// 这里的参数0,1表示将“设”字替换为图片
        ss.setSpan(new AbsoluteSizeSpan(smallSize),
                ss.length() - unit.length(), ss.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        textView.setText(ss);
           

至此,你就可以很简单的实现那些很炫的效果了。

尤其是设置图片,太常见了,在开发中。