最近需求是textView 后面跟上 一个图片加文字,自然文字可配置。
简单,用span就可以实现,但是文字最多显示三行,多余....
经过适配和实现
直接上代码
/
/**
* 用于展示 textView后面接 图片和文字
* 用于视频页面的内容展示
* Created by wavewave on 2018/10/25.
*/
public class EllipsizeThreeTextView extends android.support.v7.widget.AppCompatTextView {
private SpannableStringBuilder spannableStringBuilder;
private Drawable drawable;
private ImageSpan imageSpan;
private MyClickableSpan clickableSpan;
private String labelTitle;
private String labelUrl;
private int length = 0;
public EllipsizeThreeTextView(Context context) {
this(context, null);
}
public EllipsizeThreeTextView(Context context, AttributeSet attrs) {
super(context, attrs);
drawable = this.getResources().getDrawable(R.drawable.icon_flexible_small);
}
/**
* 设置末尾带标签
*
* @param content
* @param labelTitle
* @param labelUrl
*/
public void setTextContent(String content, String labelTitle, String labelUrl) {
setText(content + "\t\t");
this.labelTitle = labelTitle;
this.labelUrl = labelUrl;
if (!TextUtils.isEmpty(labelTitle)) {
if (labelTitle.length() > 15) {//产品规定大于10,为了扩展 预留15个字
labelTitle = labelTitle.substring(0, 15);
}
length = labelTitle.length() + 3;//保险起见 超出后多 删3个字符
setLabelTitile("\t" + labelTitle, labelUrl);
}
}
@TargetApi(Build.VERSION_CODES.JELLY_BEAN)
@Override
protected void onDraw(Canvas canvas) {
try {
int maxLines = getMaxLines();
if (maxLines > 0 && getLayout().getLineCount() > maxLines) {
CharSequence charSequence = getText();
int lastCharDown = getLayout().getLineVisibleEnd(maxLines - 1);
if (charSequence.length() > lastCharDown) {
spannableStringBuilder = new SpannableStringBuilder();
spannableStringBuilder.append(charSequence.subSequence(0, lastCharDown - length)).append("...\t\t\t");
setText(spannableStringBuilder);
setLabelTitile(labelTitle, labelUrl);
}
}
} catch (Exception e) {
Log.e("EllipsizeTextView", e.getMessage());
}
super.onDraw(canvas);
}
private void setLabelTitile(String labelTitle, String labelUrl) {
try {
if (!TextUtils.isEmpty(labelTitle.trim())) {
if (imageSpan == null) {
imageSpan = new ImageSpan(getContext(), drawableToBitmap(drawable, labelTitle));
}
if (clickableSpan == null) {
clickableSpan = new MyClickableSpan(labelUrl, getContext());
}
if (spannableStringBuilder == null) {
if (!TextUtils.isEmpty(getText().toString())) {
spannableStringBuilder = new SpannableStringBuilder(getText().toString() + "\t");
} else {
spannableStringBuilder = new SpannableStringBuilder("\t");
}
}
if (drawable == null) {
drawable = getResources().getDrawable(R.drawable.icon_flexible_small);
}
spannableStringBuilder.setSpan(imageSpan, spannableStringBuilder.length() - 1, spannableStringBuilder.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
spannableStringBuilder.setSpan(clickableSpan, spannableStringBuilder.length() - 1, spannableStringBuilder.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
setHighlightColor(Color.parseColor("#00000000"));
append(spannableStringBuilder);
setMovementMethod(LinkMovementMethod.getInstance());
setText(spannableStringBuilder);
}
} catch (Exception e) {
JuMeiLogMng.getInstance().e("EllipsizeTextView", e.getMessage());
}
}
private Bitmap drawableToBitmap(Drawable drawable, String title) {
// 取 drawable 的长宽
int w = drawable.getIntrinsicWidth();
int h = drawable.getIntrinsicHeight();
// 取 drawable 的颜色格式
Bitmap.Config config = Bitmap.Config.ARGB_8888;
Paint paint = new Paint();
paint.setColor(Color.parseColor("#333333"));
paint.setTextSize(UIUtils.dip2px(12));
paint.setAntiAlias(true);
float length = paint.measureText(title);
// 建立对应 bitmap
Bitmap bitmap = Bitmap.createBitmap((int) (w + length + UIUtils.dip2px(8)), h + UIUtils.dip2px(6), config);
// 建立对应 bitmap 的画布
Canvas canvas = new Canvas(bitmap);
Paint mPaint = new Paint();
mPaint.setColor(Color.parseColor("#BFFFFFFF"));
mPaint.setStyle(Paint.Style.FILL);
mPaint.setStrokeWidth(5);
canvas.drawRoundRect(new RectF(0, 0, w + length + UIUtils.dip2px(6), h + UIUtils.dip2px(6)), UIUtils.dip2px(2), UIUtils.dip2px(2), mPaint);
drawable.setBounds(0, 0, w, h);
// 把 drawable 内容画到画布中
canvas.translate(UIUtils.dip2px(2), UIUtils.dip2px(3));
drawable.draw(canvas);
canvas.translate(-UIUtils.dip2px(2), -UIUtils.dip2px(3));
canvas.drawText(title, w + UIUtils.dip2px(2), h + UIUtils.dip2px(1), paint);
return bitmap;
}
}
/**
* 内容 标签
* 自定义点击 span
*/
public class MyClickableSpan extends ClickableSpan {
private String url;//跳转url
private Context context;
public MyClickableSpan(String url, Context context) {
this.url = url;
this.context = context;
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public void updateDrawState(TextPaint ds) {
ds.linkColor = Color.parseColor("#ffffff");
ds.bgColor = Color.parseColor("#ffffff");
ds.setUnderlineText(true);
}
@Override
public void onClick(View widget) {
Toast.makeText(context, "url:" + url, Toast.LENGTH_SHORT).show();
if (!TextUtils.isEmpty(url)) {//跳转url
}
}
}