public class RoundedBackgroundSpan extends ReplacementSpan {
private int mBackgroundColor;
private int mTextColor;
private int mRadius;
private int mTextSize;
private int mPadding;
private int mTopBottomReduce;
private float mStrokeWidth;
private int mWidth;
private int mMargin;
public RoundedBackgroundSpan(int mBackgroundColor, int mRadius,
int mTextColor, int mTextSize, int mPadding,
int mTopBottomReduce, float mStrokeWidth, int mMargin) {
this.mBackgroundColor = mBackgroundColor;
this.mTextColor = mTextColor;
this.mRadius = mRadius;
this.mTextSize = mTextSize;
this.mPadding = mPadding;
this.mTopBottomReduce = mTopBottomReduce;
this.mStrokeWidth = mStrokeWidth;
this.mMargin = mMargin;
}
@Override
public int getSize(@NonNull Paint paint, CharSequence text, int start, int end,
@Nullable Paint.FontMetricsInt fm) {
float originTextSize = paint.getTextSize();
float originStokeWidth = paint.getStrokeWidth();
Paint.Style style = paint.getStyle();
paint.setTextSize(mTextSize);
if (mStrokeWidth > 0) {
paint.setStyle(Paint.Style.FILL_AND_STROKE);
paint.setStrokeWidth(mStrokeWidth);
}
mWidth = (int) (paint.measureText(text, start, end) + 2 * mPadding + 2 * mMargin);
paint.setTextSize(originTextSize);
paint.setStrokeWidth(originStokeWidth);
paint.setStyle(style);
return mWidth;
}
@Override
public void draw(@NonNull Canvas canvas, CharSequence text, int start, int end, float x,
int top, int y, int bottom, @NonNull Paint paint) {
canvas.save();
paint.setColor(mBackgroundColor);
paint.setAntiAlias(true);
RectF rectF = new RectF(x + mMargin, y + paint.ascent() + mTopBottomReduce,
x + mWidth - mMargin, y + paint.descent() - mTopBottomReduce);
canvas.drawRoundRect(rectF, mRadius, mRadius, paint);
paint.setColor(mTextColor);
paint.setTextAlign(Paint.Align.CENTER);
paint.setTextSize(mTextSize);
if (mStrokeWidth > 0) {
paint.setStyle(Paint.Style.FILL_AND_STROKE);
paint.setStrokeWidth(mStrokeWidth);
}
Paint.FontMetrics metrics = paint.getFontMetrics();
float fontTop = metrics.top;
float fontBottom = metrics.bottom;
int baselineY = (int) (rectF.centerY() - (fontTop + fontBottom) / 2);
canvas.drawText(text, start, end, rectF.centerX(), baselineY, paint);
canvas.restore();
}
}
网友评论