您的位置:首页 > 移动开发 > Android开发

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);

效果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息