package com.shangguigu;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.os.Bundle;
import android.text.Html;
import android.text.Spannable;
import android.text.SpannableStringBuilder;
import android.text.Spanned;
import android.text.TextPaint;
import android.text.style.AbsoluteSizeSpan;
import android.text.style.BackgroundColorSpan;
import android.text.style.BulletSpan;
import android.text.style.ClickableSpan;
import android.text.style.ForegroundColorSpan;
import android.text.style.ImageSpan;
import android.text.style.RelativeSizeSpan;
import android.text.style.StrikethroughSpan;
import android.text.style.StyleSpan;
import android.text.style.SubscriptSpan;
import android.text.style.SuperscriptSpan;
import android.text.style.TypefaceSpan;
import android.text.style.URLSpan;
import android.text.style.UnderlineSpan;
import android.view.View;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
private ListView listView;
private SpannableStringBuilder ssb;
List<SpannableStringBuilder> spannablesbList;
private final int line_color = 0xAAAAAAAA;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView text = new TextView(this);
StringBuilder sb = new StringBuilder("我是HTML:");
sb.append("<img src=\"" + R.drawable.icon_pic + "\">");
CustomImageGetter imageGetter = new CustomImageGetter(this, CustomImageGetter.DEFAULT,CustomImageGetter.DEFAULT);
text.setText(Html.fromHtml(sb.toString(),imageGetter, null));
listView = (ListView) findViewById(R.id.lvShowText);
setSpannableSBText();
//ListView添加头
listView.addHeaderView(text);
listView.setAdapter(new ListViewAdapter(MainActivity.this, spannablesbList));
}
private void setSpannableSBText() {
if (spannablesbList == null)
spannablesbList = new ArrayList<SpannableStringBuilder>();
/**
* Mark the specified range of text with the specified object.<br>
* 标记指定的范围使用指定的Object The flags determine how the span will behave when
* text is inserted at the start or end of the span's range.<br>
* flags决定了范围的开闭情况
*/
ssb = new SpannableStringBuilder("为指定的区间[1,4)设置指定的颜色");
ssb.setSpan(new ForegroundColorSpan(Color.GREEN), 1, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);// 基本使用_1:为指定的区间设置指定的颜色
spannablesbList.add(ssb);
ssb = new SpannableStringBuilder("追加字符");
ssb.append("fuck!");// 基本使用_2:追加字符
ssb.setSpan(new ForegroundColorSpan(Color.RED), 4, 8, Spannable.SPAN_MARK_POINT);
spannablesbList.add(ssb);
ssb = new SpannableStringBuilder("设置字体背景色 ");
ssb.setSpan(new BackgroundColorSpan(Color.GRAY), new String("设置字体").length(), new String("设置字体背景色 ").length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 设置背景色为青色
spannablesbList.add(ssb);
ssb = new SpannableStringBuilder("设置字体背景色 Long值方式");
ssb.setSpan(new BackgroundColorSpan(line_color), new String("设置字体").length(), new String("设置字体背景色 ").length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 设置背景色为青色
spannablesbList.add(ssb);
ssb = new SpannableStringBuilder("设置下划线");
// 设置下划线
ssb.setSpan(new UnderlineSpan(), 0, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannablesbList.add(ssb);
ssb = new SpannableStringBuilder("设置删除线");
ssb.setSpan(new StrikethroughSpan(), 0, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannablesbList.add(ssb);
ssb = new SpannableStringBuilder("设置上下标:y=x3+An");
//
ssb.setSpan(new SuperscriptSpan(), new String("设置上下标:y=x").length(), new String("设置上下标:y=x3").length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 下标
ssb.setSpan(new SubscriptSpan(), new String("设置上下标:y=x3+A").length(), new String("设置上下标:y=x3+An").length(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 上标
spannablesbList.add(ssb);
ssb = new SpannableStringBuilder("超级链接:电话 ");
ssb.setSpan(new URLSpan("tel:13912345678"), 5, 7, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 电话
spannablesbList.add(ssb);
ssb = new SpannableStringBuilder("超级链接:邮件 ");
ssb.setSpan(new URLSpan("mailto:webmaster@google.com"),5, 7,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 邮件
ssb.setSpan(new ForegroundColorSpan(Color.YELLOW),5, 7,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannablesbList.add(ssb);
ssb = new SpannableStringBuilder("超级链接:网络 ");
ssb.setSpan(new URLSpan("https://www.baidu.com"), 5, 7, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 网络
ssb.setSpan(new ForegroundColorSpan(Color.LTGRAY),5, 7,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannablesbList.add(ssb);
ssb = new SpannableStringBuilder("超级链接:短信 ");
ssb.setSpan(new URLSpan("sms:13912345678"), 5, 7, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 短信
ssb.setSpan(new ForegroundColorSpan(Color.BLUE),5, 7,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannablesbList.add(ssb);
ssb = new SpannableStringBuilder("超级链接:地图 ");
ssb.setSpan(new URLSpan("geo:38.899533,-77.036476"), 5, 7,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); //
ssb.setSpan(new ForegroundColorSpan(Color.GREEN),5, 7,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannablesbList.add(ssb);
// 注意:设置链接后,指定区间的文本会变成蓝色,会遮住以前设置的颜色,所以应在设置链接后再为指定区间的文字设置颜色
ssb = new SpannableStringBuilder("设置链接:文本 ");
ssb.setSpan(new URLSpan("cacaca") {
@Override
public void onClick(View widget) {
Toast.makeText(MainActivity.this, "点击了设置的链接", 0).show();
}
}, 5, 7, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
ssb.setSpan(new ForegroundColorSpan(Color.RED),5, 7,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannablesbList.add(ssb);
ssb = new SpannableStringBuilder("设置项目符号");
ssb.setSpan(new BulletSpan(android.text.style.BulletSpan.STANDARD_GAP_WIDTH, Color.GREEN), 0, new String("设置项目符号").length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 第一个参数表示项目符号占用的宽度,第二个参数为项目符号的颜色
spannablesbList.add(ssb);
ssb = new SpannableStringBuilder("设置字体样式正常,粗体,斜体,粗斜体 ");
// 设置字体样式正常,粗体,斜体,粗斜体
ssb.setSpan(new StyleSpan(android.graphics.Typeface.NORMAL), 6, 9, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 正常
ssb.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 9, 12, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 粗体
ssb.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 12, 15, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 斜体
ssb.setSpan(new StyleSpan(android.graphics.Typeface.BOLD_ITALIC), 15, 18, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 粗斜体
spannablesbList.add(ssb);
// 设置字体(default,default-bold,monospace,serif,sans-serif)
String str = "设置字体(default,default-bold,monospace,serif,sans-serif)";
ssb = new SpannableStringBuilder(str);
ssb.setSpan(new TypefaceSpan("default"), 0, new String("设置字体(default,").length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ssb.setSpan(new TypefaceSpan("default-bold"), new String("设置字体(default,").length(), new String("设置字体(default,default-bold,").length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ssb.setSpan(new TypefaceSpan("monospace"), new String("设置字体(default,default-bold,").length(), new String("设置字体(default,default-bold,monospace,").length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ssb.setSpan(new TypefaceSpan("serif"), new String("设置字体(default,default-bold,monospace,").length(), new String("设置字体(default,default-bold,monospace,serif,").length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ssb.setSpan(new TypefaceSpan("sans-serif"), new String("设置字体(default,default-bold,monospace,serif,").length(), new String("设置字体(default,default-bold,monospace,serif,sans-serif)").length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
spannablesbList.add(ssb);
ssb = new SpannableStringBuilder("设置字体大小(绝对值:单位:像素/单位:像素)");
ssb.setSpan(new AbsoluteSizeSpan(20),new String("设置字体大小(绝对值,").length(), new String("设置字体大小(绝对值,单位:像素,").length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
ssb.setSpan(new AbsoluteSizeSpan(20, true),new String("设置字体大小(绝对值,单位:像素,").length(), new String("设置字体大小(绝对值,单位:像素,单位:像素)").length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 第二个参数boolean
// dip,如果为true,表示前面的字体大小单位为dip,否则为像素,上同
spannablesbList.add(ssb);
ssb = new SpannableStringBuilder("设置字体大小(相对值:一半/两倍,单位:像素) 参数表示为默认字体大小的多少倍 ");
ssb.setSpan(new RelativeSizeSpan(0.5f), new String("设置字体大小(相对值:").length(), new String("设置字体大小(相对值:一半/").length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 0.5f表示默认字体大小的一半
ssb.setSpan(new RelativeSizeSpan(2.0f), new String("设置字体大小(相对值:一半/").length(), new String("设置字体大小(相对值:一半/两倍,").length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); // 2.0f表示默认字体大小的两倍
spannablesbList.add(ssb);
ssb = new SpannableStringBuilder("我的后面添加图片: ");
ssb.setSpan(new ImageSpan(this, R.drawable.ic_launcher), 9, 10, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannablesbList.add(ssb);
ssb = new SpannableStringBuilder("我的中 间添加图片 ");
ssb.setSpan(new ImageSpan(this, R.drawable.ic_launcher), 3, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannablesbList.add(ssb);
ssb = new SpannableStringBuilder("图片点击事件的处理 ");
ssb.setSpan(new ImageSpan(this, R.drawable.ic_launcher), 3, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
ssb.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
Toast.makeText(MainActivity.this, "图片点击事件的处理 ", 0).show();
}
}, 3, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannablesbList.add(ssb);
ssb = new SpannableStringBuilder("更复杂的点击效果");
ssb.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
Toast.makeText(MainActivity.this, "更复杂的点击效果", 0).show();
}
}, 3, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannablesbList.add(ssb);
ssb = new SpannableStringBuilder("更复杂的点击效果");
ssb.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
Toast.makeText(MainActivity.this, "更复杂的点击效果", 0).show();
}
public void updateDrawState(TextPaint ds) {
ds.setUnderlineText(false);
}
}, 3, 4, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
spannablesbList.add(ssb);
}
public static class CustomImageGetter implements Html.ImageGetter {
public static final int DEFAULT = -1;
int mRight;
int mBottom;
Context mContext;
public CustomImageGetter(Context context, int right, int bottom) {
mRight = right;
mBottom = bottom;
mContext = context;
}
@Override
public Drawable getDrawable(String source) {
int id = Integer.parseInt(source);
Drawable d = mContext.getResources().getDrawable(id);
if (null != d) {
d.setBounds(0, 0, mRight == DEFAULT ? d.getIntrinsicWidth() : mRight,
mBottom == DEFAULT ? d.getIntrinsicHeight() : mBottom);
}
return d;
}
}
}