前言:
TestView控件相信大家并不陌生。TestView其实就是用来显示字符串的组件,在手机上就是显示一块文本的区域。向用户显示文本,并可选择允许他们编辑文本。本文主要讲在实际开发过程中,我们经常需要用到的几种用法。
对于TestView的基本介绍和所有属性大全,如果还有不是很了解的,可以直接再看下官方api文档:
http://www.android-doc.com/reference/android/widget/TextView.html
以下,我们直接开始介绍
一. TestView 实现图文混排
可以使用Html.fromHtml(source, imageGetter, tagHandler)通过自定义imageGetter来异步加载图片,下面直接开始贴代码:
//使用反射机制来获取资源的id的字段(静态变量)的值
public int getResourceId(String name) {
try {
// 根据资源的id名的变量取得field的对象,使用反射机制来实现
Field field = R.drawable.class.getField(name);
// 取得并返回资源的id的字段(静态变量)的值,使用反射机制
return Integer.parseInt(field.get(null).toString());
} catch (Exception e) {
}
return 0;
}
需要注意的地方点:
- 在getDrawable方法中使用获得图像资源的Drawable对象后,必须使用Drawable.setBounds方法设置图像的显示区域,否则显示区域的面积为0,也就不会在TextView中显示图像了。通过SetBounds方法还可以将原图像放大或缩小显示。
- TagHandler对象。这个参数使用的并不多。当系统处理每一个标签时都会调用该对象的handleTag方法。如果不使用该参数,可将它设为null。
实现代码:
String hmtl = "android 标签一<img src='pic1'/><br>android 标签二<img src='pic2'/><br>android 标签三<img src='pic3'/><br>android 标签四<img src='pic4'/><br>android 标签五<img src='pic5'/><br>";
CharSequence charSequence = Html.fromHtml(hmtl, new ImageGetter() {
public Drawable getDrawable(String source) {
// 获得资源系统的信息,比如图片信息//根据名字,获取图片id,再根据id获取当前工程下的drawable文件中的图片
Drawable drawable = MainActivity.this.getResources()
.getDrawable(getResourceId(source));
// 当名字等于pic3的时候,使图片变小
if (source.equals("pic3")) {
// IntrinsicWidth内部固有的宽IntrinsicHeight内部固有的高
drawable.setBounds(0, 0, drawable.getIntrinsicWidth() / 2,
drawable.getIntrinsicHeight() / 2);
} else {
// IntrinsicWidth内部固有的宽IntrinsicHeight内部固有的高
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(),
drawable.getIntrinsicHeight());
}
return drawable;
}
}, null);
testView.setText(charSequence);
testView.setMovementMethod(LinkMovementMethod.getInstance());
然后看下效果图:
二. TestView 显示丰富的文本
在TextView中预订了一些类似html的标签,通过标签可以使TextView控件显示不同颜色、大小、字体的文字。点击连接实现跳转指定网址,发email,拨号。
更多关于HTML中标签的使用,请参考:
使用这些标签时,可以用Html.fromHtml()方法将这些标签的字符串转换成CharSequence对象,然后在TextView中通过setText()方法将CharSequence对象显示出来。
String html="<font color='red'>这是红色的一栏</font><br><br>";
//<p>表示段落符
html+="<font color='#0000ff'><i><big>这是蓝色的一行</big></i></font><p>";
html+="<a href=''>donkor_的博客</a><br>";
CharSequence charsequence=Html.fromHtml(html);
textView1.setText(charsequence);
textView1.setMovementMethod(LinkMovementMethod.getInstance());
String text="tel:1008611\r\n";
text+="email:donkor@yeah.net\r\n";
text+="url:";
textView2.setText(text);
textView2.setMovementMethod(LinkMovementMethod.getInstance());
这里需要注意的是,在xml中需要对第二个TextView设置自动识别链接,值all为匹配所有,包括Web网址,电话号码,Email地址。
android:autoLink=”all”
下面看下效果图 :
三. TestView 点击文字弹出Activity
点击文字弹出Activity,在实际开发中,需要对点击文本进行跳转事件的时候经常需要用到,实现过程比较简单,下面直接上代码:
//标签文本
SpannableString s1=new SpannableString("跳转到第一个Activity");
SpannableString s2=new SpannableString("跳转到第二个Activity");
//设置标签点击事件
s1.setSpan(new ClickableSpan() {
public void onClick(View arg0) {
Intent intent=new Intent(MainActivity.this,FristActivity.class);
startActivity(intent);
}//最后一个参数表示从头到尾都可以点击执行
}, 0,s1.length(),Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
s2.setSpan(new ClickableSpan() {
public void onClick(View arg0) {
Intent intent=new Intent(MainActivity.this,SecondActivity.class);
startActivity(intent);
}
}, 0, s2.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView1.setText(s1);
textView2.setText(s2);
textView1.setMovementMethod(LinkMovementMethod.getInstance());
textView2.setMovementMethod(LinkMovementMethod.getInstance());
看下效果图:
四. TestView 实现跑马灯效果
所谓跑马灯效果就是当文字超过控件所能容纳的空间时,在展现的界面内滚动,多用于广告语。网上实现跑马灯的实例代码有很多,这里仅介绍最简单的一种,直接用动画即可。下面直接看代码:
String html = "Android<a href=''>donkor的博客</a> donkor的博客";
CharSequence charSequence = Html.fromHtml(html);
textView.setText(charSequence);
textView.setMovementMethod(LinkMovementMethod.getInstance());
Animation ani = new TranslateAnimation(310f, -400f, 0.0f, 0.0f);
ani.setDuration(10000);
ani.setRepeatCount(500);
ani.setRepeatMode(1);
textView .startAnimation(ani);
String html = "Android<a href=''>donkor的博客</a> donkor的博客";
CharSequence charSequence = Html.fromHtml(html);
textView.setText(charSequence);
textView.setMovementMethod(LinkMovementMethod.getInstance());
Animation ani = new TranslateAnimation(310f, -400f, 0.0f, 0.0f);
ani.setDuration(10000);
ani.setRepeatCount(500);
ani.setRepeatMode(1);
textView .startAnimation(ani);
最后看下效果图:
Demo下载