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