android 缴纳押金界面,Android – 使用ReplacementSpan为SpannableStringBuilder添加保证金

我不久前遇到过类似的问题,这是我提出的解决方案:

在xml中托管TextView:

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:paddingTop="18dp"

android:paddingBottom="18dp"

android:paddingLeft="8dp"

android:paddingRight="8dp"

android:gravity="fill"

android:textSize="12sp"

android:lineSpacingExtra="10sp"

android:textStyle="bold"

android:text="@{viewModel.renderedTagBadges}">

ReplacementSpan的自定义版本

public class TagBadgeSpannable extends ReplacementSpan implements LineHeightSpan {

private static int CORNER_RADIUS = 30;

private final int textColor;

private final int backgroundColor;

private final int lineHeight;

public TagBadgeSpannable(int lineHeight, int textColor, int backgroundColor) {

super();

this.textColor = textColor;

this.backgroundColor = backgroundColor;

this.lineHeight = lineHeight;

}

@Override

public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) {

final float textSize = paint.getTextSize();

final float textLength = x + measureText(paint, text, start, end);

final float badgeHeight = textSize * 2.25f;

final float textOffsetVertical = textSize * 1.45f;

RectF badge = new RectF(x, y, textLength, y + badgeHeight);

paint.setColor(backgroundColor);

canvas.drawRoundRect(badge, CORNER_RADIUS, CORNER_RADIUS, paint);

paint.setColor(textColor);

canvas.drawText(text, start, end, x, y + textOffsetVertical, paint);

}

@Override

public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) {

return Math.round(paint.measureText(text, start, end));

}

private float measureText(Paint paint, CharSequence text, int start, int end) {

return paint.measureText(text, start, end);

}

@Override

public void chooseHeight(CharSequence charSequence, int i, int i1, int i2, int i3, Paint.FontMetricsInt fontMetricsInt) {

fontMetricsInt.bottom += lineHeight;

fontMetricsInt.descent += lineHeight;

}

}

最后是一个创建Spannable的构建器

public class AndroidTagBadgeBuilder implements TagBadgeBuilder {

private final SpannableStringBuilder stringBuilder;

private final String textColor;

private final int lineHeight;

public AndroidTagBadgeBuilder(SpannableStringBuilder stringBuilder, int lineHeight, String textColor) {

this.stringBuilder = stringBuilder;

this.lineHeight = lineHeight;

this.textColor = textColor;

}

@Override

public void appendTag(String tagName, String badgeColor) {

final String nbspSpacing = "\u202F\u202F"; // none-breaking spaces

String badgeText = nbspSpacing + tagName + nbspSpacing;

stringBuilder.append(badgeText);

stringBuilder.setSpan(

new TagBadgeSpannable(lineHeight, Color.parseColor(textColor), Color.parseColor(badgeColor)),

stringBuilder.length() - badgeText.length(),

stringBuilder.length()- badgeText.length() + badgeText.length(),

Spanned.SPAN_EXCLUSIVE_EXCLUSIVE

);

stringBuilder.append(" ");

}

@Override

public CharSequence getTags() {

return stringBuilder;

}

@Override

public void clear() {

stringBuilder.clear();

stringBuilder.clearSpans();

}

}

结果将如下所示:

MjnSw.png

根据自己的喜好调整TagBadgeSpannable中的度量.

我已经使用此代码上传了一个非常小的示例项目到github,所以请随时查看.

注意:该示例使用Android Databinding并编写MVVM样式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值