Android 实现在文字末尾添加图片

前言

在这里插入图片描述遇到一个这个需求就是在文字的末尾添加图片,其实本来也挺常规的,通常可以这样去实现

复文本的方式
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);
 }
});

完美解决

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值