解决方案1
1 - 为破折号创建一个drawable.像这样:
2 - 将其设置为文本视图的背景,它可以只是一个单词.
结果:
![在此输入图像描述](https://img.php1.cn/3cd4a/1e618/cd5/af17da15769ccb2e.jpeg)
重要提示:此解决方案仅适用于小文本,例如在游戏中显示分数或小消息.它不会适应大文本.
解决方案2
如果您需要一个适用于大文本的更复杂的解决方案,您可以使用Spannable.
1 - >创建自定义ReplacementSpan
public class DashedBorderSpan extends ReplacementSpan {
private Drawable mDrawable;
private int mPadding;
public DashedBorderSpan(Drawable drawable, int padding) {
super();
mDrawable = drawable;
mPadding = padding;
}
@Override
public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) {
RectF rect = new RectF(x - mPadding, top - mPadding, x + measureText(paint, text, start, end) + mPadding, bottom + mPadding);
mDrawable.setBounds((int) rect.left, (int)rect.top, (int)rect.right, (int)rect.bottom);
canvas.drawText(text, start, end, x, y, paint);
mDrawable.draw(canvas);
}
@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);
}
}
2 - >应用Spannable
TextView textView = (TextView) findViewById(R.id.textasd);
String hello = "Dashed!";
SpannableStringBuilder stringBuilder = new SpannableStringBuilder();
stringBuilder.append(hello);
stringBuilder.setSpan(new DrawableSpan(getDrawable(R.drawable.dashed_border_shape)),
0,
stringBuilder.length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
stringBuilder.append("not dashed... boring");
textView.setText(stringBuilder);
该解决方案适用于所有情况.这是一个更好的解决方案,虽然它更复杂.
示例
如果您想将它与占位符一起使用,请使用如下所示:
String someText = "Some Text!";
//R.string.placeholder = Hello: %s
String formatedText = String.format(getString(R.string.placeholder), someText);
SpannableStringBuilder stringBuilderPlaceHolder = new SpannableStringBuilder();
stringBuilderPlaceHolder.append(formatedText);
stringBuilderPlaceHolder.setSpan(new DashedBorderSpan(getDrawable(R.drawable.dashed_border_shape), 10),
formatedText.length() - someText.length(),
formatedText.length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textViewPlaceHolder.setText(stringBuilderPlaceHolder);
结果: ![在此输入图像描述](https://img.php1.cn/3cd4a/1eebe/cd5/02c379d60086f382.webp)
这样,跨度将仅设置在占位符上.如果你有一个更复杂的持有人使用相同的逻辑来实现你所需要的.
编辑
解决方案2存在一个小问题,但有一个解决方案.
你必须小心填充虚线边框drawable.如果在虚线边框中使用填充,则需要在使用Span的TextView中设置填充.在问题的作者提供的图像中,您可以看到上边线和下边线被切割(如果增加填充,线将完全消失),以避免在textview中使用填充.像这样:
这将解决问题=]快乐编码!
1> Leandro Borg..:
解决方案1
1 - 为破折号创建一个drawable.像这样:
2 - 将其设置为文本视图的背景,它可以只是一个单词.
结果:
![在此输入图像描述](https://img.php1.cn/3cd4a/1e618/cd5/af17da15769ccb2e.jpeg)
重要提示:此解决方案仅适用于小文本,例如在游戏中显示分数或小消息.它不会适应大文本.
解决方案2
如果您需要一个适用于大文本的更复杂的解决方案,您可以使用Spannable.
1 - >创建自定义ReplacementSpan
public class DashedBorderSpan extends ReplacementSpan {
private Drawable mDrawable;
private int mPadding;
public DashedBorderSpan(Drawable drawable, int padding) {
super();
mDrawable = drawable;
mPadding = padding;
}
@Override
public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) {
RectF rect = new RectF(x - mPadding, top - mPadding, x + measureText(paint, text, start, end) + mPadding, bottom + mPadding);
mDrawable.setBounds((int) rect.left, (int)rect.top, (int)rect.right, (int)rect.bottom);
canvas.drawText(text, start, end, x, y, paint);
mDrawable.draw(canvas);
}
@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);
}
}
2 - >应用Spannable
TextView textView = (TextView) findViewById(R.id.textasd);
String hello = "Dashed!";
SpannableStringBuilder stringBuilder = new SpannableStringBuilder();
stringBuilder.append(hello);
stringBuilder.setSpan(new DrawableSpan(getDrawable(R.drawable.dashed_border_shape)),
0,
stringBuilder.length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
stringBuilder.append("not dashed... boring");
textView.setText(stringBuilder);
该解决方案适用于所有情况.这是一个更好的解决方案,虽然它更复杂.
示例
如果您想将它与占位符一起使用,请使用如下所示:
String someText = "Some Text!";
//R.string.placeholder = Hello: %s
String formatedText = String.format(getString(R.string.placeholder), someText);
SpannableStringBuilder stringBuilderPlaceHolder = new SpannableStringBuilder();
stringBuilderPlaceHolder.append(formatedText);
stringBuilderPlaceHolder.setSpan(new DashedBorderSpan(getDrawable(R.drawable.dashed_border_shape), 10),
formatedText.length() - someText.length(),
formatedText.length(),
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textViewPlaceHolder.setText(stringBuilderPlaceHolder);
结果: ![在此输入图像描述](https://img.php1.cn/3cd4a/1eebe/cd5/02c379d60086f382.webp)
这样,跨度将仅设置在占位符上.如果你有一个更复杂的持有人使用相同的逻辑来实现你所需要的.
编辑
解决方案2存在一个小问题,但有一个解决方案.
你必须小心填充虚线边框drawable.如果在虚线边框中使用填充,则需要在使用Span的TextView中设置填充.在问题的作者提供的图像中,您可以看到上边线和下边线被切割(如果增加填充,线将完全消失),以避免在textview中使用填充.像这样:
这将解决问题=]快乐编码!