我是靠谱客的博主 英俊微笑,最近开发中收集的这篇文章主要介绍Android TextView多种字体色多种样式Android TextView多种字体色多种样式,觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
Android TextView多种字体色多种样式
有时候一个TextView文本框为了强调内容需要显示不同颜色,显示不同的样式、看了下网上的资料使用
-SpannableStringBuilder
-SpannableString
第一篇博客
- 第一篇博客、菜鸟一只 、记录学习、
- 根据网上资料整理!一个多样TextView样式类
SetSpan()
创建完Spannable对象后,就可以为它们设置Span来实现想要的Rich Text了,常见的Span有:
Object what | 注解 |
---|---|
AbsoluteSizeSpan(int size) | 设置字体大小,参数是绝对数值,相当于Word中的字体大小 |
RelativeSizeSpan(float proportion) | 设置字体大小,参数是相对于默认字体大小的倍数,比如默认字体大小是x, 那么设置后的字体大小就是x*proportion,这个用起来比较灵活,proportion>1就是放大(zoom in), proportion<1就是缩小(zoom out) |
ScaleXSpan(float proportion) | 缩放字体,与上面的类似,默认为1,设置后就是原来的乘以proportion,大于1时放大(zoon in),小于时缩小(zoom out) |
BackgroundColorSpan(int color) | 背景着色,参数是颜色数值,可以直接使用android.graphics.Color里面定义的常量,或是用Color.rgb(int, int, int) |
ForegroundColorSpan(int color) | 前景着色,也就是字的着色,参数与背景着色一致 |
TypefaceSpan(String family) | 字体,参数是字体的名字比如“sans”, “sans-serif”等 |
StyleSpan(Typeface style) | 字体风格,比如粗体,斜体,参数是android.graphics.Typeface里面定义的常量,如Typeface.BOLD,Typeface.ITALIC等等。 |
StrikethroughSpan() | 如果设置了此风格,会有一条线从中间穿过所有的字,就像被划掉一样 |
UnderlineSpan() | 如果设置了此风格,字符底部会有一条下划线 |
ImageSpan(Bitmap b) | 设置图片 |
URLSpan(String url) | 设置超链接setText()后必须加上(TextView.setMovementMethod(LinkMovementMethod.getInstance()))否则超链接无效 |
对于这些Sytle span在使用的时候通常只传上面所说明的构造参数即可,不需要设置其他的属性,如果需要的话,也可以对它们设置其他的属性。
int flags | 注解 |
---|---|
Spannable.SPAN_EXCLUSIVE_EXCLUSIVE | 前后都不包括,即在指定范围的前面和后面插入新字符都不会应用新样式 |
Spannable.SPAN_EXCLUSIVE_INCLUSIVE | 前面不包括,后面包括。即仅在范围字符的后面插入新字符时会应用新样式 |
Spannable.SPAN_INCLUSIVE_EXCLUSIVE | 前面包括,后面不包括。 |
Spannable.SPAN_INCLUSIVE_INCLUSIVE | 前后都包括。 |
#
代码块语法代码,例如:
setSpan(Object what, int start, int end, int flags)
根据api 写了一个类
: 代码块:
public class VariedTextString {
private final String TAG = "VariedTextString";
private static VariedTextString instance;
private static SpannableStringBuilder s;
public VariedTextString() {
if (s == null) {
Log.i(TAG, "-------请初始化!-------");
return;
}
}
public static VariedTextString getInstance(String text) {
s = new SpannableStringBuilder(text);
if (instance == null) {
instance = new VariedTextString();
}
return instance;
}
public void setText(TextView textView) {
textView.setText(s);
//超链接必须添加--否则超链接无效
textView.setMovementMethod(LinkMovementMethod.getInstance());
}
public String getText() {
return String.valueOf(s);
}
private Matcher getLocation(String str) {
Pattern p = Pattern.compile(str);
Matcher m = p.matcher(s);
return m;
}
private boolean isPrevention(int start, int end) {
if (start < 0 || start > s.length()) {
return false;
}
if (end < 0 || end > s.length()) {
return false;
}
return true;
}
private void showLog() {
Log.i(TAG, "-------脚标越界!-------");
}
/**
* 插入数据---新数据
*
* @param start
* @param str
*/
public void setInsert(int start, String str) {
if (start >= 0 && start <= s.length()) {
s = s.insert(start, str);
} else {
showLog();
}
}
/**
* 截取数据---新数据
*
* @param start
* @param end
*/
public void setIntercept(int start, int end) {
if (isPrevention(start, end)) {
String text = getText();
String substring = text.substring(start, end);
s = new SpannableStringBuilder(substring);
} else {
showLog();
}
}
/**
* 全文--多个关键字--变色
*
* @param color
* @param keyword
*/
public void setTextColor(int color, String[] keyword) {
for (int i = 0; i < keyword.length; i++) {
Pattern p = Pattern.compile(keyword[i]);
Matcher m = p.matcher(s);
while (m.find()) {
int start = m.start();
int end = m.end();
s.setSpan(new ForegroundColorSpan(color), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
}
/**
* 全文--关键字--变色
*
* @param color
* @param keyword
*/
public void setTextColor(int color, String keyword) {
Matcher m = getLocation(keyword);
while (m.find()) {
int start = m.start();
int end = m.end();
s.setSpan(new ForegroundColorSpan(color), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
/**
* 全文--关键字--变色
*
* @param color
* @param start
* @param end
*/
public void setTextColor(int color, int start, int end) {
if (isPrevention(start, end)) {
s.setSpan(new ForegroundColorSpan(color), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
} else {
showLog();
}
}
/**
* 按比例缩放
*
* @param proportion
* @param keyword
*/
public void setZoomTypeface(float proportion, String keyword) {
Matcher m = getLocation(keyword);
while (m.find()) {
int start = m.start();
int end = m.end();
s.setSpan(new RelativeSizeSpan(proportion), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
/**
* 按比例缩放
*
* @param proportion
* @param start
* @param end
*/
public void setZoomTypeface(float proportion, int start, int end) {
if (isPrevention(start, end)) {
s.setSpan(new RelativeSizeSpan(proportion), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} else {
showLog();
}
}
/**
* 字体大小--参数是绝对数值
*
* @param size
* @param keyword
*/
public void setZoomTypeface(int size, String keyword) {
Matcher m = getLocation(keyword);
while (m.find()) {
int start = m.start();
int end = m.end();
s.setSpan(new AbsoluteSizeSpan(size), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
/**
* 字体大小--参数是绝对数值
*
* @param size
* @param start
* @param end
*/
public void setZoomTypeface(int size, int start, int end) {
if (isPrevention(start, end)) {
s.setSpan(new AbsoluteSizeSpan(size), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} else {
showLog();
}
}
/**
* 失效字符--加横杠
*
* @param keyword
*/
public void setStrikeSpan(String keyword) {
Matcher m = getLocation(keyword);
while (m.find()) {
int start = m.start();
int end = m.end();
s.setSpan(new StrikethroughSpan(), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
/**
* 失效字符--加横杠
*
* @param start
* @param end
*/
public void setStrikeSpan(int start, int end) {
if (isPrevention(start, end)) {
s.setSpan(new StrikethroughSpan(), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} else {
showLog();
}
}
/**
* 超链接样式
*
* @param keyword
* @param url
*/
public void setHttp(String keyword, String url) {
Matcher m = getLocation(keyword);
while (m.find()) {
int start = m.start();
int end = m.end();
s.setSpan(new URLSpan(url), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
/**
* 超链接样式
*
* @param url
* @param start
* @param end
*/
public void setHttp(String url, int start, int end) {
if (isPrevention(start, end)) {
s.setSpan(new URLSpan(url), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
} else {
showLog();
}
}
/**
* 超链接样式
*
* @param start
* @param end
*/
public void setHttp(int start, int end, View.OnClickListener listener) {
if (isPrevention(start, end)) {
s.setSpan(new Clickable(listener), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
} else {
showLog();
}
}
/**
* 超链接样式
*
* @param keyword
*/
public void setHttp(String keyword, View.OnClickListener listener) {
Matcher m = getLocation(keyword);
while (m.find()) {
int start = m.start();
int end = m.end();
s.setSpan(new Clickable(listener), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
/**
* 背景颜色
*
* @param color
* @param keyword
*/
public void setBackground(int color, String keyword) {
Matcher m = getLocation(keyword);
while (m.find()) {
int start = m.start();
int end = m.end();
s.setSpan(new BackgroundColorSpan(color), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
/**
* 背景颜色
*
* @param color
* @param start
* @param end
*/
public void setBackground(int color, int start, int end) {
if (isPrevention(start, end)) {
s.setSpan(new BackgroundColorSpan(color), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} else {
showLog();
}
}
/**
* 字体
* android.graphics.Typeface.BOLD_ITALIC
*
* @param typeface
* @param keyword
*/
public void setTextTypeface(int typeface, String keyword) {
Matcher m = getLocation(keyword);
while (m.find()) {
int start = m.start();
int end = m.end();
s.setSpan(new StyleSpan(typeface), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
/**
* 字体
* android.graphics.Typeface.BOLD_ITALIC
*
* @param typeface
* @param start
* @param end
*/
public void setTextTypeface(int typeface, int start, int end) {
if (isPrevention(start, end)) {
s.setSpan(new StyleSpan(typeface), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} else {
showLog();
}
}
/**
* 下划线
*
* @param start
* @param end
*/
public void setUnderline(int start, int end) {
if (isPrevention(start, end)) {
s.setSpan(new UnderlineSpan(), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} else {
showLog();
}
}
/**
* 下划线
*
* @param keyword
*/
public void setUnderline(String keyword) {
Matcher m = getLocation(keyword);
while (m.find()) {
int start = m.start();
int end = m.end();
s.setSpan(new UnderlineSpan(), start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
/**
* 插入图片
*
* @param start
* @param end
*/
public void setImage(ImageSpan imageSpan, int start, int end) {
if (isPrevention(start, end)) {
s.setSpan(imageSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} else {
showLog();
}
}
/**
* 插入图片
*
* @param imageSpan
* @param keyword
*/
public void setImage(ImageSpan imageSpan, String keyword) {
Matcher m = getLocation(keyword);
while (m.find()) {
int start = m.start();
int end = m.end();
s.setSpan(imageSpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
}
class Clickable extends ClickableSpan implements View.OnClickListener {
private final View.OnClickListener mListener;
public Clickable(View.OnClickListener listener) {
mListener = listener;
}
@Override
public void onClick(View view) {
mListener.onClick(view);
}
}
}
MainActivity
public class MainActivity extends AppCompatActivity {
private String str = "因为目前正在做客户端,不得不做一个api出来,想了想客户端源码暂且不说,api还是公布出来吧。 注意:目前只是临时使用的api," + "路径和请求结果可能会发生变化,稳定之后会整理出完整的文档…";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView mTextView = (TextView) findViewById(R.id.textView);
VariedTextString mVaried = VariedTextString.getInstance(str);
mVaried.setIntercept(0, 20);
mVaried.setInsert(20, "---截取数据---插入数据---设置多种字体颜色---背景颜色--- ");
mVaried.setTextColor(Color.RED, 2, 7);
mVaried.setTextColor(Color.WHITE, 7, 12);
mVaried.setTextColor(Color.BLUE, 12, 17);
mVaried.setImage(new ImageSpan(this, R.mipmap.ic_launcher), 0, 2);
mVaried.setZoomTypeface((float) 1.5, "客户端");
mVaried.setHttp("客户端", new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "点击了客户端", Toast.LENGTH_LONG).show();
}
});
mVaried.setText(mTextView);
}
}
最后
以上就是英俊微笑为你收集整理的Android TextView多种字体色多种样式Android TextView多种字体色多种样式的全部内容,希望文章能够帮你解决Android TextView多种字体色多种样式Android TextView多种字体色多种样式所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复