Android——SpannableString实现带圆角标签效果
16lz
2021-01-23
本节是对以往章节的一个复习练习,用到的知识前面已经提到过,不知道的同学请参考前几篇文章。
Android——SpannableString字体大小不一致垂直居中
今天要实现的效果图如下:
RadiusBackgroundSpan
public class RadiusBackgroundSpan extends ReplacementSpan { private int fontSize = -1; private boolean isSp = true; private int margin; private int padding; private int radius; private int textColor; private int bgColor; public RadiusBackgroundSpan(int fontSize, int margin, int radius, int textColor, int bgColor) { this.fontSize = fontSize; this.margin = margin; this.radius = radius; this.textColor = textColor; this.bgColor = bgColor; } @Override public int getSize(@NonNull Paint paint, CharSequence text, int start, int end, @Nullable Paint.FontMetricsInt fm) { Paint newPaint = getCustomTextPaint(paint); return (int) newPaint.measureText(text, start, end) + margin * 2; } @Override public void draw(@NonNull Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, @NonNull Paint paint) { Paint newPaint = getCustomTextPaint(paint); int textWidth = (int) newPaint.measureText(text, start, end); RectF rect = new RectF(); rect.top = top + margin; rect.bottom = bottom - margin; rect.left = (int) (x + margin); rect.right = rect.left + textWidth + margin; paint.setColor(bgColor); canvas.drawRoundRect(rect, radius, radius, paint); newPaint.setColor(textColor); Paint.FontMetrics fontMetrics = newPaint.getFontMetrics(); int offsetX = (int) ((rect.right - rect.left - textWidth) / 2) + margin; int offsetY = (int) ((y + fontMetrics.ascent + y + fontMetrics.descent) / 2 - (top + bottom) / 2); canvas.drawText(text, start, end, x + offsetX, y - offsetY, newPaint); } private TextPaint getCustomTextPaint(Paint srcPaint) { TextPaint textPaint = new TextPaint(srcPaint); if (fontSize != -1) { textPaint.setTextSize(isSp ? fontSize * textPaint.density : fontSize); } return textPaint; }}
MainActivity.java
private void radiusTagSpan() { String format = "哪吒之魔童降世上映新推荐"; SpannableString ss = new SpannableString(format); RadiusBackgroundSpan radiusBackgroundSpan = new RadiusBackgroundSpan(35, 10, 10, getResources().getColor(R .color.white), getResources().getColor(R.color.red)); ss.setSpan(radiusBackgroundSpan, format.length() - 3, format.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); tvImageSpan.setText(ss); }
更多相关文章
- android Edittext内容字体大小动态变化
- Android 同个TextView设置字体大小不一样
- 调整recovery界面菜单字体大小
- Android getDimensionPixelSize, 代码中设置字体大小,读xml配置。
- Android 单独控件实现不同字体大小、不同颜色
- android 根据TextView宽度 自动缩小字体大小 以适应其宽度
- android studio 更改背景和设置字体大小
- 教你如何修改Android默认字体大小和设置字体大小比例
- android 9.0 10.0 修改默认字体大小