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;
		}
	}
}

  

时间: 2024-08-30 00:23:37

Android SpannaleString详解的相关文章

[gitbook] Android框架分析系列之Android Binder详解

请支持作者原创: https://mr-cao.gitbooks.io/android/content/android-binder.html Android Binder详解 Table of Contents 1. binder简介 2. binder的实现 2.1. IBinder类简介 2.2. IInterface类简介 2.3. BpBinder和BBinder简介 2.4. ProcessState和IPCThreadState简介 2.5. ServiceManager简介 2.

android动画详解三 动画API概述

· 属性动画与view动画的不同之处 view动画系统提供了仅动画View 对象的能力,所以如果你想动画非View 对象,你就要自己实现代码. view动画系统实际上还被强制仅能对 View 的少数属性进行动画,比如缩放和旋转,而不能对背景色进行. view动画的另一个坏处是它仅修改View的绘制位置,而不是View的实际位置.例如,如果你动画一个移动穿越屏幕,button的绘制位置是正确的,但实际你可以点击它的位置却没有变,所以你必须去实现你自己的逻辑来处理它. 使用属性动画系统时,这个限制被

android矩阵详解

Matrix,中文里叫矩阵,高等数学里有介绍,在图像处理方面,主要是用于平面的缩放.平移.旋转等操作. 在Android里面,Matrix由9个float值构成,是一个3*3的矩阵.最好记住.如下图: 解释一下,上面的sinX和cosX,表示旋转角度的cos值和sin值,注意,旋转角度是按顺时针方向计算的. translateX和translateY表示x和y的平移量.scale是缩放的比例,1是不变,2是表示缩放1/2,这样子. 在android.graphics.Matrix中有对应旋转的函

Android ProgressBar详解以及自定义

版本:1.0 日期:2014.5.16 版权:© 2014 kince 转载注明出处 这一次主要说一下Android下的进度条,为什么是它呢,因为近期被其各种美轮美奂的设计所倾倒,计划逐渐去实现.另外一个因素也是它也是为数不多的直接继承于View类的控件,从中可以学习到一些自定义控件的知识.下面列举了一些个人觉得还算漂亮的进度条,仅供参考. 是不是很漂亮,其实就像上面图形展示的那样,进度条大体上无非就是这几种形式.这样一来肯定是需要自定义了,所以方向有两个:要么继承于系统的ProgressBar

Android 菜单详解

Android中菜单分为三种,选项菜单(OptionMenu),上下文菜单(ContextMenu),子菜单(SubMenu) 选项菜单 可以通过两种办法增加选项菜单,一是在menu.xml中添加,该种方式参见Android 资源详解(二) 菜单资源,二是在.java中添加 1.覆盖Activity 的 onCreateOptionsMenu(Menu  menu)方法,当我们第一次打开菜单 时该方法被自动调用. 2.调用Menu的 add()方法添加菜单项(Menultem) ,可以调用Men

Android菜单详解(一)——理解android中的Menu

前言 今天看了pro android 3中menu这一章,对Android的整个menu体系有了进一步的了解,故整理下笔记与大家分享. PS:强烈推荐<Pro Android 3>,是我至今为止看到的最好的一本android书,中文版出到<精通Android 2>. 理解Android的菜单 菜单是许多应用程序不可或缺的一部分,Android中更是如此,所有搭载Android系统的手机甚至都要有一个"Menu"键,由此可见菜单在Android程序中的特殊性.An

Android surfaceview详解

周末看<精通Android游戏开发>(Pro Android Games),里面讲到游戏的框架,其中一个重要的概念surfaceview,觉得不是很理解,于是花了一点时间研究了下,写下自己的心得. surface,这个单词的意思是浮在表面的,那么surfaceview就是浮在表面的view了.如果真的这样解释,估计有人要拍砖了.然而,话虽不能这么说,取这个名儿,多少还是有点关系的.surface是一个可见区域. 我们在屏幕上看到的这些view,在屏幕上看到的就是画面,在内存中就是一块内存区.绘

android ViewPager详解

Viewpager 在android界面布局中属于常用类型 ,它可以做导航,页面菜单,进入软件是的欢迎界面 等等.比现在最流行的几款手机软件  ,QQ,微信,微博 等 ,其主界面 都用到了ViewPager,所以学好它,势在必得 ,在这里总结了下, 先用图解 : 这是一个仿微博界面的xml布局 ,他们之间的关系经常搞混淆,怕记不住 ,总结了几句话:ViewPager里面含界面,它的改变控制(title)Imageview的变化,Textview控制页面,并间接控制Title(imageview)

Android LayoutInflater 详解

Android LayoutInflater 详解 简介: 在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById(). 不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化:而findViewById()是找xml布局文件下的具体widget控件(如Button,TextView等等). 使用场景: ①对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflater()来