Android SpannaleString详解

package com.gyz;

import android.app.Activity;
import android.os.Bundle;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.TextPaint;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.text.style.URLSpan;
import android.view.View;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.TextView;

import com.gyz.myspannabletest.R;

/**
 * SpannaleString是对文字进行复合文本设置
 * 
 * Spanned.SPAN_EXCLUSIVE_EXCLUSIVE,这是在 setSpan 时需要指定的
 * flag,它是用来标识在 Span
 * 范围内的文本前后输入新的字符时是否把它们也应用这个效果。分别有
 * Spanned.SPAN_EXCLUSIVE_EXCLUSIVE(前后都不包括)、Spanned
 * .SPAN_INCLUSIVE_EXCLUSIVE(前面包括
 * ,后面不包括)、Spanned.SPAN_EXCLUSIVE_INCLUSIVE(前面不包括,后面包括
 * )、Spanned.SPAN_INCLUSIVE_INCLUSIVE(前后都包括)
 * 
 * @author gyz
 * 
 */
public class SpannableStringTest extends Activity {
	private WebView wb_show;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		TextView tv_show = (TextView) findViewById(R.id.tv_show);
		wb_show = (WebView) findViewById(R.id.wb_show);
		wb_show.setWebViewClient(new webViewClient());// 处理webview
		/*
		 * 使用SpannableString设置TextView文本的前景、背景色
		 */
		// SpannableString spanText = new
		// SpannableString("This is GYZ!!!LOL!!");
		// spanText.setSpan(new BackgroundColorSpan(Color.GREEN), 0,
		// spanText.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);//设置背景色
		// spanText.setSpan(new ForegroundColorSpan(Color.BLUE), 6,
		// spanText.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);//设置前景色
		// tv_show.append("\n");
		// tv_show.append(spanText);
		/*
		 * 无下划线链接
		 */
		// SpannableString spStr = new SpannableString("This is GYZ!!!LOL!!");
		// NoLineClickSpan clickSpan = new
		// NoLineClickSpan("http://www.baidu.com"); // 设置超链接
		// spStr.setSpan(clickSpan, 0, spStr.length(),
		// Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
		// tv_show.append(spStr);
		// tv_show.setMovementMethod(LinkMovementMethod.getInstance());//
		// 设置超链接为可点击状态,可触发事件
		/**
		 * 浮雕、模糊效果
		 */
		// SpannableString spanText = new
		// SpannableString("MaskFilterSpan,gyzboy,LOL");
		// int length = spanText.length();
		// //模糊(BlurMaskFilter)
		// MaskFilterSpan maskFilterSpan = new MaskFilterSpan(new
		// BlurMaskFilter(3, Blur.OUTER));
		// spanText.setSpan(maskFilterSpan, 0, length/2, Spannable.
		// SPAN_INCLUSIVE_EXCLUSIVE);
		// //浮雕(EmbossMaskFilter)
		// maskFilterSpan = new MaskFilterSpan(new EmbossMaskFilter(new
		// float[]{1,1,3}, 1.5f, 18, 13));
		// spanText.setSpan(maskFilterSpan, length/2, length,
		// Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
		// tv_show.append("\n");
		// tv_show.append(spanText);
		/**
		 * 光栅效果
		 */
		// SpannableString spanText = new SpannableString("StrikethroughSpan");
		// spanText.setSpan(new StrikethroughSpan(), 0, 7, Spannable.
		// SPAN_INCLUSIVE_EXCLUSIVE);
		// tv_show.append("\n");
		// tv_show.append(spanText);
		/**
		 * 中划线、下划线
		 */
		// SpannableString spanText = new SpannableString("StrikethroughSpan");
		// spanText.setSpan(new StrikethroughSpan(), 0, spanText.length(),
		// Spannable.SPAN_INCLUSIVE_EXCLUSIVE);//中划线
		// spanText.setSpan(new UnderlineSpan(), 0, spanText.length(),
		// Spannable.SPAN_INCLUSIVE_EXCLUSIVE);//下划线
		// tv_show.append("\n");
		// tv_show.append(spanText);

		/**
		 * DynamicDrawableSpan 设置图片,基于文本基线或底部对齐
		 */
		// DynamicDrawableSpan drawableSpan = new DynamicDrawableSpan(
		// DynamicDrawableSpan.ALIGN_BASELINE) {
		// @Override
		// public Drawable getDrawable() {
		// Drawable d = getResources().getDrawable(R.drawable.ic_launcher);
		// d.setBounds(0, 0, 50, 50);
		// return d;
		// }
		// };
		// DynamicDrawableSpan drawableSpan2 = new DynamicDrawableSpan(
		// DynamicDrawableSpan.ALIGN_BOTTOM) {
		// @Override
		// public Drawable getDrawable() {
		// Drawable d = getResources().getDrawable(R.drawable.ic_launcher);
		// d.setBounds(0, 0, 50, 50);
		// return d;
		// }
		// };
		// SpannableString spanText = new
		// SpannableString("DynamicDrawableSpan ");
		// spanText.setSpan(drawableSpan, 3, 4,
		// Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
		// spanText.setSpan(drawableSpan2, 7, 8,
		// Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
		// tv_show.append("\n");
		// tv_show.append(spanText);
		/**
		 * ImageSpan 图片,跟DynamicDrawable区别不大
		 */
		// SpannableString spanText = new SpannableString("ImageSpan");
		// Drawable d = getResources().getDrawable(R.drawable.ic_launcher);
		// d.setBounds(0, 0, 50, 50);
		// spanText.setSpan(new ImageSpan(d), 3, 4,
		// Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
		// tv_show.append("\n");
		// tv_show.append(spanText);
		/**
		 * RelativeSizeSpan 相对大小(文本字体),相对大小的比例是基于当前文本字体大小
		 */
		// SpannableString spanText = new SpannableString("RelativeSizeSpan");
		// //参数proportion:比例大小
		// spanText.setSpan(new RelativeSizeSpan(2.5f), 3, 4,
		// Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
		// tv_show.append("\n");
		// tv_show.append(spanText);

		/**
		 * ScaleXSpan 基于x轴缩放
		 */
		// SpannableString spanText = new SpannableString("ScaleXSpan");
		// //参数proportion:比例大小
		// spanText.setSpan(new ScaleXSpan(3.8f), 3, 7,
		// Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
		// tv_show.append("\n");
		// tv_show.append(spanText);
		/**
		 * StyleSpan 字体样式:粗体、斜体等
		 */
		// SpannableString spanText = new SpannableString("StyleSpan");
		// //Typeface.BOLD_ITALIC:粗体+斜体
		// spanText.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), 3, 7,
		// Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
		// tv_show.append("\n");
		// tv_show.append(spanText);
		/**
		 * 数学公式上下标
		 */
		// SpannableString spanText = new SpannableString("SubscriptSpan");
		// spanText.setSpan(new SubscriptSpan(), 6, 7,
		// Spannable.SPAN_INCLUSIVE_EXCLUSIVE);//上标
		// spanText.setSpan(new SuperscriptSpan(), 6, 7,
		// Spannable.SPAN_INCLUSIVE_EXCLUSIVE);//下标
		// tv_show.append("\n");
		// tv_show.append(spanText);
		/**
		 * TextAppearanceSpan 文本外貌(包括字体、大小、样式和颜色)
		 */
//		SpannableString spanText = new SpannableString("TextAppearanceSpan");
//		// 若需自定义TextAppearance,可以在系统样式上进行修改
//		spanText.setSpan(new TextAppearanceSpan(this,
//				android.R.style.TextAppearance_Medium), 6, 7,
//				Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
//		tv_show.append("\n");
//		tv_show.append(spanText);
		/**
		 * TypefaceSpan 文本字体
		 */
//		SpannableString spanText = new SpannableString("TypefaceSpan");
//		//若需使用自定义字体,可能要重写类TypefaceSpan
//		spanText.setSpan(new TypefaceSpan("monospace"), 3, 10, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
//		tv_show.append("\n");
//		tv_show.append(spanText);
		/**
		 * URLSpan 文本超链接
		 */
		SpannableString spanText = new SpannableString("URLSpan -- gyz的博客");
		spanText.setSpan(new URLSpan("http://www.cnblogs.com/gyzboy"), 10, spanText.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
		tv_show.append("\n");
		tv_show.append(spanText);
		//让URLSpan可以点击
		tv_show.setMovementMethod(new LinkMovementMethod());

	}

	// 无下划线超链接,使用textColorLink、textColorHighlight分别修改超链接前景色和按下时的颜色
	private class NoLineClickSpan extends ClickableSpan {
		String text;

		public NoLineClickSpan(String text) {
			super();
			this.text = text;
		}

		@Override
		public void updateDrawState(TextPaint ds) {
			ds.setColor(ds.linkColor);
			ds.setUnderlineText(false); // 去掉下划线
		}

		@Override
		public void onClick(View widget) {
			wb_show.loadUrl(text);
		}
	}

	class webViewClient extends WebViewClient {
		// 重写shouldOverrideUrlLoading方法,使点击链接后不使用其他的浏览器打开。
		@Override
		public boolean shouldOverrideUrlLoading(WebView view, String url) {
			view.loadUrl(url);
			// 如果不需要其他对点击链接事件的处理返回true,否则返回false
			return true;
		}
	}
}

  

转载于:https://www.cnblogs.com/gyzboy/p/4626770.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值