如果本文幫助到你,本人不勝榮幸椎瘟,如果浪費(fèi)了你的時(shí)間覆致,本人深感抱歉。
希望用最簡單的大白話來幫助那些像我一樣的人肺蔚。如果有什么錯(cuò)誤煌妈,請(qǐng)一定指出,以免誤導(dǎo)大家宣羊、也誤導(dǎo)我璧诵。
本文來自:http://www.reibang.com/users/320f9e8f7fc9/latest_articles
感謝您的關(guān)注。
先看一張效果圖段只。
主要功能:
1.只有一個(gè) TextView腮猖,但是顯示多個(gè)樣式,并且赞枕,前幾個(gè)字是可以點(diǎn)擊澈缺。
2.修改 Toast 的彈出位置坪创。
這類效果,使用場(chǎng)景最多的姐赡,應(yīng)該就是評(píng)論了吧莱预。
主角介紹 - SpannableString
主要用的到就是 SpannableString 這個(gè)類,其實(shí)還有個(gè)SpannableStringBuilder项滑,他們兩個(gè)作用跟String其實(shí)是很像的依沮。不同之處就是他們倆可以給字符串設(shè)置各種樣式。
SpannableString 和 SpannableStringBuilder 的區(qū)別也就是字面意思枪狂,多了一個(gè)Builder危喉。類似于 String 和 StringBuilder。SpannableStringBuilder 是可以通過append()方法進(jìn)行拼接州疾。而SpannableString 通過構(gòu)造器創(chuàng)建了之后就固定辜限。
使用方法
String name = "小可愛:";
String msg = name + "小今天心情不錯(cuò),買張彩票严蓖。";
SpannableString ss = new SpannableString(msg);
ss.setSpan(new ForegroundColorSpan(Color.RED), name.length(), msg.length() - 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
mTxt.setText(ss);
因?yàn)镾pannableString 實(shí)現(xiàn)了CharSequence的接口薄嫡,所以這一步之后,我們定義的 ss颗胡,就可以作為字符串設(shè)置給TextView了毫深。
顯示效果是:除了“小可愛:",后面的都是紅色字毒姨。
當(dāng)然哑蔫,我們是可以同時(shí)給一個(gè)字符串設(shè)置多個(gè)樣式的。
很明顯我們可以看到通過setSpan()這個(gè)方法手素,我們就將指定的字符更換了樣式鸳址。
我們具體來看看 setSpan(); 到底有多么的神通廣大。
/**
* 設(shè)置字符串的樣式
* @param what 對(duì)應(yīng)的樣式的類(往下看)
* @param start 樣式開始的位置
* @param end 樣式結(jié)束的位置
* @param flags 包含的范圍(往下看)
*/
public void setSpan (Object what, int start, int end, int flags)
起始結(jié)束位置就不用說了泉懦,就是符合行業(yè)的標(biāo)準(zhǔn)模式稿黍,含頭不含尾。
這里需要介紹是第一個(gè)和第四個(gè)參數(shù)崩哩。
我們先來看第四個(gè):
int flags可設(shè)置為:
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE:前后都不包括巡球,即在指定范圍的前面和后面插入新字符都不會(huì)應(yīng)用新樣式
Spannable.SPAN_EXCLUSIVE_INCLUSIVE:前面不包括,后面包括邓嘹。即僅在范圍字符的后面插入新字符時(shí)會(huì)應(yīng)用新樣式
Spannable.SPAN_INCLUSIVE_EXCLUSIVE:前面包括酣栈,后面不包括。
Spannable.SPAN_INCLUSIVE_INCLUSIVE:前后都包括汹押。
這里系統(tǒng)給定了四個(gè)參數(shù)矿筝,含義已經(jīng)注明。
需要說明的是棚贾,SpannableString 和 SpannableStringBuilder 的區(qū)別 在開頭提到了窖维,不知道大家還記得嗎榆综?
只有 SpannableStringBuilder 是可以通過append()方法,往后面拼接字符串的铸史,而這幾個(gè)標(biāo)示都是當(dāng)字符串改變之后的效果鼻疮,所以后面三個(gè)樣式的效果,可能只有使用了SpannableStringBuilder 添加文字的時(shí)候才看得到效果琳轿。
使用SpannableString 判沟,添加了其他的flags也是沒有什么用的,因?yàn)檎复郏灰惶鎿Q文字挪哄,整個(gè)對(duì)象全換了。
所以這個(gè)參數(shù)琉闪,我們看著用 就好中燥。
Object what 這個(gè)參數(shù),那可是相當(dāng)強(qiáng)大塘偎。先看功能
1、BackgroundColorSpan 背景色
2拿霉、ClickableSpan 文本可點(diǎn)擊吟秩,有點(diǎn)擊事件
3、ForegroundColorSpan 文本顏色(前景色)
4绽淘、MaskFilterSpan 修飾效果涵防,如模糊(BlurMaskFilter)、浮雕(EmbossMaskFilter)
5沪铭、MetricAffectingSpan 父類壮池,一般不用
6、RasterizerSpan 光柵效果
7杀怠、StrikethroughSpan 刪除線(中劃線)
8椰憋、SuggestionSpan 相當(dāng)于占位符
9、UnderlineSpan 下劃線
10赔退、AbsoluteSizeSpan 絕對(duì)大谐纫馈(文本字體)
11、DynamicDrawableSpan 設(shè)置圖片硕旗,基于文本基線或底部對(duì)齊窗骑。
12、ImageSpan 圖片
13漆枚、RelativeSizeSpan 相對(duì)大写匆搿(文本字體)
14、ReplacementSpan 父類墙基,一般不用
15软族、ScaleXSpan 基于x軸縮放
16刷喜、StyleSpan 字體樣式:粗體、斜體等
17互订、SubscriptSpan 下標(biāo)(數(shù)學(xué)公式會(huì)用到)
18吱肌、SuperscriptSpan 上標(biāo)(數(shù)學(xué)公式會(huì)用到)
19、TextAppearanceSpan 文本外貌(包括字體仰禽、大小氮墨、樣式和顏色)
20、TypefaceSpan 文本字體
21吐葵、URLSpan 文本超鏈接
例如剛開始规揪,我們用到的:設(shè)置文本的顏色
SpannableString ss = new SpannableString(msg);
ss.setSpan(new ForegroundColorSpan(Color.RED), name.length(), msg.length() - 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
上面的功能相當(dāng)?shù)亩啵灰灰唤榻B温峭,用的時(shí)候再看猛铅,因?yàn)橛梅ǘ疾畈欢唷?/p>
效果圖代碼實(shí)現(xiàn)
現(xiàn)在放上剛開始的時(shí)候,實(shí)現(xiàn)的那張圖代碼凤藏。因?yàn)榇a也相當(dāng)簡單奸忽,所以直接貼上。
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 + "今天心情不錯(cuò)揖庄,買張彩票栗菜。";//模擬說說
SpannableString ss = new SpannableString(msg);
//名稱的點(diǎn)擊事件
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());//設(shè)置超鏈接為可點(diǎn)擊狀態(tài)
}
/**
* 名稱的點(diǎn)擊事件
*/
private ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(false); //去掉下劃線
ds.setColor(Color.BLUE);//設(shè)置點(diǎn)擊前的顏色
}
@Override
public void onClick(View widget) {
toast(((TextView) widget).getText());
}
};
private void toast(CharSequence str) {
//如果這里加了 String.valueOf(str),彈出的提示蹄梢,就會(huì)沒有樣式
Toast toast = Toast.makeText(MyApplication.getContext(), str, Toast.LENGTH_SHORT);
toast.setGravity(Gravity.TOP, 0, 200);//改變Toast彈出的位置
toast.show();
}
}
在最后順便用到了修改Toast提示的位置疙筹。
坐標(biāo)可以根據(jù)屏幕的分辨率的尺寸的百分比來進(jìn)行計(jì)算,會(huì)更合理禁炒。
好了而咆,本次分享就到這里。
項(xiàng)目地址:
https://github.com/Wing-Li/PracticeDemos/tree/master/Hack10_CustomizeText
歡迎指正幕袱。