背景
有很多方法可以为TextView中显示的一部分文本设置样式,例如设置其前景色(这里)以及其他方式(这里)。
问题
我无法确定是否有一种方法可以在TextView的部分文本上设置矩形虚线/点线轮廓。类似于这样:
尝试过的方法
我尝试寻找这样的解决方案,并且我还尝试阅读CharacterStyle的文档。但是,我没有看到任何可用范围适用于此样式。
问题
是否有内置的解决方案,还是需要使用自定义实现?
我使用了建议的修改版本下面的,在POC上运行良好,但由于某种原因,在实际项目中,文本两侧的垂直虚线粗体显示:
以下是当前代码:
要使用的字符串
<string name="text_to_format">test   %1$s test</string>
使用代码
final String textToDash="DASHED";
String formattedStr = getString(R.string.text_to_format, textToDash+ "<bc/>");
Spanned textToShow = Html.fromHtml(formattedStr, null, new TagHandler() {
int start;
@Override
public void handleTag(final boolean opening, final String tag, Editable output, final XMLReader xmlReader) {
switch (tag) {
case "bc":
if (!opening)
start = output.length() - textToDash.length();
break;
case "html":
if (!opening)
output.setSpan(
new DrawableSpan(ResourcesCompat.getDrawable(getResources(), R.drawable.dashed_border_shape, null)),
start, start + textToDash.length(), 0);
}
}
});
textView.setText(textToShow);
DrawableSpan
public class DrawableSpan extends ReplacementSpan {
private Drawable mDrawable;
private final Rect mPadding;
public DrawableSpan(Drawable drawable) {
super();
mDrawable = drawable;
mPadding = new Rect();
mDrawable.getPadding(mPadding);
}
@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, top, x + measureText(paint, text, start, end), bottom);
mDrawable.setBounds((int) rect.left - mPadding.left, (int) rect.top - mPadding.top, (int) rect.right + mPadding.right, (int) rect.bottom + mPadding.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);
}
}
res/drawable/dashed_border_shape.xml
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<padding
android:bottom="1dp"
android:left="4dp"
android:right="4dp"
android:top="1dp"/>
<solid android:color="@android:color/transparent"/>
<stroke
android:width="2dp"
android:color="#ff474747"
android:dashGap="10px"
android:dashWidth="10px"/>
</shape>
textView 没有什么特别之处:
<TextView
android:id="@+id/..."
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:layout_marginBottom="20dp"
android:layout_marginLeft="8dp"
android:layout_marginRight="8dp"
android:layout_marginTop="30dp"
android:gravity="center_horizontal"
android:textSize="20sp"/>
我甚至为这个视图的多个父级设置了android:clipChildren="false",android:clipToPadding="false"(认为它不会绘制)。但什么也没用。
为什么会这样?我该怎么做才能解决这个问题?