天天看點

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);
           

至此,你就可以很簡單的實作那些很炫的效果了。

尤其是設定圖檔,太常見了,在開發中。