一、fromHtml
直接显示带有颜色标签的 html 字符串
textview.setText(Html.fromHtml(str)); //str为含有html标签的字符串
二、Spannable
使用 Spannable 属性对字符串进行处理,在现实出来。
1、Spannable 相关属性
SpannableString msp = new SpannableString("测试文字:等宽字体衬线字体像素独立像素一半两倍前景色背景色正常粗体斜体粗斜体下划线删除线O2X2电话邮件网络短信彩信地图拉伸");
// 设置字体(default,default-bold,monospace,serif,sans-serif)
msp.setSpan(new TypefaceSpan("monospace"), 5, 9, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 等宽字体
msp.setSpan(new TypefaceSpan("serif"), 9, 13, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 衬线字体
// 设置字体绝对大小(绝对值,单位:像素)
msp.setSpan(new AbsoluteSizeSpan(20), 13, 15, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// 第二个参数为true,表示前面单位为dip,否则为像素。
msp.setSpan(new AbsoluteSizeSpan(20, true), 15, 19, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// 设置字体相对大小(相对值,单位:像素) 参数表示为默认字体大小的多少倍
msp.setSpan(new RelativeSizeSpan(0.5f), 19, 21, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
msp.setSpan(new RelativeSizeSpan(2.0f), 21, 23, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// 设置字体前景色 ,Color.MAGENTA为紫红
msp.setSpan(new ForegroundColorSpan(Color.MAGENTA), 23, 26, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// 设置字体背景色 ,Color.CYAN为青绿色
msp.setSpan(new BackgroundColorSpan(Color.CYAN), 26, 29, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// 设置字体样式正常,粗体,斜体,粗斜体
msp.setSpan(new StyleSpan(android.graphics.Typeface.NORMAL), 29, 31, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 正常
msp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 31, 33, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 粗体
msp.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 33, 35, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 斜体
msp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD_ITALIC), 35, 38, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 粗斜体
// 设置下划线
msp.setSpan(new UnderlineSpan(), 38, 41, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// 设置删除线
msp.setSpan(new StrikethroughSpan(), 41, 44, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// 设置上下标(用于化学元素和方程式)
msp.setSpan(new SubscriptSpan(), 45, 46, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 下标
msp.setSpan(new SuperscriptSpan(), 47, 48, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 上标
//结合相对大小
msp.setSpan(new RelativeSizeSpan(0.5f), 45, 46, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
msp.setSpan(new RelativeSizeSpan(0.5f), 47, 48, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
// 超级链接(需要添加setMovementMethod方法附加响应)
msp.setSpan(new URLSpan("tel:4155551212"), 48, 50, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 电话
msp.setSpan(new URLSpan("mailto:webmaster@google.com"), 50, 52, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 邮件
msp.setSpan(new URLSpan("http://www.baidu.com"), 52, 54, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 网络
msp.setSpan(new URLSpan("sms:4155551212"), 54, 56, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 短信,使用sms:或者smsto:
msp.setSpan(new URLSpan("mms:4155551212"), 56, 58, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 彩信,使用mms:或者mmsto:
msp.setSpan(new URLSpan("geo:38.899533,-77.036476"), 58, 60, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 地图
// 设置字体大小(相对值,单位:像素) 参数表示为默认字体宽度的多少倍
msp.setSpan(new ScaleXSpan(2.0f), 60, 62, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tvText.setMovementMethod(LinkMovementMethod.getInstance());
tvText.setText(msp);
2、实现多颜色、多大小、多点击的功能
import java.util.ArrayList;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity implements ClickListener {
private TextView textView1;
private ArrayList<String> str_list;
private ArrayList<Integer> color_list;
private ArrayList<Float> text_size_list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
setData();
}
private void initView() {
textView1 = (TextView) findViewById(R.id.textView1);
}
private void setData() {
str_list = new ArrayList<String>();
color_list = new ArrayList<Integer>();
text_size_list = new ArrayList<Float>();
str_list.add("今天");
str_list.add("天气");
str_list.add("还不错!");
color_list.add(Color.RED);
color_list.add(Color.GREEN);
color_list.add(Color.BLUE);
text_size_list.add(15f);
text_size_list.add(17f);
text_size_list.add(20f);
Util.setText(this, textView1, str_list, color_list, text_size_list,
this);
}
@Override
public void click(int position) {
Log.e("position", position + "");
Toast.makeText(this, str_list.get(position), Toast.LENGTH_SHORT).show();
}
}
public interface ClickListener {
public void click(int position);
}
import java.util.ArrayList;
import android.content.Context;
import android.graphics.Color;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.Spanned;
import android.text.TextPaint;
import android.text.method.LinkMovementMethod;
import android.text.style.AbsoluteSizeSpan;
import android.text.style.ClickableSpan;
import android.text.style.ForegroundColorSpan;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.TextView;
public class Util {
public static void setText(Context context, TextView tv,
ArrayList<String> str, ArrayList<Integer> color,
ArrayList<Float> text_size_list, ClickListener clickListener) {
// 累加数组所有的字符串为一个字符串
StringBuffer long_str = new StringBuffer();
for (int i = 0; i < str.size(); i++) {
long_str.append(str.get(i));
}
SpannableString builder = new SpannableString(long_str.toString());
// 设置不同字符串的点击事件
for (int i = 0; i < str.size(); i++) {
int p = i;
int star = long_str.toString().indexOf(str.get(i));
int end = star + str.get(i).length();
builder.setSpan(new Clickable(clickListener, p), star, end,
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
// 设置不同字符串的颜色
ArrayList<ForegroundColorSpan> foregroundColorSpans = new ArrayList<ForegroundColorSpan>();
for (int i = 0; i < color.size(); i++) {
foregroundColorSpans.add(new ForegroundColorSpan(color.get(i)));
}
for (int i = 0; i < str.size(); i++) {
int star = long_str.toString().indexOf(str.get(i));
int end = star + str.get(i).length();
builder.setSpan(foregroundColorSpans.get(i), star, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
// 设置不同字符串的字号
ArrayList<AbsoluteSizeSpan> absoluteSizeSpans = new ArrayList<AbsoluteSizeSpan>();
for (int i = 0; i < color.size(); i++) {
absoluteSizeSpans.add(new AbsoluteSizeSpan(sp2px(context,
text_size_list.get(i))));
}
for (int i = 0; i < str.size(); i++) {
int star = long_str.toString().indexOf(str.get(i));
int end = star + str.get(i).length();
builder.setSpan(absoluteSizeSpans.get(i), star, end,
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
// 设置点击后的颜色为透明,否则会一直出现高亮
tv.setHighlightColor(Color.TRANSPARENT);
tv.setClickable(true);
tv.setMovementMethod(LinkMovementMethod.getInstance());
tv.setText(builder);
}
public static int sp2px(Context context, float spValue) {
final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
return (int) (spValue * fontScale + 0.5f);
}
}
class Clickable extends ClickableSpan implements OnClickListener {
private final ClickListener clickListener;
private int position;
public Clickable(ClickListener clickListener, int position) {
this.clickListener = clickListener;
this.position = position;
}
@Override
public void onClick(View v) {
clickListener.click(position);
}
@Override
public void updateDrawState(TextPaint ds) {
// TODO Auto-generated method stub
super.updateDrawState(ds);
ds.setColor(Color.WHITE); // 设置文件颜色
ds.setUnderlineText(false);
}
}