我们在开发文字背景色时候,往往ui设计稿是背景色只是文字区域,但是系统自带的BackgroundColorSpan 无法达到这样效果,所以我们需要自定义背景色。
|
贴上自定义BackgroundColorSpan代码:
public class BackgroundSpan extends ReplacementSpan {
private int textColor;
private int bgColor;
private int radius = 0;
private int size;
private RectF oval;
private int atUserId;
private String atUserName;
public BackgroundSpan(int textColor, int bgColor) {
this(textColor, bgColor, 0);
}
public BackgroundSpan(int textColor, int bgColor, int radius) {
this.textColor = textColor;
this.bgColor = bgColor;
this.radius = radius;
}
public void setAtData(int atUserId, String atUserName) {
this.atUserId = atUserId;
this.atUserName = atUserName;
}
public int getAtUserId() {
return atUserId;
}
public void setAtUserId(int atUserId) {
this.atUserId = atUserId;
}
public String getAtUserName() {
return atUserName;
}
public void setAtUserName(String atUserName) {
this.atUserName = atUserName;
}
@Override
public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) {
size = (int) paint.measureText(text, start, end) + 2 * radius;
return size;
}
@Override
public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) {
paint.setColor(bgColor);//设置背景颜色
paint.setAntiAlias(true);// 设置画笔的锯齿效果
oval = new RectF(x, y + paint.ascent(), x + size, y + paint.descent());
//设置文字背景矩形,x为span其实左上角相对整个TextView的x值,y为span左上角相对整个View的y值。paint.ascent()获得文字上边缘,paint.descent()获得文字下边缘
canvas.drawRoundRect(oval, radius, radius, paint);//绘制圆角矩形,第二个参数是x半径,第三个参数是y半径
paint.setColor(textColor);//恢复画笔的文字颜色
canvas.drawText(text, start, end, x + radius, y, paint);//绘制文字
}
}
多行显示,一个字一个字去设置
public static void span(TextView textView,String spanText) {
SpannableString spannableString = new SpannableString(spanText + " ");
int start = 0;
for (int i = 1; i < spanText.length(); i++) {
spannableString.setSpan(new BackgroundSpan(ContextCompat.getColor(textView.getContext(), R.color.common_tran_color),ContextCompat.getColor(textView.getContext(), R.color.common_tran_color)), start, start + 1, Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
start = i;
}
textView.setText(spannableString);
}