Android多颜色TextView功能实现

一、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);
	}
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

c小旭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值