一個TextView設置多種格式(類似于“評論”的樣式)

如果本文幫助到你,本人不勝榮幸,如果浪費了你的時間,本人深感抱歉。
希望用最簡單的大白話來幫助那些像我一樣的人。如果有什么錯誤,請一定指出,以免誤導大家、也誤導我。
本文來自:http://www.itdecent.cn/users/320f9e8f7fc9/latest_articles
感謝您的關注。

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

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

主角介紹 - SpannableString

主要用的到就是 SpannableString 這個類,其實還有個SpannableStringBuilder,他們兩個作用跟String其實是很像的。不同之處就是他們倆可以給字符串設置各種樣式。
SpannableString 和 SpannableStringBuilder 的區(qū)別也就是字面意思,多了一個Builder。類似于 String 和 StringBuilder。SpannableStringBuilder 是可以通過append()方法進行拼接。而SpannableString 通過構造器創(chuàng)建了之后就固定。

使用方法

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 實現(xiàn)了CharSequence的接口,所以這一步之后,我們定義的 ss,就可以作為字符串設置給TextView了。
顯示效果是:除了“小可愛:",后面的都是紅色字。
當然,我們是可以同時給一個字符串設置多個樣式的。

很明顯我們可以看到通過setSpan()這個方法,我們就將指定的字符更換了樣式。
我們具體來看看 setSpan(); 到底有多么的神通廣大。

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

起始結束位置就不用說了,就是符合行業(yè)的標準模式,含頭不含尾。
這里需要介紹是第一個和第四個參數(shù)。
我們先來看第四個:
int flags可設置為:

Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前后都不包括,即在指定范圍的前面和后面插入新字符都不會應用新樣式
Spannable.SPAN_EXCLUSIVE_INCLUSIVE:前面不包括,后面包括。即僅在范圍字符的后面插入新字符時會應用新樣式
Spannable.SPAN_INCLUSIVE_EXCLUSIVE:前面包括,后面不包括。
Spannable.SPAN_INCLUSIVE_INCLUSIVE:前后都包括。

這里系統(tǒng)給定了四個參數(shù),含義已經注明。
需要說明的是,SpannableString 和 SpannableStringBuilder 的區(qū)別 在開頭提到了,不知道大家還記得嗎?
只有 SpannableStringBuilder 是可以通過append()方法,往后面拼接字符串的,而這幾個標示都是當字符串改變之后的效果,所以后面三個樣式的效果,可能只有使用了SpannableStringBuilder 添加文字的時候才看得到效果。
使用SpannableString ,添加了其他的flags也是沒有什么用的,因為,只要一替換文字,整個對象全換了。
所以這個參數(shù),我們看著用 就好。

Object what 這個參數(shù),那可是相當強大。先看功能

    1、BackgroundColorSpan 背景色
    2、ClickableSpan 文本可點擊,有點擊事件
    3、ForegroundColorSpan 文本顏色(前景色)
    4、MaskFilterSpan 修飾效果,如模糊(BlurMaskFilter)、浮雕(EmbossMaskFilter)
    5、MetricAffectingSpan 父類,一般不用
    6、RasterizerSpan 光柵效果
    7、StrikethroughSpan 刪除線(中劃線)
    8、SuggestionSpan 相當于占位符
    9、UnderlineSpan 下劃線
    10、AbsoluteSizeSpan 絕對大?。ㄎ谋咀煮w)
    11、DynamicDrawableSpan 設置圖片,基于文本基線或底部對齊。
    12、ImageSpan 圖片
    13、RelativeSizeSpan 相對大?。ㄎ谋咀煮w)
    14、ReplacementSpan 父類,一般不用
    15、ScaleXSpan 基于x軸縮放
    16、StyleSpan 字體樣式:粗體、斜體等
    17、SubscriptSpan 下標(數(shù)學公式會用到)
    18、SuperscriptSpan 上標(數(shù)學公式會用到)
    19、TextAppearanceSpan 文本外貌(包括字體、大小、樣式和顏色)
    20、TypefaceSpan 文本字體
    21、URLSpan 文本超鏈接

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

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

上面的功能相當?shù)亩?,不一一介紹,用的時候再看,因為用法都差不多。


效果圖代碼實現(xiàn)

現(xiàn)在放上剛開始的時候,實現(xiàn)的那張圖代碼。因為代碼也相當簡單,所以直接貼上。

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());//設置超鏈接為可點擊狀態(tài)
    }

    /**
     * 名稱的點擊事件
     */
    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提示的位置。
坐標可以根據(jù)屏幕的分辨率的尺寸的百分比來進行計算,會更合理。

好了,本次分享就到這里。
項目地址:
https://github.com/Wing-Li/PracticeDemos/tree/master/Hack10_CustomizeText

歡迎指正。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容