廢話不多說屯掖,上圖看栗子
主要是用到SpannableStringBuilder這個類,可以對文字進(jìn)行簡單配置:
- 自定義文本中文字的字體大薪笏ァ(包括絕對大小和相對大刑)
- BackgroundColorSpan : 文本背景色
- ForegroundColorSpan : 文本顏色
- StrikethroughSpan : 刪除線
- UnderlineSpan : 下劃線
- SubscriptSpan : 下標(biāo) ;SuperscriptSpan : 上標(biāo)
- ClickableSpan : 點(diǎn)擊事件
- 以上是一些常用的效果瀑晒,并不是全部绍坝。
代碼示例:
/* 設(shè)置TextView中間字體顏色與點(diǎn)擊事見
* start 開始文字的位置 坐標(biāo)從 0開始
* end 改變結(jié)束的位置 ,并不包括這個位置苔悦。
* 使用BackgroundColorSpan設(shè)置背景顏色轩褐。
*/
private void setTextInfo(TextView tv) {
String content = tv.getText().toString();
final SpannableStringBuilder style = new SpannableStringBuilder();
style.append(content );//添加需要改變的文本
ClickableSpan clickableSpan = new ClickableSpan() {
@Override
public void updateDrawState(@NonNull TextPaint ds) {
super.updateDrawState(ds);
ds.setUnderlineText(false);//取消點(diǎn)擊事見字體的背景顏色
tv.setHighlightColor(getResources().getColor(android.R.color.transparent));
}
//變色字體點(diǎn)擊監(jiān)聽設(shè)置
@Override
public void onClick(@NonNull View widget) {
Toast.makeText(context,"變色字體的點(diǎn)擊事件",Toast.LENGTH_SHORT).show();
}
};
style.setSpan(clickableSpan, 7, 13, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.setText(style);
ForegroundColorSpan foregroundColorSpan = new ForegroundColorSpan(Color.parseColor("#2B509B"));
style.setSpan(foregroundColorSpan, 7, 13, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
tv.setMovementMethod(LinkMovementMethod.getInstance());
tv.setText(style);
}
下面是 TextView通過SpannableStringBuilder設(shè)置兩處內(nèi)容文字點(diǎn)擊事件和兩處字體顏色變色。
TextView tv_content = findViewById(R.id.tv_content);
//《隱私政策》玖详、《使用條款》其中的內(nèi)容需要設(shè)置變色和設(shè)置可點(diǎn)擊事件
String tv_content = "請充分閱讀并理解《隱私政策》與《使用條款》灾挨。";//控件文本內(nèi)容
String content = tv_content .getText().toString();
tv_content.setText(updateTextStyle(content));
//添加這句話邑退,否則點(diǎn)擊不生效
tv_content.setMovementMethod(LinkMovementMethod.getInstance());
==========================================================================
//主要方法
private SpannableStringBuilder updateTextStyle(String content) {
SpannableStringBuilder spannableString = new SpannableStringBuilder();
spannableString.append(content);
//使用ForegroundColorSpan添加點(diǎn)擊事件會出現(xiàn)沖突
UnderlineSpan colorSpan = new UnderlineSpan() {
@Override
public void updateDrawState(TextPaint ds) {
ds.setColor(Color.parseColor("#fe9500"));//設(shè)置顏色
}
};
//使用UnderlineSpan很好的兼容這個問題
UnderlineSpan colorSpan1 = new UnderlineSpan() {
@Override
public void updateDrawState(TextPaint ds) {
ds.setColor(Color.parseColor("#fe9500"));//設(shè)置顏色
// ds.setUnderlineText(false); //去掉下劃線
}
};
int privacyBeginIndex = content.indexOf("《");
int privacyEndIndex = content.indexOf("》") + 1;
int protocolBeginIndex = content.lastIndexOf("《");
int protocolEndIndex = content.lastIndexOf("》") + 1;
ClickableSpan privacyClickableSpan = new ClickableSpan() {
@Override
public void onClick(@NonNull View widget) {
Toast.makeText(MainActivity.this, "123", Toast.LENGTH_LONG).show();
}
};
ClickableSpan protocolClickableSpan = new ClickableSpan() {
@Override
public void onClick(@NonNull View widget) {
Toast.makeText(MainActivity.this, "123", Toast.LENGTH_LONG).show();
}
};
spannableString.setSpan(protocolClickableSpan, protocolBeginIndex, protocolEndIndex, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
spannableString.setSpan(privacyClickableSpan, privacyBeginIndex, privacyEndIndex, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
//字體顏色一定要放在點(diǎn)擊事件后面,不然部分手機(jī)不會修改顏色
spannableString.setSpan(colorSpan, protocolBeginIndex, protocolEndIndex, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
spannableString.setSpan(colorSpan1, privacyBeginIndex, privacyEndIndex, Spannable.SPAN_EXCLUSIVE_INCLUSIVE);
return spannableString;
}
以下兩個地方的字體顏色和點(diǎn)擊事件就OK了劳澄。