SpanableString 一些常用方法的使用記錄

最近登錄頁要給個什麼隱私政策的提示,藍白下滑線混合在一起,因爲不想寫幾個TextView(主要是單個TextView會換行不好看),所以用了SpannableString,順便就跑來這裏記錄一下一些比較常用的實現

後續操作都是在這個基本代碼的基礎上寫的

TextView tvMessage = (TextView) findViewById(R.id.tvMessage);
SpannableString rawStr = new SpannableString("建議QQ刪除好友時給對方通知");
//一些對rawStr的設置以後
tvMessage.setText(rawStr);

 

 

設置字體顏色

rawStr.setSpan(new ForegroundColorSpan(ContextCompat.getColor(this, R.color.red)), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

效果圖

 

 

設置背景顏色

rawStr.setSpan(new BackgroundColorSpan(ContextCompat.getColor(this, R.color.red)), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

效果圖

 

 

設置字體,官方註釋是這幾個"monospace", "serif", "sans-serif" 但我試了都沒有效果,不知道是哪裏的問題

rawStr.setSpan(new TypefaceSpan("sans-serif"), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

效果圖

沒有,壓根沒變化

 

 

設置字體大小,絕對值,其中第二個參數 true爲dp值,false爲像素值,如果不傳,則默認像素值

rawStr.setSpan(new AbsoluteSizeSpan(20, false), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

效果圖

 

 

設置字體大小,相對值,2f表示默認字體大小的兩倍,一般我們默認的都是14sp

rawStr.setSpan(new RelativeSizeSpan(2f), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

效果圖

 

 

設置字體大小,相對值,縮放X值,2f表示默認字體大小寬度的兩倍,一般變寬了字體也會變大,但沒有RelativeSizeSpan這麼有規律

rawStr.setSpan(new ScaleXSpan(2f), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

效果圖

 

 

設置字體樣式 正常

rawStr.setSpan(new StyleSpan(Typeface.NORMAL), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

效果圖

沒有

 

 

設置字體樣式 粗體

rawStr.setSpan(new StyleSpan(Typeface.BOLD), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

效果圖

 

 

設置字體樣式 斜體

rawStr.setSpan(new StyleSpan(Typeface.ITALIC), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

效果圖

 

 

設置字體樣式 粗斜體

rawStr.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

效果圖

 

 

設置字體樣式,真正意義上的樣式。。。
後面兩個null是顏色變化和link顏色的,快速看了一下源碼沒看懂,後面有時間再補,主要是我一直都傳的null。。。

rawStr.setSpan(new TextAppearanceSpan("monospace", Typeface.BOLD, 40, null, null), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

效果圖

 

 

設置下劃線

rawStr.setSpan(new UnderlineSpan(), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

效果圖

 

 

設置刪除線

rawStr.setSpan(new StrikethroughSpan(), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

效果圖

 

 

設置上角標,就是把字體往上平移,如果要用,記得用設置字體大小縮小一半以上

rawStr.setSpan(new SuperscriptSpan(), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

效果圖

 

 

設置下角標,就是把字體往下平移,如果要用,記得用設置字體大小縮小一半以上

rawStr.setSpan(new SubscriptSpan(), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

效果圖

 

 

設置超鏈,電話號碼,要配合TextView的setMovementMethod一起使用纔會響應點擊事件,出來的效果就是點擊後跳轉到撥號界面,號碼爲tel:後面部分, 如果想修改字體樣式,建議使用clickableSpan

rawStr.setSpan(new URLSpan("tel:10086"), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tvMessage.setMovementMethod(LinkMovementMethod.getInstance());

效果圖

 

 

設置超鏈,郵件,要配合TextView的setMovementMethod一起使用纔會響應點擊事件,出來的效果就是點擊後跳轉到發郵件界面,收件人爲mailto:後面部分, 如果想修改字體樣式,建議使用clickableSpan

rawStr.setSpan(new URLSpan("mailto:[email protected]"), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tvMessage.setMovementMethod(LinkMovementMethod.getInstance());

效果圖

 

 

設置超鏈,網頁,要配合TextView的setMovementMethod一起使用纔會響應點擊事件,出來的效果是點擊後彈出讓選擇瀏覽器,打開瀏覽器就是指定的網址,一定要加上http://或者https://,如果想修改字體樣式,建議使用clickableSpan

rawStr.setSpan(new URLSpan("http://www.baidu.com"), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tvMessage.setMovementMethod(LinkMovementMethod.getInstance());

效果圖

 

 

設置超鏈,短信,要配合TextView的setMovementMethod一起使用纔會響應點擊事件,出來效果是點擊後跳轉到編輯短信界面,收件人是sms:後面的號碼,如果想修改字體樣式,建議使用clickableSpan

rawStr.setSpan(new URLSpan("sms:10086"), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tvMessage.setMovementMethod(LinkMovementMethod.getInstance());

效果圖

 

 

設置超鏈,彩信,要配合TextView的setMovementMethod一起使用纔會響應點擊事件,出來的效果是點擊後一般還是跳轉到短信編輯界面,因爲現在基本是短信彩信一起了,收件人是mms:後面的號碼,如果想修改字體樣式,建議使用clickableSpan

rawStr.setSpan(new URLSpan("mms:10086"), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tvMessage.setMovementMethod(LinkMovementMethod.getInstance());

效果圖

 

 

設置超鏈,地圖,要配合TextView的setMovementMethod一起使用纔會響應點擊事件,出來的效果是點擊後跳轉到默認地圖軟件,注意傳的是標準GPS座標,不過軟件一般會自動轉成對應地圖的經緯度,無需額外處理,如果想修改字體樣式,建議使用clickableSpan

rawStr.setSpan(new URLSpan("geo:22.53125695006,114.0736434700"), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tvMessage.setMovementMethod(LinkMovementMethod.getInstance());

效果圖

 

 

設置圖片

Drawable drawable = ContextCompat.getDrawable(this, R.drawable.ic_launcher_foreground);
int drawHeight = drawable.getMinimumHeight();//獲取圖片建議的最小高度
int drawWidth = drawable.getMinimumWidth();//獲取圖片建議的最小寬度
drawable.setBounds(0, 0, drawWidth, drawHeight);//限制在這個範圍裏,主要爲了好看一點點
rawStr.setSpan(new ImageSpan(drawable), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

效果圖

 

 

設置部分字體點擊事件,前面說到建議用這個的,就是直接寫點擊事件,然後事件實現我們自己寫,這個的好處就是可以改樣式,還是要配置setMovementMethod使用

rawStr.setSpan(new ClickableSpan() {
    @Override
    public void onClick(@NonNull View widget) {
        //要實現的點擊事件
    }

    @Override
    public void updateDrawState(@NonNull TextPaint ds){
        //在這裏改變樣式
        ds.setUnderlineText(false);//設置不要下劃線,默認有
        ds.setColor(ContextCompat.getColor(SpannableStringLearningView.this,             R.color.blue));//設置藍色
    }
}, 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tvMessage.setMovementMethod(LinkMovementMethod.getInstance());

效果圖

 

 

如果想點擊後不顯示背景的高光,可以設置背景高光爲透明

tvMessage.setHighlightColor(ContextCompat.getColor(this, R.color.transparent));

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章