通過Spannable對象設置textview的樣式


通過Spannable對象我們可以設置textview的各種樣式,其功能十分強大。通過SpannableString和它的setSpan(Object what, int start, int end, int flags)便可以對textview設置想要的效果了,這里的what就是效果名,start和end是設置這個樣式針對的是textview的字符位置。

1. 簡單用法

創建一個spannableString,textview可以通過setText設置這個對象,效果就是textview顯示了測試文字

     // 創建一個 SpannableString對象,
        // SpannableString implements GetChars,Spannable,CharSequence
        SpannableString msp = new SpannableString("測試文字");
     TextView textView = (TextView) findViewById(R.id.textView);
        // void android.widget.TextView.setText(CharSequence text)
        textView.setText(msp);

然后,我們通過這個msp的setSpan方法就可以設置文字的樣式了。

 

2. 設置字體樣式(TypefaceSpan)

字體有多個類型可以設置如:default,default-bold,monospace,serif,sans-serif,下面是兩個例子

        // setSpan會將start到end這間的文本設置成創建的span格式。span可以是圖片格式。
        // 設置字體(default,default-bold,monospace,serif,sans-serif)
        msp.setSpan(new TypefaceSpan("monospace"), 0, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 等寬字體
        msp.setSpan(new TypefaceSpan("serif"), 2, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 襯線字體

 

3. 設置字體的絕對大小

設置字體大小,單位可以選擇像素或者是dp

        // 設置字體絕對大小(絕對值,單位:像素)
        msp.setSpan(new AbsoluteSizeSpan(20), 4, 6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        // 第二個參數boolean dip,如果為true,表示前面的字體大小單位為dip,否則為像素,同上。
        msp.setSpan(new AbsoluteSizeSpan(20, true), 6, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

 

4. 設置字體的相對大小

設置的是當前字體是“當前”字體大小的多少倍

     // 設置字體相對大小(相對值,單位:像素) 參數表示為默認字體大小的多少倍
        msp.setSpan(new RelativeSizeSpan(0.5f), 8, 10, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 0.5f表示默認字體大小的一半
        msp.setSpan(new RelativeSizeSpan(2.0f), 10, 12, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 2.0f表示默認字體大小的兩倍

 

5. 設置前景色和背景色

        // 設置字體前景色 ,Color.MAGENTA為紫紅
        msp.setSpan(new ForegroundColorSpan(Color.MAGENTA), 12, 15, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 設置前景色為洋紅色
        // 設置字體背景色 ,Color.CYAN為青綠色
        msp.setSpan(new BackgroundColorSpan(Color.CYAN), 15, 18, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 設置背景色為青色

 

6. 設置字體的粗體,斜體,粗斜體

在我測試過程中斜體無效,不知是何原因。

     // 設置字體樣式正常,粗體,斜體,粗斜體
        msp.setSpan(new StyleSpan(android.graphics.Typeface.NORMAL), 18, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 正常
        msp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 20, 22, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 粗體
        msp.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 22, 24, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 斜體
        msp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD_ITALIC), 24, 27, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 粗斜體

 

7.設置下划線和刪除線

        // 設置下划線
        msp.setSpan(new UnderlineSpan(), 27, 30, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        // 設置刪除線
        msp.setSpan(new StrikethroughSpan(), 30, 33, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

 

8. 設置下標和上標

這里用1,和2來做上下標的測試

     // 設置上下標
        msp.setSpan(new SubscriptSpan(), 34, 35, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 下標
        msp.setSpan(new SuperscriptSpan(), 36, 37, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 上標

 

9. 設置超鏈接

可以連接網頁、地圖、電話、郵件等

        // 超級鏈接(需要添加setMovementMethod方法附加響應)
        msp.setSpan(new URLSpan("tel:4155551212"), 37, 39, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 電話
        msp.setSpan(new URLSpan("mailto:webmaster@google.com"), 39, 41, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 郵件
        msp.setSpan(new URLSpan("http://www.baidu.com"), 41, 43, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 網絡
        msp.setSpan(new URLSpan("sms:4155551212"), 43, 45, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 短信,使用sms:或者smsto:
        msp.setSpan(new URLSpan("mms:4155551212"), 45, 47, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 彩信,使用mms:或者mmsto:
        msp.setSpan(new URLSpan("geo:38.899533,-77.036476"), 47, 49, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 地圖

 

10. 拉伸字體

可以設置拉伸比,是橫向拉伸

     // 設置字體大小(相對值,單位:像素) 參數表示為默認字體寬度的多少倍
        msp.setSpan(new ScaleXSpan(2.0f), 49, 51, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 2.0f表示默認字體寬度的兩倍,即X軸方向放大為默認字體的兩倍,而高度不變

 

11. 全部代碼

xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="${relativePackage}.${activityClass}" >

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerHorizontal="true"
        android:layout_centerVertical="true"
        android:text="@string/hello_world" />

</RelativeLayout>

 

java

package com.kale.spannabletest;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.method.LinkMovementMethod;
import android.text.style.AbsoluteSizeSpan;
import android.text.style.BackgroundColorSpan;
import android.text.style.BulletSpan;
import android.text.style.ForegroundColorSpan;
import android.text.style.RelativeSizeSpan;
import android.text.style.ScaleXSpan;
import android.text.style.StrikethroughSpan;
import android.text.style.StyleSpan;
import android.text.style.SubscriptSpan;
import android.text.style.SuperscriptSpan;
import android.text.style.TypefaceSpan;
import android.text.style.URLSpan;
import android.text.style.UnderlineSpan;
import android.widget.TextView;

/**
 * @author:Jack Tony
 * @tips :參考:http://blog.csdn.net/xiangzilv1987/article/details/8212064#comments
 * @date :2015年1月13日
 */
public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 創建一個 SpannableString對象,
        // SpannableString implements GetChars,Spannable,CharSequence
        SpannableString msp = new SpannableString("測試文字字體大小一半兩倍前景色背景色正常粗體斜體粗斜體下划線刪除線x1x2電話郵件網站短信彩信地圖X軸綜合");

        // setSpan會將start到end這間的文本設置成創建的span格式。span可以是圖片格式。
        // 設置字體(default,default-bold,monospace,serif,sans-serif)
        msp.setSpan(new TypefaceSpan("monospace"), 0, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 等寬字體
        msp.setSpan(new TypefaceSpan("serif"), 2, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 襯線字體

        // 設置字體絕對大小(絕對值,單位:像素)
        msp.setSpan(new AbsoluteSizeSpan(20), 4, 6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        // 第二個參數boolean dip,如果為true,表示前面的字體大小單位為dip,否則為像素,同上。
        msp.setSpan(new AbsoluteSizeSpan(20, true), 6, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        // 設置字體相對大小(相對值,單位:像素) 參數表示為默認字體大小的多少倍
        msp.setSpan(new RelativeSizeSpan(0.5f), 8, 10, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 0.5f表示默認字體大小的一半
        msp.setSpan(new RelativeSizeSpan(2.0f), 10, 12, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 2.0f表示默認字體大小的兩倍

        // 設置字體前景色 ,Color.MAGENTA為紫紅
        msp.setSpan(new ForegroundColorSpan(Color.MAGENTA), 12, 15, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 設置前景色為洋紅色
        // 設置字體背景色 ,Color.CYAN為青綠色
        msp.setSpan(new BackgroundColorSpan(Color.CYAN), 15, 18, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 設置背景色為青色

        // 設置字體樣式正常,粗體,斜體,粗斜體
        msp.setSpan(new StyleSpan(android.graphics.Typeface.NORMAL), 18, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 正常
        msp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 20, 22, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 粗體
        msp.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 22, 24, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 斜體
        msp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD_ITALIC), 24, 27, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 粗斜體

        // 設置下划線
        msp.setSpan(new UnderlineSpan(), 27, 30, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        // 設置刪除線
        msp.setSpan(new StrikethroughSpan(), 30, 33, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        // 設置上下標
        msp.setSpan(new SubscriptSpan(), 34, 35, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 下標
        msp.setSpan(new SuperscriptSpan(), 36, 37, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 上標

        // 超級鏈接(需要添加setMovementMethod方法附加響應)
        msp.setSpan(new URLSpan("tel:4155551212"), 37, 39, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 電話
        msp.setSpan(new URLSpan("mailto:webmaster@google.com"), 39, 41, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 郵件
        msp.setSpan(new URLSpan("http://www.baidu.com"), 41, 43, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 網絡
        msp.setSpan(new URLSpan("sms:4155551212"), 43, 45, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 短信,使用sms:或者smsto:
        msp.setSpan(new URLSpan("mms:4155551212"), 45, 47, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 彩信,使用mms:或者mmsto:
        msp.setSpan(new URLSpan("geo:38.899533,-77.036476"), 47, 49, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 地圖

        // 設置字體大小(相對值,單位:像素) 參數表示為默認字體寬度的多少倍
        msp.setSpan(new ScaleXSpan(2.0f), 49, 51, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 2.0f表示默認字體寬度的兩倍,即X軸方向放大為默認字體的兩倍,而高度不變

        
        
        TextView textView = (TextView) findViewById(R.id.textView);
        //textView.setMovementMethod(LinkMovementMethod.getInstance());
        // void android.widget.TextView.setText(CharSequence text)
        textView.setText(msp);
        
    }
}

 

源碼下載:http://download.csdn.net/detail/shark0017/8358631

 

參考自:

http://www.iteedu.com/handset/android/spannablediary/intro.php

http://blog.csdn.net/xiangzilv1987/article/details/8212064#comments


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM