Android 带背景的SpannableStringBulder
2016-11-04 17:08
274 查看
package com.test.android.widget.live.chat.spannable_event; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.drawable.Drawable; import android.graphics.drawable.GradientDrawable; import android.text.style.ImageSpan; import com.test.android.framework.utils.DisplayUtils; /** * 可以用drawable作为文字背景的span * * Created by Alex on 2016/10/21. */ public class TagImageSpan extends ImageSpan { public int expandWidth = 0; //设置之后可能会出现显示不全的问题,可通过TextView的 padding解决 public int expandHeight = 0;//设置之后可能会出现显示不全的问题,可通过TextView的 padding解决 private int mExtraHight = DisplayUtils.dp2px(3); private int mTextColor; public TagImageSpan(Drawable drawable, int textColor, int expandWidth, int expandHeight) { super(drawable); this.expandWidth = expandWidth; this.expandHeight = expandHeight; mTextColor = textColor; } @Override public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) { /*绘制背景*/ // 文字高度 int txtHight = getHeight(paint); // 文字上边距,计算这个距离是文字是否在背景垂直居中的关键,fm.ascent 文字基线Y轴方向上部分空间距离 Paint.FontMetrics fm = paint.getFontMetrics(); int txtTop = y + (int) Math.ceil(fm.ascent) - mExtraHight / 2; // 背景图的宽度 int width = getWidth(text, start, end, paint); // 背景图的高度 int hight = txtHight + mExtraHight; // 背景在画布中的位置 Drawable drawable = getDrawable(); drawable.setBounds(0, 0, width , hight); canvas.save(); // 背景Y轴方向偏移 int transY = txtTop; canvas.translate(x, transY); drawable.draw(canvas); canvas.restore(); /*绘制文字颜色*/ paint.setColor(mTextColor); canvas.drawText(text.subSequence(start, end).toString(), x, y, paint); } @Override public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) { return getWidth(text, start, end, paint); } /** * 计算span的宽度 * * @param text * @param start * @param end * @param paint * @return */ private int getWidth(CharSequence text, int start, int end, Paint paint) { return Math.round(paint.measureText(text, start, end)) + expandWidth; } /** * 计算span的高度 * * @param paint * @return */ private int getHeight(Paint paint) { Paint.FontMetrics fm = paint.getFontMetrics(); return (int) Math.ceil(fm.descent - fm.ascent) + expandHeight; } /** * 生成shape 可以通过xml实现 * * @return */ private static GradientDrawable getShape() { GradientDrawable drawable = new GradientDrawable(); drawable.setCornerRadius(10); drawable.setColor(Color.parseColor("#d8d8d8")); drawable.setStroke(1, Color.parseColor("#b2b2b2")); return drawable; } }
用法实例:
SpannableStringBuilder userType = new SpannableStringBuilder();
SpannableString sp = new SpannableString("chhh");
// 进场称号背景图
int drawableResId = R.drawable.bg_lemon;
// 进场称号文字颜色
int textColor = R.color.enter_room_name_lemon_color;
Drawable drawable = BaseApplication.getApplication().getResources().getDrawable(drawableResId);
Object span = new TagImageSpan(drawable, BaseApplication.getApplication().getResource().getColo(textColor), 0, 0);
sp.setSpan(span, 0, sp.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
userType.append(sp);
效果:
相关文章推荐
- android之spannableStringBuilder
- android SpannableString使用详解
- 【Android开发日记】之基础篇(一)——TextView+SpannableStringBuilder
- Android - SpannableString或SpannableStringBuilder以及string.xml文件中的整型和string型代替
- 输入金额,SpannableStringBuilder,Dialog无主题和透明背景的使用
- android ---spannableStringBuilder
- Android spannableStringBuilder使用
- android - SpannableString或SpannableStringBuilder以及string.xml文件中的整型和string型代替
- android - SpannableString或SpannableStringBuilder以及string.xml文件中的整型和string型代替
- Android#SpannableString
- android ---spannableStringBuilder
- Android SpannableStringBuilder设置颜色的问题
- Android用SpannableString设置字体
- android - SpannableString或SpannableStringBuilder以及string.xml文件中的整型和string型代替
- android - SpannableString或SpannableStringBuilder以及string.xml文件中的整型和string型代替
- android - SpannableString或SpannableStringBuilder以及string.xml文件中的整型和string型代替
- Android图文拼接(SpannableStringBuilder)实现折行效果
- android SpannableString使用详解
- Android利用SpannableStringBuilder设置TextView中部分文字的颜色...
- Android_SpannableString与SpannableStringBuilder