一、方法介绍
有些情况下无法使用或是不想使用Kotlin时,可以使用下面的封装类比较简单易用。这个工具类是我在网上找的,经过简单的修改,增加了一些功能。
getBuilder : 获取建造者
setFlag : 设置标识
setTextSize : 设置字体大小
setForegroundColor: 设置前景色
setBackgroundColor: 设置背景色
setQuoteColor : 设置引用线的颜色
setLeadingMargin : 设置缩进
setBullet : 设置列表标记
setProportion : 设置字体比例
setXProportion : 设置字体横向比例
setStrikethrough : 设置删除线
setUnderline : 设置下划线
setSuperscript : 设置上标
setSubscript : 设置下标
setBold : 设置粗体
setItalic : 设置斜体
setBoldItalic : 设置粗斜体
setFontFamily : 设置字体
setAlign : 设置对齐
setBitmap : 设置图片
setDrawable : 设置图片
setUri : 设置图片
setResourceId : 设置图片
setClickSpan : 设置点击事件
setUrl : 设置超链接
setBlur : 设置模糊
append : 追加样式字符串
build : 创建样式字符串
二、使用介绍
2.1 初始化
有两种方式,使用哪个都可以,最终调用build方法,获得spannableStringBuilder对象。
SpannableStringBuilder ssb = new SsbUtils.Builder(this, "src").setItalic().build();
SpannableStringBuilder ssb1 = SsbUtils.getBuilder(this, src1).setBold().build();
2.2 具体使用,效果图就不放了
-
设置整个控件文字加粗
//设置整个textview加粗 String src1 = "设置整个textview加粗"; SpannableStringBuilder ssb1 = SsbUtils.getBuilder(this, src1).setBold().build(); tvOne.setText(ssb1);
-
设置部分文字加粗
String src2 = "设置"; SpannableStringBuilder ssb2 = SsbUtils.getBuilder(this, src2) .append("部分").setBold() .append("文字加粗").build(); tvOne2.setText(ssb2);
-
设置部分文字加粗 + 删除线
SpannableStringBuilder ssb3 = SsbUtils.getBuilder(this, "设置") .append("部分").setBold().setStrikethrough() .append("文字加粗 + 删除线").build(); tvOne3.setText(ssb3);
-
设置多个部分文字不同的效果
SpannableStringBuilder ssb4 = SsbUtils.getBuilder(this, "设置多个") .append("加粗倾斜").setBoldItalic() .append("加删除线变色").setStrikethrough().setForegroundColor(R.color.teal_700) .build(); tvOne4.setText(ssb4);
三、工具类
public class SsbUtils {
private SsbUtils() {
}
/**
* 获取建造者
*
* @return {@link Builder}
*/
public static Builder getBuilder(Context context, @NotNull CharSequence text) {
return new Builder(context, text);
}
public static class Builder {
private int defaultValue = 0x12000000;
private CharSequence text;
private Context context;
private int flag;
@ColorRes
private int foregroundColor;
@ColorRes
private int backgroundColor;
@ColorRes
private int quoteColor;
private boolean isLeadingMargin;
private int first;
private int rest;
private boolean isBullet;
private int gapWidth;
private int bulletColor;
private float proportion;
private float xProportion;
private boolean isStrikethrough;
private boolean isUnderline;
private boolean isSuperscript;
private boolean isSubscript;
private boolean isBold;
private boolean isItalic;
private boolean isBoldItalic;
private String fontFamily;
private Alignment align;
private boolean imageIsBitmap;
private Bitmap bitmap;
private boolean imageIsDrawable;
private Drawable drawable;
private boolean imageIsUri;
private Uri uri;
private boolean imageIsResourceId;
@DrawableRes
private int resourceId;
private ClickableSpan clickSpan;
private String url;
private boolean isBlur;
private float radius;
private Blur style;
@DimenRes
private int textSize;
private SpannableStringBuilder mBuilder;
public Builder(Context context, @NotNull CharSequence text) {
this.text = text;
this.context = context;
flag = Spanned.SPAN_EXCLUSIVE_EXCLUSIVE;
foregroundColor = defaultValue;
backgroundColor = defaultValue;
quoteColor = defaultValue;
textSize = defaultValue;
proportion = -1;
xProportion = -1;
mBuilder = new SpannableStringBuilder();
}
/**
* 设置标识
*
* @param flag {@link Spanned#SPAN_INCLUSIVE_EXCLUSIVE}
*
*
* {@link Spanned#SPAN_INCLUSIVE_INCLUSIVE}
*
*
* {@link Spanned#SPAN_EXCLUSIVE_EXCLUSIVE}
*
*
* {@link Spanned#SPAN_EXCLUSIVE_INCLUSIVE}
* @return {@link Builder}
*/
public Builder setFlag(int flag) {
this.flag = flag;
return this;
}
/**设置字体大小
* @param textSize
* @return
*/
public Builder setTextSize(@DimenRes int textSize) {
this.textSize = textSize;
return this;
}
/**
* 设置前景色
*
* @param color 前景色
* @return {@link Builder}
*/
public Builder setForegroundColor(@ColorRes int color) {
this.foregroundColor = color;
return this;
}
/**
* 设置背景色
*
* @param color 背景色
* @return {@link Builder}
*/
public Builder setBackgroundColor(@ColorRes int color) {
this.backgroundColor = color;
return this;
}
/**
* 设置引用线的颜色
*
* @param color 引用线的颜色
* @return {@link Builder}
*/
public Builder setQuoteColor(@ColorRes int color) {
this.quoteColor = color;
return this;
}
/**
* 设置缩进
*
* @param first 首行缩进
* @param rest 剩余行缩进
* @return {@link Builder}
*/
public Builder setLeadingMargin(int first, int rest) {
this.first = first;
this.rest = rest;
isLeadingMargin = true;
return this;
}
/**
* 设置列表标记
*
* @param gapWidth 列表标记和文字间距离
* @param color 列表标记的颜色
* @return {@link Builder}
*/
public Builder setBullet(int gapWidth, int color) {
this.gapWidth = gapWidth;
bulletColor = color;
isBullet = true;
return this;
}
/**
* 设置字体比例
*
* @param proportion 比例
* @return {@link Builder}
*/
public Builder setProportion(float proportion) {
this.proportion = proportion;
return this;
}
/**
* 设置字体横向比例
*
* @param proportion 比例
* @return {@link Builder}
*/
public Builder setXProportion(float proportion) {
this.xProportion = proportion;
return this;
}
/**
* 设置删除线
*
* @return {@link Builder}
*/
public Builder setStrikethrough() {
this.isStrikethrough = true;
return this;
}
/**
* 设置下划线
*
* @return {@link Builder}
*/
public Builder setUnderline() {
this.isUnderline = true;
return this;
}
/**
* 设置上标
*
* @return {@link Builder}
*/
public Builder setSuperscript() {
this.isSuperscript = true;
return this;
}
/**
* 设置下标
*
* @return {@link Builder}
*/
public Builder setSubscript() {
this.isSubscript = true;
return this;
}
/**
* 设置粗体
*
* @return {@link Builder}
*/
public Builder setBold() {
isBold = true;
return this;
}
/**
* 设置斜体
*
* @return {@link Builder}
*/
public Builder setItalic() {
isItalic = true;
return this;
}
/**
* 设置粗斜体
*
* @return {@link Builder}
*/
public Builder setBoldItalic() {
isBoldItalic = true;
return this;
}
/**
* 设置字体
*
* @param fontFamily 字体
*
*
*
* monospace
*
*
* serif
*
*
* sans-serif
* @return {@link Builder}
*/
public Builder setFontFamily(@NotNull String fontFamily) {
this.fontFamily = fontFamily;
return this;
}
/**
* 设置对齐
*
*
*
* {@link Alignment#ALIGN_NORMAL}正常
*
*
* {@link Alignment#ALIGN_OPPOSITE}相反
*
*
* {@link Alignment#ALIGN_CENTER}居中
*
* @return {@link Builder}
*/
public Builder setAlign(@NotNull Alignment align) {
this.align = align;
return this;
}
/**
* 设置图片
*
* @param bitmap 图片位图
* @return {@link Builder}
*/
public Builder setBitmap(@NotNull Bitmap bitmap) {
this.bitmap = bitmap;
imageIsBitmap = true;
return this;
}
/**
* 设置图片
*
* @param drawable 图片资源
* @return {@link Builder}
*/
public Builder setDrawable(@NotNull Drawable drawable) {
this.drawable = drawable;
imageIsDrawable = true;
return this;
}
/**
* 设置图片
*
* @param uri 图片uri
* @return {@link Builder}
*/
public Builder setUri(@NotNull Uri uri) {
this.uri = uri;
imageIsUri = true;
return this;
}
/**
* 设置图片
*
* @param resourceId 图片资源id
* @return {@link Builder}
*/
public Builder setResourceId(@DrawableRes int resourceId) {
this.resourceId = resourceId;
imageIsResourceId = true;
return this;
}
/**
* 设置点击事件
*
* 需添加view.setMovementMethod(LinkMovementMethod.getInstance())
*
* @param clickSpan 点击事件
* @return {@link Builder}
*/
public Builder setClickSpan(@NotNull ClickableSpan clickSpan) {
this.clickSpan = clickSpan;
return this;
}
/**
* 设置超链接
*
* 需添加view.setMovementMethod(LinkMovementMethod.getInstance())
*
* @param url 超链接
* @return {@link Builder}
*/
public Builder setUrl(@NotNull String url) {
this.url = url;
return this;
}
/**
* 设置模糊
*
* 尚存bug,其他地方存在相同的字体的话,相同字体出现在之前的话那么就不会模糊,出现在之后的话那会一起模糊
*
*
*
* 推荐还是把所有字体都模糊这样使用
*
* @param radius 模糊半径(需大于0)
* @param style 模糊样式
*
*
* {@link Blur#NORMAL}
*
*
* {@link Blur#SOLID}
*
*
* {@link Blur#OUTER}
*
*
* {@link Blur#INNER}
* @return {@link Builder}
*/
public Builder setBlur(float radius, Blur style) {
this.radius = radius;
this.style = style;
this.isBlur = true;
return this;
}
/**
* 追加样式字符串
*
* @param text 样式字符串文本
* @return {@link Builder}
*/
public Builder append(@NotNull CharSequence text) {
setSpan();
this.text = text;
return this;
}
/**
* 创建样式字符串
*
* @return 样式字符串
*/
public SpannableStringBuilder build() {
setSpan();
return mBuilder;
}
/**
* 设置样式
*/
private void setSpan() {
int start = mBuilder.length();
mBuilder.append(this.text);
int end = mBuilder.length();
if (textSize != defaultValue && context != null) {
int ts = context.getResources().getDimensionPixelOffset(textSize);
mBuilder.setSpan(new AbsoluteSizeSpan(ts), start, end, flag);
textSize = defaultValue;
}
if (foregroundColor != defaultValue && context != null) {
mBuilder.setSpan(new ForegroundColorSpan(ContextCompat.getColor(context, foregroundColor)), start, end, flag);
foregroundColor = defaultValue;
}
if (backgroundColor != defaultValue && context != null) {
mBuilder.setSpan(new BackgroundColorSpan(ContextCompat.getColor(context, backgroundColor)), start, end, flag);
backgroundColor = defaultValue;
}
if (isLeadingMargin) {
mBuilder.setSpan(new LeadingMarginSpan.Standard(first, rest), start, end, flag);
isLeadingMargin = false;
}
if (quoteColor != defaultValue && context != null) {
mBuilder.setSpan(new QuoteSpan(ContextCompat.getColor(context, quoteColor)), start, end, 0);
quoteColor = defaultValue;
}
if (isBullet) {
mBuilder.setSpan(new BulletSpan(gapWidth, bulletColor), start, end, 0);
isBullet = false;
}
if (proportion != -1) {
mBuilder.setSpan(new RelativeSizeSpan(proportion), start, end, flag);
proportion = -1;
}
if (xProportion != -1) {
mBuilder.setSpan(new ScaleXSpan(xProportion), start, end, flag);
xProportion = -1;
}
if (isStrikethrough) {
mBuilder.setSpan(new StrikethroughSpan(), start, end, flag);
isStrikethrough = false;
}
if (isUnderline) {
mBuilder.setSpan(new UnderlineSpan(), start, end, flag);
isUnderline = false;
}
if (isSuperscript) {
mBuilder.setSpan(new SuperscriptSpan(), start, end, flag);
isSuperscript = false;
}
if (isSubscript) {
mBuilder.setSpan(new SubscriptSpan(), start, end, flag);
isSubscript = false;
}
if (isBold) {
mBuilder.setSpan(new StyleSpan(Typeface.BOLD), start, end, flag);
isBold = false;
}
if (isItalic) {
mBuilder.setSpan(new StyleSpan(Typeface.ITALIC), start, end, flag);
isItalic = false;
}
if (isBoldItalic) {
mBuilder.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), start, end, flag);
isBoldItalic = false;
}
if (fontFamily != null) {
mBuilder.setSpan(new TypefaceSpan(fontFamily), start, end, flag);
fontFamily = null;
}
if (align != null) {
mBuilder.setSpan(new AlignmentSpan.Standard(align), start, end, flag);
align = null;
}
if (imageIsBitmap || imageIsDrawable || imageIsUri || imageIsResourceId) {
if (context != null) {
if (imageIsBitmap) {
mBuilder.setSpan(new ImageSpan(context, bitmap), start, end, flag);
bitmap = null;
imageIsBitmap = false;
} else if (imageIsDrawable) {
mBuilder.setSpan(new ImageSpan(drawable), start, end, flag);
drawable = null;
imageIsDrawable = false;
} else if (imageIsUri) {
mBuilder.setSpan(new ImageSpan(context, uri), start, end, flag);
uri = null;
imageIsUri = false;
} else {
mBuilder.setSpan(new ImageSpan(context, resourceId), start, end, flag);
resourceId = 0;
imageIsResourceId = false;
}
}
}
if (clickSpan != null) {
mBuilder.setSpan(clickSpan, start, end, flag);
clickSpan = null;
}
if (url != null) {
mBuilder.setSpan(new URLSpan(url), start, end, flag);
url = null;
}
if (isBlur) {
mBuilder.setSpan(new MaskFilterSpan(new BlurMaskFilter(radius, style)), start, end, flag);
isBlur = false;
}
flag = Spanned.SPAN_EXCLUSIVE_EXCLUSIVE;
}
}
}
这个是为方便Java开发使用的,还有为了方便Kotlin开发封装的SpannableStringBuilder,有兴趣可以去这个地址查看。