通过SpannableString 设置ImageSpan来实现的。
如果有什么不对的地方,或者影响效率等等的。请你多多指点,谢谢!我们应该是相互学习的。
代码:
private void setTitle(String name, TextView textView) {//这里首先赋值为空字符串。是因为在切换的时候可能会出现的格式问题。 在空格最后加上全角空格。也处理了。
textView.setText("");
//12个空格(自己决定空格数量决定) 最后一个空格用的是全角的。因为有中英文所以。给圆角。避免空隙太大。
final String str =" " + name;
SpannableString style =new SpannableString(str);
//画的一个圆角图 这里是你需要画的背景图
Drawable bg = getResources().getDrawable(R.drawable.cor100_red_gradient);
style.setSpan(new ImageSpan(bg) {
@Override
public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y,
int bottom, Paint paint) {
int bgSize = dp2Px(15);
int tvSize = dp2Px(10);
String str ="自营";
paint.setTextSize(bgSize);
int bgPaintw = Math.round(paint.measureText(str));
getDrawable().setBounds(0, 0, bgPaintw, bgSize);
int bgPainth = Math.round(paint.getFontMetrics().descent - paint.getFontMetrics().ascent);
super.draw(canvas, text, start, end, x, top + (bottom - bgPainth), y, bottom - (bottom - bgPainth), paint);
paint.setColor(Color.WHITE);
paint.setTextSize(tvSize);
//文字的宽度
int tvPaintw = Math.round(paint.measureText(str));
//文字的高度
int tvPainth = Math.round(paint.getFontMetrics().descent - paint.getFontMetrics().ascent);
//文字的位置
//x+(bgPaintw-tvPaintw)/2 表示x的开始位置。 y - (bgPainth - tvPainth) / 2 表示y的开始位置。这样来处理文字剧中
//这里 文字背景是大于文字的。 要让文字居中,(需要你处理的文字背景宽度 - 文字的宽度 )再除以2。加上x就是文字x皱的起点
//(需要你处理的文字背景高度 - 文字的高度 )再除以2。加上y就是文字y皱的起点
canvas.drawText(str, x + (bgPaintw - tvPaintw) /2, y - (bgPainth - tvPainth) /2, paint);
}
}, 0, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
textView.setText(style);
textView.setMovementMethod(LinkMovementMethod.getInstance());
}
public int dp2Px(float dp) {
float scale =this.getResources().getDisplayMetrics().density;
return (int) (dp * scale +0.5f);
}
这里放2张效果图
全中文的:
![](https://img.haomeiwen.com/i12078064/78e0a600a7744e51.jpg)
中文加英文的
![](https://img.haomeiwen.com/i12078064/0ad458a32fb7c0d9.jpg)
网友评论
试着去处理图片的大小。图片最大也只会是你设置的文字的大小的高度。
int bgSize = dp2Px(15); //这个是不带背景的文字大小。
int tvSize = dp2Px(10); //这个是背景里面的文字大小
String str = "自营";
paint.setTextSize(bgSize);
int bgPaintw = Math.round(paint.measureText(str));
//主要是这里 要做的改变。 直接告诉他。图片是从0 到最底部
getDrawable().setBounds(0, 0, bgPaintw, bottom);
int bgPainth = Math.round(paint.getFontMetrics().descent - paint.getFontMetrics().ascent);
super.draw(canvas, text, start, end, x, top , y, bottom, paint);
paint.setColor(Color.WHITE);
paint.setTextSize(tvSize);
//文字的宽度
int tvPaintw = Math.round(paint.measureText(str));
//文字的高度
int tvPainth = Math.round(paint.getFontMetrics().descent - paint.getFontMetrics().ascent);
//文字的位置
//x+(bgPaintw-tvPaintw)/2 表示x的开始位置。 y - (bgPainth - tvPainth) / 2 表示y的开始位置。这样来处理文字剧中
//这里 文字背景是大于文字的。 要让文字居中,(需要你处理的文字背景宽度 - 文字的宽度 )再除以2。加上x就是文字x皱的起点
//(需要你处理的文字背景高度 - 文字的高度 )再除以2。加上y就是文字y皱的起点
canvas.drawText(str, x + (bgPaintw - tvPaintw) / 2, tvPainth+(bgPainth - tvPainth) / 2, paint);