前言
遇到一个这个需求就是在文字的末尾添加图片,其实本来也挺常规的,通常可以这样去实现
复文本的方式
String html = testUrl + " <img src='%1$s'>";
html = String.format(html, R.drawable.white_copy);
pay_address.setText(Html.fromHtml(html, new Html.ImageGetter() {
@Override
public Drawable getDrawable(String source) {
Integer id = Integer.valueOf(source);
Drawable drawable = getResources().getDrawable(id);
drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());
return drawable;
}
}, null));
通过SpannableString
pay_address.post(new Runnable() {
@Override
public void run() {
SpannableString spannableString = new SpannableString(testUrl);
VerticalImageSpan imageSpan = new VerticalImageSpan(getContext(),R.drawable.white_copy);
spannableString.setSpan(imageSpan, testUrl.length() - 1, testUrl.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
//pay_address.setText(spannableString);
pay_address.setAdaptiveText(spannableString);
}
});
但是不知道大家注意到没我的后面的地址是数字和字母混合的处理起来发现textview会莫名其秒的换行如下
我设置的宽度是足够的,但是不知道TextView的绘制原理是什么居然自动换行了。
大概看了下SpannableString的绘制主要是使用DynamicLayout里面的方法来计算行数。
解决方案
问题主要是文本换行并没有按照我们期望的样子进行,而是换行之后后面还留了一大半空白。后面发现如果字符串中包含了空格的话,就会自动以空格的位置进行换行。所以解决思路就是按照TextView的宽度,计算每一行能够容纳的字符个数,在每一行的最后插入一个空格,就能解决换行凌乱了。
//先设置原始文本
text.setText(string);
//使用post方法,在TextView完成绘制流程后在消息队列中被调用
text.post(new Runnable() {
@Override
public void run() {
//获取第一行的宽度
float lineWidth = text.getLayout().getLineWidth(0);
//获取第一行最后一个字符的下标
int lineEnd = text.getLayout().getLineEnd(0);
//计算每个字符占的宽度
float widthPerChar = lineWidth / (lineEnd + 1);
//计算TextView一行能够放下多少个字符
int numberPerLine = (int) Math.floor(text.getWidth() / widthPerChar);
//在原始字符串中插入一个空格,插入的位置为numberPerLine - 1
StringBuilder stringBuilder = new StringBuilder(string).insert(numberPerLine - 1, " ");
//SpannableString的构建
SpannableString spannableString = new SpannableString(stringBuilder.toString() + " ");
Drawable drawable = getResources().getDrawable(R.mipmap.copy);
drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
ImageSpan imageSpan = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE);
spannableString.setSpan(imageSpan, spannableString.length() - 1, spannableString.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
text.setText(spannableString);
}
});
完美解决