一行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);
}