TextView通常用来显示普通文本,但是有时候需要对其中某些文本进行样式、事件方面的设置。Android系统通过SpannableString类来对指定文本进行相关处理,具体有以下功能:
1、BackgroundColorSpan 背景色
2、ClickableSpan 文本可点击,有点击事件
3、ForegroundColorSpan 文本颜色(前景色)
4、MaskFilterSpan 修饰效果,如模糊(BlurMaskFilter)、浮雕(EmbossMaskFilter)
5、MetricAffectingSpan 父类,一般不用
6、RasterizerSpan 光栅效果
7、StrikethroughSpan 删除线(中划线)
8、SuggestionSpan 相当于占位符
9、UnderlineSpan 下划线
10、AbsoluteSizeSpan 绝对大小(文本字体)
11、DynamicDrawableSpan 设置图片,基于文本基线或底部对齐。
12、ImageSpan 图片
13、RelativeSizeSpan 相对大小(文本字体)
14、ReplacementSpan 父类,一般不用
15、ScaleXSpan 基于x轴缩放
16、StyleSpan 字体样式:粗体、斜体等
17、SubscriptSpan 下标(数学公式会用到)
18、SuperscriptSpan 上标(数学公式会用到)
19、TextAppearanceSpan 文本外貌(包括字体、大小、样式和颜色)
20、TypefaceSpan 文本字体
21、URLSpan 文本超链接
可以通过一个小实例了解一下上面方法的用法,代码如下:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/textView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!" />
</RelativeLayout>
MainActivity.java代码如下:
public class MainActivity extends AppCompatActivity {
private TextView mTextView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTextView = (TextView) findViewById(R.id.textView);
mTextView.setText(getString());
//设置超链接可点击
mTextView.setMovementMethod(LinkMovementMethod.getInstance());
}
private SpannableString getString() {
final SpannableString spannableString = new SpannableString(
"这是测试字符串,百度地址如下:http://www.baidu.com");
//BackgroundColorSpan设置背景颜色为绿色
spannableString.setSpan(new BackgroundColorSpan(Color.GREEN),
15, spannableString.length(),
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
//UnderlineSpan设置下划线
spannableString.setSpan(new UnderlineSpan(),
15, spannableString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置可点击的单击事件监听
spannableString.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
Intent it = new Intent(Intent.ACTION_VIEW,
Uri.parse(spannableString.subSequence(15,
spannableString.length()).toString()));
it.setClassName("com.android.browser",
"com.android.browser.BrowserActivity");
MainActivity.this.startActivity(it);
}
}, 15, spannableString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
return spannableString;
}
}
setSpan方法需要传入几个参数:
- 第一个是处理的方法,也就是上面介绍的一些方法;
- 第二个是起始位置;
- 第三个是结束位置;
- 第四个是标志位,这里主要有如下几种:
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE(前后都不包括)、Spanned.SPAN_INCLUSIVE_EXCLUSIVE(前面包括,后面不包括)、Spanned.SPAN_EXCLUSIVE_INCLUSIVE(前面不包括,后面包括)、Spanned.SPAN_INCLUSIVE_INCLUSIVE(前后都包括)
运行实例如下:
这里我们设置了下划线,并对这部分文字引入了ClickSpan对象,也就是文字可点击,里面覆写了onClick方法,在这个方法中处理了URL的打开逻辑,除了这个方法,系统还提供了URLSpan 对象,同样可以实现URL跳转如下:
private SpannableString getUrl(){
SpannableString spannableString;
spannableString = new SpannableString("URLSpan -- 亚运的博客");
spannableString.setSpan(new URLSp
10, spannableString.length(),
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
return spannableString;
}
可以查看一下URLSpan的源码如下:
@Override
public void onClick(View widget) {
Uri uri = Uri.parse(getURL());
Context context = widget.getContext();
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
intent.putExtra(Browser.EXTRA_APPLICATION_ID, context.getPackageName());
try {
context.startActivity(intent);
} catch (ActivityNotFoundException e) {
Log.w("URLSpan", "Actvity was not found for intent, " + intent.toString());
}
}
内部实现了onClick单击事件,通过getURL方法获取对象初始化时传入的URL,也就是:
然后通过Intent跳转到浏览器显示,运行如下:
除了对文字进行处理之外,还可以引入图片,看下面的方法:
private SpannableString getString2() {
SpannableString spannableString = new SpannableString("这是测试字符串,这是测试字符串");
DynamicDrawableSpan drawableSpan =
new DynamicDrawableSpan(DynamicDrawableSpan.ALIGN_BASELINE) {
@Override
public Drawable getDrawable() {
Drawable d = getResources().getDrawable(R.mipmap.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.mipmap.ic_launcher);
d.setBounds(0, 0, 50, 50);
return d;
}
};
spannableString.setSpan(drawableSpan, 3, 4, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
spannableString.setSpan(drawableSpan2, 7, 8, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
return spannableString;
}
DynamicDrawableSpan 设置图片,基于文本基线或底部对齐。创建第一个DynamicDrawableSpan 对象的时候传入的参数确定了是基于文本基线对齐。同时创建这个对象的时候构造了一个匿名内部类。这个方法里面首先获取一个Drawable对象,调用了其setBounds方法,需要传入四个参数:(int left, int top, int right, int bottom),这个四参数指的是drawable将在被绘制在canvas的哪个矩形区域内。
第二个DynamicDrawableSpan 对象采用的是基于底部对齐,运行实例看一下效果如下:
这里就演示这几个方法,其余方法的代码可以自行测试。
谢谢关注我的微信公众号,觉得好可以分享到朋友圈哦.