SpannableStringBuilder实现图文混排
1.我的后面添加图片
ssb = new SpannableStringBuilder("我的后面添加图片: ");
ssb.setSpan(new ImageSpan(this, R.mipmap.ic_launcher), , , Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

2.我的中间添加图片
ssb = new SpannableStringBuilder("我的中 间添加图片 ");
ssb.setSpan(new ImageSpan(this, R.mipmap.ic_launcher), , , Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

3.图片点击事件的处理
ssb = new SpannableStringBuilder("图片点击事件的处理 ");
ssb.setSpan(new ImageSpan(this, R.mipmap.ic_launcher), , , Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
ssb.setSpan(new ClickableSpan() {
@Override
public void onClick(View widget) {
Toast.makeText(MainActivity.this, "图片点击事件的处理 ", Toast.LENGTH_SHORT).show();
}
}, , , Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

4.背景带圆角,可设置颜色,角度
if (position % == ) {
strShow = "300英雄" + homeDataBean.User + ":" + homeDataBean.Content;
spannable = new SpannableStringBuilder(strShow);
spannable.setSpan(new RadiusBackgroundSpan(Color.parseColor("#fdc14f"), ),
, , Spannable.SPAN_INCLUSIVE_INCLUSIVE);
} else {
strShow = "枪界" + homeDataBean.User + ":" + homeDataBean.Content;
spannable = new SpannableStringBuilder(strShow);
spannable.setSpan(new RadiusBackgroundSpan(Color.parseColor("#9885fc"), ),
, , Spannable.SPAN_INCLUSIVE_INCLUSIVE);
}
/**
* 背景带圆角,可设置颜色,角度
* Created by g on 2018/1/23.
*/
public class RadiusBackgroundSpan extends ReplacementSpan { private int mSize;
private int mColor;
private int mRadius; /**
* @param color 背景颜色
* @param radius 圆角半径
*/
public RadiusBackgroundSpan(int color, int radius) {
mColor = color;
mRadius = radius;
} @Override
public int getSize(Paint paint, CharSequence text, int start, int end, Paint.FontMetricsInt fm) {
mSize = (int) (paint.measureText(text, start, end) + * mRadius);
//mSize就是span的宽度,span有多宽,开发者可以在这里随便定义规则
//我的规则:这里text传入的是SpannableString,start,end对应setSpan方法相关参数
//可以根据传入起始截至位置获得截取文字的宽度,最后加上左右两个圆角的半径得到span宽度
return mSize;
} @Override
public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) {
int color = paint.getColor();//保存文字颜色
paint.setColor(mColor);//设置背景颜色
paint.setAntiAlias(true);// 设置画笔的锯齿效果
RectF oval = new RectF(x, y + paint.ascent(), x + mSize, y + paint.descent());
//设置文字背景矩形,x为span其实左上角相对整个TextView的x值,y为span左上角相对整个View的y值。paint.ascent()获得文字上边缘,paint.descent()获得文字下边缘
canvas.drawRoundRect(oval, mRadius, mRadius, paint);//绘制圆角矩形,第二个参数是x半径,第三个参数是y半径
paint.setColor(color);//恢复画笔的文字颜色
canvas.drawText(text, start, end, x + mRadius, y, paint);//绘制文字
}
}
6.设置图标:
if (!TextUtils.isEmpty(tagHorn)) {
int sixe = ScreenUtils.sp2px(mContext, );
EmojiconSpan imageSpan = new EmojiconSpan(mContext, R.mipmap.laba_icon,
(int) (sixe), DynamicDrawableSpan.ALIGN_BASELINE, (int) (sixe));
spannable.setSpan(imageSpan, strShow.indexOf(tagHorn), strShow.indexOf(tagHorn) + tagHorn.length(),
Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
}
public class EmojiconSpan extends DynamicDrawableSpan {
private final Context mContext;
private final int mResourceId;
private final int mSize;
private final int mTextSize;
private int mHeight;
private int mWidth;
private int mTop;
private Drawable mDrawable;
private WeakReference<Drawable> mDrawableRef;
int nment = ;
public EmojiconSpan(Context context, int resourceId, int size, int alignment, int textSize) {
super(alignment);
mContext = context;
mResourceId = resourceId;
mWidth = mHeight = mSize = size;
mTextSize = textSize;
}
public Drawable getDrawable() {
if (mDrawable == null) {
try {
mDrawable = mContext.getResources().getDrawable(mResourceId);
mHeight = mSize;
mWidth = mHeight * mDrawable.getIntrinsicWidth() / mDrawable.getIntrinsicHeight();
mTop = (mTextSize - mHeight) / ;
mDrawable.setBounds(, mTop - nment, mWidth, mTop + mHeight);
} catch (Exception e) {
LogUtils.d(e.toString());
}
}
return mDrawable;
}
@Override
public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, Paint paint) {
//super.draw(canvas, text, start, end, x, top, y, bottom, paint);
Drawable b = getCachedDrawable();
canvas.save();
int transY = bottom - b.getBounds().bottom;
if (mVerticalAlignment == ALIGN_BASELINE) {
transY = top + ((bottom - top) / ) - ((b.getBounds().bottom - b.getBounds().top) / ) - mTop;
}
canvas.translate(x, transY);
b.draw(canvas);
canvas.restore();
}
private Drawable getCachedDrawable() {
if (mDrawableRef == null || mDrawableRef.get() == null) {
mDrawableRef = new WeakReference<Drawable>(getDrawable());
}
return mDrawableRef.get();
}
}
https://blog.csdn.net/qq_33220645/article/details/53332834
SpannableStringBuilder实现图文混排的更多相关文章
- 使用android SpannableStringBuilder实现图文混排
项目开发中需要实现这种效果 多余两行,两行最后是省略号,省略号后面是下拉更多 之前用过的是Html.fromHtml去处理图文混排的,仅仅是文字后图片或者文字颜色字体什么的, 但是这里需要在最后文字的 ...
- 使用android SpannableStringBuilder实现图文混排,看到许多其他
项目开发需要达到这种效果 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZmFuY3lsb3ZlamF2YQ==/font/5a6L5L2T/fontsiz ...
- 自定义图文混排视图MyImageTextView
http://blog.csdn.net/xujunfeng000/article/details/36399339?utm_source=tuicool&utm_medium=referra ...
- TextView + Spanned实现图文混排以及图片点击交互
最近要实现图文混排的需求,webview过大,所以想到了用SpannableStringBuilder来实现. 不过参考了大量国内文章,大多数是教你如何实现图文混排,并没有提及图片点击交互的.有翻阅了 ...
- 用NSAttributedString实现简单的图文混排
iOS7以后,因为TextKit的强大,可以用NSAttributedString很方便的实现图文混排(主要是利用了NSTextAttachment). 关于Textkit的牛逼之处,可以参考objc ...
- 图文混排--CoreText的简单运用
常见的在一些微博微信中可以看见一段文字中有不同的字体,字体有不同的颜色,并且可能会有一些笑脸之类的表情,这些可以通过图文混排做到. 图文混排可以通过WebView和CoreText做到,其他还有别的方 ...
- 【转】关于FLASH中图文混排聊天框的小结
原文链接 图文混排也是FLASH里一个很古老的话题了,我们不像美国佬那样游戏里面聊天框就是聊天框,全是文字干干净净,也不像日本人发明了并且频繁地使用颜文字.不管是做论坛.做游戏,必定要实现的一点就是带 ...
- DIV+CSS 图文混排的图片居中办法
不少人为了让 Div 图文混排的图片可以居中,给 IMG 套各式各样的 SPAN.DIV.LI 等等,以便于使用 text-align来进行居中. <div>图文混排 <br> ...
- ios图文混排
图文混排的形式 1. 富文本形式 2. core Text(文字排版) 3. TextKit 4. UIWebView 一.富文本 我们可以采用attributeString来进行图文混排.例如一个文 ...
随机推荐
- vue学习笔记(九)vue-cli中的组件通信
前言 在上一篇博客vue学习笔记(八)组件校验&通信中,我们学会了vue中组件的校验和父组件向子组件传递信息以及子组件通知父组件(父子组件通信),上一篇博客也提到那是对组件内容的刚刚开始,而本 ...
- js对象的直接赋值、浅拷贝与深拷贝
最近Vue项目中写到一个业务,就是需要把对话框的表单中的数据,每次点击提交之后,就存进一个el-table表格中,待多次需要的表单数据都提交进表格之后,再将这个表格提交,实现多个表单数据的同时提交,期 ...
- mysql 中文不显示问题
MySQL的字符集支持(Character Set Support)有两个方面: 字符集(Character set)和排序方式(Collation).对于字符集的支持细化到四个层次: 服务器(ser ...
- Android触摸反馈
事件分发 当点击事件发生时,事件最先传递给Activity,Activity会首先将事件将被所属的Window进行处理,即调用 superDispatchTouchEvent() 方法.通过观察sup ...
- C语言l博客作业01
2.1 你对软件工程专业或者计算机科学与技术专业了解是怎样?(2分) 计算机科学与技术是国家一级学科,下设信息安全,软件工程,计算机软件与理论等专业,主要培养符合教育部门实际需要的计算机教学及应用管理 ...
- 小白的springboot之路(七)、事务支持
0-前言 事务管理对于企业级应用来说必不可少,用来确保数据的完整性和一致性: 1-开启事务 spring boot支持编程式事务和声明式事务,用声明式事务即可: spring boot开启事务非常简单 ...
- PAT-2019年秋季考试-甲级
7-1 Forever (20 分) #include <bits/stdc++.h> using namespace std; int N,K,m,number[10]; multima ...
- 一、Java基础篇
1.简介 Java是由Sun Microsystems公司于1995年5月推出的Java面向对象程序设计语言和Java 平台的总称.由James Gosling和同事们共同研发,并在1995年正式推出 ...
- jquery.validate的一个bug
在用jquery.validate.js做输入验证中,用到了对某个字段重复性的判断,就是在某字段的验证中使用remote进行输入时用ajax不断向后台发送请求,但是奇怪的是,在你在data:{}中用n ...
- Flink入门(三)——环境与部署
flink是一款开源的大数据流式处理框架,他可以同时批处理和流处理,具有容错性.高吞吐.低延迟等优势,本文简述flink在windows和linux中安装步骤,和示例程序的运行,包括本地调试环境,集群 ...