一個TextView設置多種格式(相似於「評論」的樣式)

若是本文幫助到你,本人不勝榮幸,若是浪費了你的時間,本人深感抱歉。 但願用最簡單的大白話來幫助那些像我同樣的人。若是有什麼錯誤,請必定指出,以避免誤導你們、也誤導我。 本文來自:www.jianshu.com/users/320f9… 感謝您的關注。git

先看一張效果圖。 主要功能: 1.只有一個 TextView,可是顯示多個樣式,而且,前幾個字是能夠點擊。 2.修改 Toast 的彈出位置。github

這類效果,使用場景最多的,應該就是評論了吧。app

主角介紹 - SpannableString

主要用的到就是 SpannableString 這個類,其實還有個SpannableStringBuilder,他們兩個做用跟String實際上是很像的。不一樣之處就是他們倆能夠給字符串設置各類樣式。 SpannableString 和 SpannableStringBuilder 的區別也就是字面意思,多了一個Builder。相似於 String 和 StringBuilder。SpannableStringBuilder 是能夠經過append()方法進行拼接。而SpannableString 經過構造器建立了以後就固定。ide

使用方法

String name = "小可愛:";
String msg = name + "小今天心情不錯,買張彩票。";

SpannableString ss = new SpannableString(msg);
ss.setSpan(new ForegroundColorSpan(Color.RED), name.length(), msg.length() - 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mTxt.setText(ss);
複製代碼

由於SpannableString 實現了CharSequence的接口,因此這一步以後,咱們定義的 ss,就能夠做爲字符串設置給TextView了。 顯示效果是:除了「小可愛:",後面的都是紅色字。 固然,咱們是能夠同時給一個字符串設置多個樣式的。字體

很明顯咱們能夠看到經過setSpan()這個方法,咱們就將指定的字符更換了樣式。 咱們具體來看看 setSpan(); 到底有多麼的神通廣大。ui

/**
 * 設置字符串的樣式
 * @param what 對應的樣式的類(往下看)
 * @param start 樣式開始的位置
 * @param end 樣式結束的位置
 * @param flags 包含的範圍(往下看)
 */
public void setSpan (Object what, int start, int end, int flags)
複製代碼

起始結束位置就不用說了,就是符合行業的標準模式,含頭不含尾。 這裏須要介紹是第一個和第四個參數。 咱們先來看第四個: int flags可設置爲:spa

Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:先後都不包括,即在指定範圍的前面和後面插入新字符都不會應用新樣式
Spannable.SPAN_EXCLUSIVE_INCLUSIVE:前面不包括,後面包括。即僅在範圍字符的後面插入新字符時會應用新樣式
Spannable.SPAN_INCLUSIVE_EXCLUSIVE:前面包括,後面不包括。
Spannable.SPAN_INCLUSIVE_INCLUSIVE:先後都包括。
複製代碼

這裏系統給定了四個參數,含義已經註明。 須要說明的是,SpannableString 和 SpannableStringBuilder 的區別 在開頭提到了,不知道你們還記得嗎? 只有 SpannableStringBuilder 是能夠經過append()方法,日後面拼接字符串的,而這幾個標示都是當字符串改變以後的效果,因此後面三個樣式的效果,可能只有使用了SpannableStringBuilder 添加文字的時候纔看獲得效果。 使用SpannableString ,添加了其餘的flags也是沒有什麼用的,由於,只要一替換文字,整個對象全換了。 因此這個參數,咱們看着用 就好。code

Object what 這個參數,那但是至關強大。先看功能cdn

一、BackgroundColorSpan 背景色
    二、ClickableSpan 文本可點擊,有點擊事件
    三、ForegroundColorSpan 文本顏色(前景色)
    四、MaskFilterSpan 修飾效果,如模糊(BlurMaskFilter)、浮雕(EmbossMaskFilter)
    五、MetricAffectingSpan 父類,通常不用
    六、RasterizerSpan 光柵效果
    七、StrikethroughSpan 刪除線(中劃線)
    八、SuggestionSpan 至關於佔位符
    九、UnderlineSpan 下劃線
    十、AbsoluteSizeSpan 絕對大小(文本字體)
    十一、DynamicDrawableSpan 設置圖片,基於文本基線或底部對齊。
    十二、ImageSpan 圖片
    1三、RelativeSizeSpan 相對大小(文本字體)
    1四、ReplacementSpan 父類,通常不用
    1五、ScaleXSpan 基於x軸縮放
    1六、StyleSpan 字體樣式:粗體、斜體等
    1七、SubscriptSpan 下標(數學公式會用到)
    1八、SuperscriptSpan 上標(數學公式會用到)
    1九、TextAppearanceSpan 文本外貌(包括字體、大小、樣式和顏色)
    20、TypefaceSpan 文本字體
    2一、URLSpan 文本超連接
複製代碼

例如剛開始,咱們用到的:設置文本的顏色對象

SpannableString ss = new SpannableString(msg); 
ss.setSpan(new ForegroundColorSpan(Color.RED), name.length(), msg.length() - 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
複製代碼

上面的功能至關的多,不一一介紹,用的時候再看,由於用法都差很少。


效果圖代碼實現

如今放上剛開始的時候,實現的那張圖代碼。由於代碼也至關簡單,因此直接貼上。

public class MainActivity extends AppCompatActivity {

    private TextView mTxt;

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

		mTxt = (TextView) findViewById(R.id.txt);
		initView();
    }

    private void initView() {
		String name = "小可愛:";//模擬名稱
		String msg = name + "今天心情不錯,買張彩票。";//模擬說說

		SpannableString ss = new SpannableString(msg);
		//名稱的點擊事件
		ss.setSpan(clickableSpan, 0, name.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
		//說說的字體樣式
		ss.setSpan(new ForegroundColorSpan(Color.RED), name.length(), msg.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

		mTxt.setText(ss);
		mTxt.setMovementMethod(LinkMovementMethod.getInstance());//設置超連接爲可點擊狀態
    }

    /**
     * 名稱的點擊事件
     */
    private ClickableSpan clickableSpan = new ClickableSpan() {
		@Override
		public void updateDrawState(TextPaint ds) {
		    super.updateDrawState(ds);
		    ds.setUnderlineText(false); //去掉下劃線
		    ds.setColor(Color.BLUE);//設置點擊前的顏色
		}

		@Override
		public void onClick(View widget) {
		    toast(((TextView) widget).getText());
		}
    };

    private void toast(CharSequence str) {
		//若是這裏加了 String.valueOf(str),彈出的提示,就會沒有樣式
		Toast toast = Toast.makeText(MyApplication.getContext(), str, Toast.LENGTH_SHORT);
		toast.setGravity(Gravity.TOP, 0, 200);//改變Toast彈出的位置
		toast.show();
    }
}
複製代碼

在最後順便用到了修改Toast提示的位置。 座標能夠根據屏幕的分辨率的尺寸的百分比來進行計算,會更合理。

好了,本次分享就到這裏。 項目地址: github.com/Wing-Li/Pra…

歡迎指正。

相關文章
相關標籤/搜索