TextView学习

http://blog.csdn.net/a_mean/article/details/6930968

1:显示富文本(URL、不同大小、字体、颜色的文本)

在TextView类中预定义了一些类似HTML的标签,通过这些标签,可以使TextView控件显示不同的颜色、大小、字体的文字。

<font>:设置颜色                      <big>:设置大号字                 <small>:设置小号字

<i>:斜体                 <b>:粗体                     <tt>:等宽字体(Monospace)

<br>:换行(行与行之间没有空行)                <p>:换行(行与行之间的空行)

<a>:链接地址                          <img>:插入图像

这些标签虽然和HTML的标签类似,但并不具备HTML标签的全部功能。如<font>标签只支持color和face两个属性。

在使用这些标签时不能将带这些标签的字符串直接赋值到TextView上,而需要使用Html.frmHtml方法将带标签的字符串转换成CharSequence对象,再赋值给TextView。

如果想在显示的文本中将URL、E-mail、电话等特殊内容高亮显示,并在单击时触发相应的动作(如单击电话会直接在拨号界面显示电话号码),

可以设置<TextView>标签的android:autoLink属性,该属性可设置的属性值如下:

none:不匹配任何链接(默认)               web:匹配Web网址                    email:匹配E-mail地址

phone:匹配电话号码                           map:匹配映射地址                    all:匹配所有的链接


下面是示例

public class Main extends Activity {


	private TextView txtFirst,txtSecond;
	
	@Override
   	public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        txtFirst=(TextView)findViewById(R.id.txtFirst);
        txtSecond=(TextView)findViewById(R.id.txtSecond);
        String html="<font color='red'>样式一</font> <br>";
        html+="<font color='#0000FF'> <big> <i> 样式二 </i> </big> <font>";
        html+="<font color='@"+android.R.color.white+"'> <tt> <b> <big> <u> 样式三 </u> </big> </b> </tt> </font> <br>";
        html+="<big> <a href='http://blog.csdn.net/a_mean'>我的博客:http://blog.csdn.net/a_mean </a> </big>";
        
        CharSequence charSequence=Html.fromHtml(html);
        txtFirst.setText(charSequence);
        //该语句在设置后必加,不然没有任何效果
        txtFirst.setMovementMethod(LinkMovementMethod.getInstance());
        
    }
}



2:显示表情图像和文字

这样的效果类似我们在网络上聊天时发出的表情和文字,我们添加一个<img>标签就可以很容易地实现。

<img>标签只有一个src属性,它指向一个图像地址或可以找到某个图像资源的唯一标识。


public class Main extends Activity {

	private TextView txtSecond;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		txtSecond = (TextView) findViewById(R.id.txtSecond);

		String html = "很高兴<img src='gx' /> 很得意<img src='dy' />";
		CharSequence charSequence = Html.fromHtml(html, new ImageGetter() {

			@Override
			public Drawable getDrawable(String source) {
				Drawable drawable = getResources().getDrawable(
						getResourceId(source));
				//这句话必写,不然图片是有了 不过显示的面积为0.
				drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
				return drawable;
			}
		}, null);
		
		txtSecond.setText(charSequence);
		txtSecond.setMovementMethod(LinkMovementMethod.getInstance());
	}

	/**
	 * 由于无法直接使用文件名来引用res/drawable中的图像资源, 我们利用反射技术 从R.drawable类中通过图像资源文件名,
	 * 去获得相应的图像资源ID,实现代码如下:
	 */
	public static int getResourceId(String name) {
		int id = 0;
		try {
			Field field = R.drawable.class.getField(name);
			id = Integer.parseInt(field.get(null).toString());
		} catch (Exception e) {
			e.printStackTrace();
		}
		return id;
	}
}


3:单击链接弹出Activity

上面我们已经学会了使用让TextView自动识别的特殊文本,但要是我们想在单击TextView时执行我们自定义的动作要怎么办呢?

public class Main extends Activity {

	private TextView txtSecond;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);

		txtSecond = (TextView) findViewById(R.id.txtSecond);

		String text="单击弹出Activity";
		SpannableString spannableString =new SpannableString(text);
		//把text中的所有文本设置成ClickableSpan对象,并实现onClick方法
		spannableString.setSpan(new ClickableSpan() {
			
			@Override
			public void onClick(View widget) {
				//这里做我们自定义的动作
				Intent intent=new Intent(Main.this,Test.class);
				startActivity(intent);
			}
			/**解释一下这个setSpan方法,第一个参数需要设置一个ClickableSpan对象,
			 * 第二个和第三个参数分别表示文本中要设置成Span的某段文本的起始位置和终止位置的下一个字符的位置
			 * 最后一个参数是一个标志,分别是:
			 *  Spannable.SPAN_EXCLUSIVE_INCLUSIVE 在Span前的字符不应用Span的效果,后面的字符应用
			 *  Spannable.SPAN_EXCLUSIVE_EXCLUSIVE 在Span前的字符应用Span的效果,后面的不应用
			 *  Spannable.SPAN_INCLUSIVE_INCLUSIVE 在Span前后的字符都应用Span的效果
			 */
		}, 0, text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        txtSecond.setText(spannableString);
		txtSecond.setMovementMethod(LinkMovementMethod.getInstance());
        }
    }


4:为指定文字添加背景

有一个很常用的Span类叫BackgroundColorSpan,该类的功能是设置指定字符串的背景色:

第1步:将字符串转换成SpannableString对象

第2步:确定要设置的子字符串的start和end

第3步:创建BackgroundColorSpan对象

           BackgroundColorSpan bgColorSpan=new BackgroundColorSpan(Color.RED);

第4步:使用setSpan方法将指定子字符串转换成BackgroundColorSpan对象

            spannableString.setSpan(bgColorSpan,start,end,Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

第5步:用SpannableString对象设置TextView控件

           textView.setText(spannableString);

           textView.setMovementMethod(LinkMovementMethod.getInstance());    


5:带边框的TextView

Android SDK本身提供的TextView控件并不支持边框,所以要想实现这一效果的话我们可以自定义一个控件继承TextView并修改它,

当然也可以设置TextView控件的背景图,这个不作演示。

首先定义一个BorderTextView类, extends TextView 。

public class BorderTextView extends TextView {

	public BorderTextView(Context context, AttributeSet attrs) {
		super(context, attrs);
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		// 实例化一支画笔
		Paint paint = new Paint();
		// 设置所绘制的边框颜色为黑色
		paint.setColor(android.graphics.Color.WHITE);
		// 绘制上边框
		canvas.drawLine(0, 0, this.getWidth() - 1, 0, paint);
		// 绘制左边框
		canvas.drawLine(0, 0, 0, this.getHeight() - 1, paint);
		// 绘制右边框
		canvas.drawLine(this.getWidth() - 1, 0, this.getWidth() - 1,
				this.getHeight() - 1, paint);
		// 绘制上边框
		canvas.drawLine(0, this.getHeight() - 1, this.getWidth() - 1,
				this.getHeight() - 1, paint);
	}

}
然后在xml布局文件中加入这个控件,这里控件的类型要写上全名(packageName+className):

<com.hm.BorderTextView
    android:layout_width="wrap_content" android:layout_height="wrap_content"
    android:textColor="#000000" android:layout_margin="20dp"
    android:text="BorderTextView"
    />
效果如下:



6:设置行间距

如果在TextView控件中显示了多行文本,会有一个默认的行间距。如果要更改这个默认的行间距的话,我们可以使用下面几种方式:

android:lineSpacingExtra属性设置精确的行间距。

android:lineSpacingMultiplier属性设置默认行间距的倍数。

使用Style资源设置行间距。我们需要先在res\values目录中的文件里定义一个Style:

                  <style name="line_space">
                         <item name="android:lineSpacingMultiplier">1.5</item>
                 </style>

下面是示例。

<?xml version="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
	android:orientation="vertical" android:layout_width="match_parent"
	android:layout_height="match_parent">
	<TextView android:text="第一行\n第二行" android:lineSpacingExtra="20dp"
		android:id="@+id/textView1" android:layout_width="wrap_content"
		android:layout_height="wrap_content"></TextView>
	<TextView android:text="第三行\n第四行"
		android:lineSpacingMultiplier="1.8" android:id="@+id/textView2"
		android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
	<TextView android:text="第五行\n第六行" style="@style/line_space" android:id="@+id/textView3"
		android:layout_width="wrap_content" android:layout_height="wrap_content"></TextView>
</LinearLayout>
此外还可以在代码中设置:textView.setLineSpacing(50,1.2f);第一个参数是精确值,后一个是倍数。

以上几种方式,如果同时设置了精锐值和倍数的话,系统会以最大的一个作为行间距的距离。


7:在未显示完的文本后面加上省略号

当文本内容太多时,TextView控件一屏无法完整显示,这样有时候我们就需要在内容中加上省略号。

在TextView标签中加上android:singleLine="true",这样内容只会显示一行,然后再加上android:ellipsize="end",

这样在该行的末尾就会加上省略号了,android:ellipsize这个属性值还可以是start,middle,有兴趣的朋友可以自己试试。

我们还可以在代码中进行设置:textView.setEllipsize(TextUtils.TruncateAt.END);后面跟的是一个枚举类型。


8:走马灯效果

对于长文本的显示,除了用省略号之外我们还可以让它滚动显示,这样的效果也叫走马灯效果。

我们实现这个效果,也要用到上面android:ellipsize的属性,还有android:marqueeRepeatLimit,和android:focusable属性。

<TextView android:id="@+id/txtInfo" android:text="这里是测试内容,内容要长容要长要长长长长长长长长长长长长长长长长"
android:ellipsize="marquee" android:marqueeRepeatLimit="marquee_forever"
android:focusable="true" android:focusableInTouchMode="true"  android:singleLine="true" 
android:layout_width="fill_parent" android:layout_height="wrap_content" />

如果有的朋友实现这个走马灯效果时发现它跑不起来,记得把android:focusableInTouchMode事件也写上就行了。


9:垂直滚动

像我们看小说时,会有很多内容要往下浏览,这时我们就要用到垂直滚动。

与垂直滚动直接相关的有下面几个属性:

android:scrollbars="vertical"  该属性值必须设置为vertical

android:scrollbarStyle="outsideOverlay" 表示滚动条的位置

android:scrollbarFadeDuration="2000" 表示滚动条从出现到消失的时间,单位是毫秒。

如果你设置了这几个属性还是没有出现垂直滚动条的话,请看看你的内容android:text,只有比较长的文本才可以滚动。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值