最近登录页要给个什么隐私政策的提示,蓝白下滑线混合在一起,因为不想写几个TextView(主要是单个TextView会换行不好看),所以用了SpannableString,顺便就跑来这里记录一下一些比较常用的实现
后续操作都是在这个基本代码的基础上写的
TextView tvMessage = (TextView) findViewById(R.id.tvMessage);
SpannableString rawStr = new SpannableString("建议QQ删除好友时给对方通知");
//一些对rawStr的设置以后
tvMessage.setText(rawStr);
设置字体颜色
rawStr.setSpan(new ForegroundColorSpan(ContextCompat.getColor(this, R.color.red)), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
效果图
设置背景颜色
rawStr.setSpan(new BackgroundColorSpan(ContextCompat.getColor(this, R.color.red)), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
效果图
设置字体,官方注释是这几个"monospace", "serif", "sans-serif" 但我试了都没有效果,不知道是哪里的问题
rawStr.setSpan(new TypefaceSpan("sans-serif"), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
效果图
没有,压根没变化
设置字体大小,绝对值,其中第二个参数 true为dp值,false为像素值,如果不传,则默认像素值
rawStr.setSpan(new AbsoluteSizeSpan(20, false), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
效果图
设置字体大小,相对值,2f表示默认字体大小的两倍,一般我们默认的都是14sp
rawStr.setSpan(new RelativeSizeSpan(2f), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
效果图
设置字体大小,相对值,缩放X值,2f表示默认字体大小宽度的两倍,一般变宽了字体也会变大,但没有RelativeSizeSpan这么有规律
rawStr.setSpan(new ScaleXSpan(2f), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
效果图
设置字体样式 正常
rawStr.setSpan(new StyleSpan(Typeface.NORMAL), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
效果图
没有
设置字体样式 粗体
rawStr.setSpan(new StyleSpan(Typeface.BOLD), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
效果图
设置字体样式 斜体
rawStr.setSpan(new StyleSpan(Typeface.ITALIC), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
效果图
设置字体样式 粗斜体
rawStr.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
效果图
设置字体样式,真正意义上的样式。。。
后面两个null是颜色变化和link颜色的,快速看了一下源码没看懂,后面有时间再补,主要是我一直都传的null。。。
rawStr.setSpan(new TextAppearanceSpan("monospace", Typeface.BOLD, 40, null, null), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
效果图
设置下划线
rawStr.setSpan(new UnderlineSpan(), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
效果图
设置删除线
rawStr.setSpan(new StrikethroughSpan(), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
效果图
设置上角标,就是把字体往上平移,如果要用,记得用设置字体大小缩小一半以上
rawStr.setSpan(new SuperscriptSpan(), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
效果图
设置下角标,就是把字体往下平移,如果要用,记得用设置字体大小缩小一半以上
rawStr.setSpan(new SubscriptSpan(), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
效果图
设置超链,电话号码,要配合TextView的setMovementMethod一起使用才会响应点击事件,出来的效果就是点击后跳转到拨号界面,号码为tel:后面部分, 如果想修改字体样式,建议使用clickableSpan
rawStr.setSpan(new URLSpan("tel:10086"), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tvMessage.setMovementMethod(LinkMovementMethod.getInstance());
效果图
设置超链,邮件,要配合TextView的setMovementMethod一起使用才会响应点击事件,出来的效果就是点击后跳转到发邮件界面,收件人为mailto:后面部分, 如果想修改字体样式,建议使用clickableSpan
rawStr.setSpan(new URLSpan("mailto:123456789@qq.com"), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tvMessage.setMovementMethod(LinkMovementMethod.getInstance());
效果图
设置超链,网页,要配合TextView的setMovementMethod一起使用才会响应点击事件,出来的效果是点击后弹出让选择浏览器,打开浏览器就是指定的网址,一定要加上http://或者https://,如果想修改字体样式,建议使用clickableSpan
rawStr.setSpan(new URLSpan("http://www.baidu.com"), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tvMessage.setMovementMethod(LinkMovementMethod.getInstance());
效果图
设置超链,短信,要配合TextView的setMovementMethod一起使用才会响应点击事件,出来效果是点击后跳转到编辑短信界面,收件人是sms:后面的号码,如果想修改字体样式,建议使用clickableSpan
rawStr.setSpan(new URLSpan("sms:10086"), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tvMessage.setMovementMethod(LinkMovementMethod.getInstance());
效果图
设置超链,彩信,要配合TextView的setMovementMethod一起使用才会响应点击事件,出来的效果是点击后一般还是跳转到短信编辑界面,因为现在基本是短信彩信一起了,收件人是mms:后面的号码,如果想修改字体样式,建议使用clickableSpan
rawStr.setSpan(new URLSpan("mms:10086"), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tvMessage.setMovementMethod(LinkMovementMethod.getInstance());
效果图
设置超链,地图,要配合TextView的setMovementMethod一起使用才会响应点击事件,出来的效果是点击后跳转到默认地图软件,注意传的是标准GPS坐标,不过软件一般会自动转成对应地图的经纬度,无需额外处理,如果想修改字体样式,建议使用clickableSpan
rawStr.setSpan(new URLSpan("geo:22.53125695006,114.0736434700"), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tvMessage.setMovementMethod(LinkMovementMethod.getInstance());
效果图
设置图片
Drawable drawable = ContextCompat.getDrawable(this, R.drawable.ic_launcher_foreground);
int drawHeight = drawable.getMinimumHeight();//获取图片建议的最小高度
int drawWidth = drawable.getMinimumWidth();//获取图片建议的最小宽度
drawable.setBounds(0, 0, drawWidth, drawHeight);//限制在这个范围里,主要为了好看一点点
rawStr.setSpan(new ImageSpan(drawable), 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
效果图
设置部分字体点击事件,前面说到建议用这个的,就是直接写点击事件,然后事件实现我们自己写,这个的好处就是可以改样式,还是要配置setMovementMethod使用
rawStr.setSpan(new ClickableSpan() {
@Override
public void onClick(@NonNull View widget) {
//要实现的点击事件
}
@Override
public void updateDrawState(@NonNull TextPaint ds){
//在这里改变样式
ds.setUnderlineText(false);//设置不要下划线,默认有
ds.setColor(ContextCompat.getColor(SpannableStringLearningView.this, R.color.blue));//设置蓝色
}
}, 4, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
tvMessage.setMovementMethod(LinkMovementMethod.getInstance());
效果图
如果想点击后不显示背景的高光,可以设置背景高光为透明
tvMessage.setHighlightColor(ContextCompat.getColor(this, R.color.transparent));