多行TextView后插入图片

一行TextView图文混排 很容易想到darwableRight/Left/Top/Botoom,多行混排且要求,紧跟最后一行文字的后方,实现起来就需要使用 Span,但是PM要求 图片直招 的标签 不能单独占一行,需要拽下来一个字符作伴

按照上述代码修改之后 的效果如下:

先上效果图 再看代码 :

只用Span直接效果:

修改之后的效果: 

 

public class LabelUtils {
    /**
     * @param text      标签内容
     * @param textColor 标签颜色
     * @return
     */
    public static Drawable fromText(String text, String textColor) {
        int DP1 = DensityUtil.dip2px(1);
        Paint paint = new Paint();
        paint.setTextSize(DensityUtil.sp2px(11));
        paint.setTextAlign(Paint.Align.LEFT);
        paint.setAntiAlias(true);
        int color = Color.parseColor("#00B38A");
        if (!TextUtils.isEmpty(textColor) && textColor.startsWith("#")) {
            color = Color.parseColor(textColor);
        }
        paint.setColor(color);

        Paint.FontMetricsInt fm = paint.getFontMetricsInt();
        //Bitmap的宽和高
        int width = (int) paint.measureText(text) + 10 * DP1;
        int height = fm.descent - fm.ascent + 4 * DP1;

        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);

        Canvas canvas = new Canvas(bitmap);
        //写字
        canvas.drawText(text, 5 * DP1, 2 * DP1 + fm.leading - fm.ascent, paint);
        //画方框
        RectF rect = new RectF(0, 0, width - DP1, height - DP1);
        paint.setStrokeWidth(DensityUtil.dip2px(0.5f));
        paint.setAntiAlias(true);
        paint.setStyle(Paint.Style.STROKE);
        //圆角
        canvas.drawRoundRect(rect, 2 * DP1, 2 * DP1, paint);
        canvas.save();

        return new BitmapDrawable(Resources.getSystem(), bitmap);
    }

    public static final String SPACE = "\t\t.";

    public static SpannableStringBuilder getSpanWithLabel(String src, Drawable drawable) {
        SpannableStringBuilder spannableString = new SpannableStringBuilder(src);
        spannableString.append(SPACE);
        ImageSpan imageSpan = new VerticalCenterImageSpan(drawable);
        spannableString.setSpan(imageSpan, spannableString.length() - 1, spannableString.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE);
        return spannableString;
    }

    /**
     * 最后一行 没显示文字 仅有图片,需要掰下来一个字符
     *
     * @param textView 显示控件
     * @param src      职位名
     * @param drawable 需要提前设置好w和h
     */
    public static void setTextDrawable(TextView textView, String src, Drawable drawable) {
        textView.setText(getSpanWithLabel(src, drawable));

        Layout layout = textView.getLayout();
        String text = textView.getText().toString();

        int lastLineIndex = Math.max(0, textView.getLineCount() - 1);
        int end = layout.getLineEnd(lastLineIndex);
        int start = layout.getLineStart(lastLineIndex);
        String line = text.substring(start, end); //最后一行的内容

        if (SPACE.contains(line)) {//最后一行 没显示文字 仅有图片,需要掰下来一个字符
            StringBuilder sb = new StringBuilder(src);
            String s = sb.insert(Math.max(0, sb.length() - 1), "\n").toString();
            textView.setText(getSpanWithLabel(s, drawable));
        }
    }

}

  其中  关于bitmap和drawable的相互转换:https://www.jianshu.com/p/d3ff021b7fec

打印 TextView每一行文字:

Layout layout = textView.getLayout();
String text = textView.getText().toString();
int start = 0;
int end;
//循环遍历打印每一行
for (int i = 0; i < textView.getLineCount(); i++) {
    end = layout.getLineEnd(i);

    String line = text.substring(start, end); //指定行的内容
    start = end;
    
    Log.d("MyTextView", "setMyText: line " + line);
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值