一:若是给同一行文字添加 标签,并且换行的文字是在标签正下面,如图所示:
解决方案,使用:ImageSpan 参考地址
自定义 ImageSpan,方便使其居中展示
public class CenterImageSpan extends ImageSpan {
public CenterImageSpan(Drawable drawable) {
super(drawable);
}
public CenterImageSpan(Bitmap bitmap) {
super(bitmap);
}
@Override
public void draw(@NonNull Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom,
@NonNull Paint paint) {
Drawable b = getDrawable();
Paint.FontMetricsInt fm = paint.getFontMetricsInt();
int transY = (y + fm.descent + y + fm.ascent) / 2 - b.getBounds().bottom / 2;//计算y方向的位移
canvas.save();
canvas.translate(x, transY);//绘制图片位移一段距离
b.draw(canvas);
canvas.restore();
}
}
代码中具体使用:
/**
*
* @param context
* @param imgBitmaps 图片列表
* @param content 文本内容
* @param width 图片宽度
* @param height 图片高度
* @param isStart 是否是添加在头部
*/
public void setTagImageList(Context context, List<Bitmap> imgBitmaps, String content, int width, int height,boolean isStart) {
if(imgBitmaps==null){
return;
}
//文本和 图片的总 builder
SpannableStringBuilder builderAll = new SpannableStringBuilder();
// 纯放 图片的builder
SpannableStringBuilder builderImages = new SpannableStringBuilder();
for (int i = 0; i <imgBitmaps.size(); i++) {
//创建一个 占位符的 builder,,占位符看你怎么使用,设置1个也行,设置多个也行。若是需要有间隙。那就多放个空格,不去替换
SpannableStringBuilder builderImage = new SpannableStringBuilder("*");
Bitmap bitmap = imgBitmaps.get(i);
Drawable drawable = new BitmapDrawable(getResources(),bitmap);
drawable.setBounds(0, 0, dp2px(context, width), dp2px(context, height));
//创建 span
CenterImageSpan span = new CenterImageSpan(drawable);
//添加span
builderImage.setSpan(span, 0, builderImage.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
builderImages.append(builderImage);
}
//判断是添加尾部。还是头部
if(isStart){
builderAll.append(builderImages)
.append(content);
}else {
builderAll.append(content)
.append(builderImages);
}
setText(builderAll);
setGravity(mGravity);
}
具体效果如上图所示,
待改进,1:bitmap集合,其实需要优化的,要把当前图片大小限制跟在一块,
2:设置是否需要有空格占位符。不能那么挤在一块不是
都比较简单去改进,只是提供下思路