Android之TextView
1、实现超链接
- 直接在xml文件中配置autoLink属性
autoLink属性一共有六个值,分别是none(正常),web(将文本识别为一个网址),phone(将文本识别为一个电话号码),mail(将文本识别为一个邮件地址),map(打开地图应用),all(根据文本自动识别)。一般情况下我们设置为all即可
<TextView
android:id="@+id/textView4"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:autoLink="phone"
android:text="10086"
android:textColor="@color/colorPrimary"
android:textSize="20sp" />
- 使用HTML语言
textView4.setText(Html.fromHtml("<a href='tel:10086'>打电话</a>," +
"<a href='smsto:10086'>发短信</a>," +
"<a href='mailto:584991843@qq.com'>发邮件</a>," +
"<a href='http://www.baidu.com'>Go百度</a>"));
textView4.setMovementMethod(LinkMovementMethod.getInstance()); - 使用SpannableString实现超链接(见下文图文混排)
2、TextView图文混排
- 直接设置属性drawableLeft等
- 使用HTML
- 使用SpannableString
SpannableString spannableString = new SpannableString("绿色打电话斜体删除线下划线图片:.点我背景颜色大字5模糊浮雕伸缩");
//设置字体颜色
spannableString.setSpan(new ForegroundColorSpan(Color.GREEN), 0, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置字体背景颜色
spannableString.setSpan(new BackgroundColorSpan(Color.GREEN), 19, 23, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置字体大小
spannableString.setSpan(new RelativeSizeSpan(2.0f), 23, 25, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置字体上下标(上标:SuperscriptSpan,下标:SubscriptSpan)
spannableString.setSpan(new SuperscriptSpan(), 25, 26, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置字体上标为小字体
spannableString.setSpan(new RelativeSizeSpan(0.5f), 25, 26, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置字体模糊---模糊模式(向内部模糊--blur.inner, 向外部模糊实心:blur.solid, 向外部模糊空心:blur.outer,正常模糊:blur.normal)
spannableString.setSpan(new MaskFilterSpan(new BlurMaskFilter(5.0f, BlurMaskFilter.Blur.NORMAL)), 26, 28, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置字体浮雕(好像无效)-direction是float数组,定义长度为3的数组标量[x,y,z],来指定光源的方向
//ambient 取值在0到1之间,定义背景光 或者说是周围光
//specular 定义镜面反射系数。
//blurRadius 模糊半径。
spannableString.setSpan(new EmbossMaskFilter(new float[]{10, 10, 10}, 0.1f, 5.0f, 5.0f), 28, 30, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//基于X轴字体伸缩
spannableString.setSpan(new ScaleXSpan(2.0f), 30, 32, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//设置超链接(打电话)
//打开百度:"http://www.baidu.com",发短信:"smsto:18565554482",发邮件:"mailto:584991843@qq.com",
spannableString.setSpan(new URLSpan("tel:10086"), 2, 5, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//用样式标记文本(斜体加粗)
spannableString.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), 5, 7, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//用杀删除线标记文本
spannableString.setSpan(new StrikethroughSpan(), 7, 10, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//用下划线标记文本
spannableString.setSpan(new UnderlineSpan(), 10, 14, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//获取drawable
Drawable drawable = getResources().getDrawable(R.mipmap.ic_launcher);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
//创建imagespan
ImageSpan imageSpan = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE);
//用imagespan替换文本
spannableString.setSpan(imageSpan, 16, 17, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//部分文字点击事件
spannableString.setSpan(new ClickableSpan() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "点我", Toast.LENGTH_SHORT).show();
}
@Override
public void updateDrawState(TextPaint ds) {
super.updateDrawState(ds);
ds.setColor(Color.BLUE);//设置颜色
ds.setUnderlineText(false);//去掉下划线
}
}, 17, 19, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
//点击图片
spannableString.setSpan(new ClickableSpan() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "我是一张图片", Toast.LENGTH_SHORT).show();
}
}, 16, 17, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView3.setText(spannableString);
textView3.setHighlightColor(Color.TRANSPARENT);//消除点击时的背景色
//实现文本的滚动
textView3.setMovementMethod(LinkMovementMethod.getInstance());
SpannableString简介
SpannableString其实和String一样,都是一种字符串类型,同样TextView也可以直接设置SpannableString作为显示文本,不同的是SpannableString可以通过使用其方法setSpan方法实现字符串各种形式风格的显示,重要的是可以指定设置的区间,也就是为字符串指定下标区间内的子字符串设置格式。
setSpan(Object what, int start, int end, int flags)方法需要用户输入四个参数,what表示设置的格式是什么,可以是前景色、背景色也可以是可点击的文本等等,start表示需要设置格式的子字符串的起始下标,同理end表示终了下标,flags属性就有意思了,共有四种属性:
Spanned.SPAN_INCLUSIVE_EXCLUSIVE 从起始下标到终了下标,包括起始下标
Spanned.SPAN_INCLUSIVE_INCLUSIVE 从起始下标到终了下标,同时包括起始下标和终了下标
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE 从起始下标到终了下标,但都不包括起始下标和终了下标
Spanned.SPAN_EXCLUSIVE_INCLUSIVE 从起始下标到终了下标,包括终了下标
关于StringSpannable的一个参考:https://www.jianshu.com/p/509b0d2626f4
3、设置最大字数
代码中:
textView.setFilters(new InputFilter[] { new InputFilter.LengthFilter(12) });
布局中
maxlength