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来进行图文混排.例如一个文 ...
 
随机推荐
- nginx常用模块(三)
			
Nginx常用模块(三) ngx_http_proxy_module模块配置(http或https协议代理) proxy_pass URL; 应用上下文:location, if in locatio ...
 - Chrom谷歌浏览器没网之最全解决办法之一
			
一开始查找百度很多方法都不行,,第一次尝试.最有希望和看着像的是:1.win+r --> 输入regedit 打开注册表2.打开目录HKEY_CURRENT_USER\Software\Micr ...
 - 使用aop加解密http接口
			
背景 最近在写一个小程序接口,由于安全性比较高,因此需要给请求参数和响应进行加密处理.如果在每个方法上都加密解密,那样代码就显得太繁琐了而且工作量会加大.所以,我们会统一进行加解密处理,一种比较传统的 ...
 - CentOS 7 安装 bind 服务 实现内网DNS
			
目录 安装 配置 服务管理 测试 安装 废话不多说,直接安装 yum install -y bind bind-utils 配置 [root@jenkins named]# rpm -ql bind ...
 - PHP后端代码生成微信小程序带参数的二维码保存成jpg图片上传到服务器getwxacodeunlimit
			
老板最近有点飘了,他要在PC端的网站放一个微信小程序的二维码,并且扫描这个二维码以后要跳到小程序对应的房源详情页. 这是微信官方给出的文档,连接地址:https://developers.weixin ...
 - jquery树形结构
			
<div class="tree_content"> <div class="tree_node"> <div class=&qu ...
 - 第九次作业——DFA最小化,语法分析初步
			
老师:MissDu 提交作业 1.将DFA最小化:教材P65 第9题 答: 2.构造以下文法相应的最小的DFA S→ 0A|1B A→ 1S|1 B→0S|0 3.自上而下语法分析,回溯产生的原因是 ...
 - 关于非阻塞I/O、多路复用、epoll的杂谈
			
本文主要是想解答一下这样几个问题: - 什么是非阻塞I/O - 非阻塞I/O和异步I/O的区别 - epoll的工作原理 文件描述符 文件描述符在本文有多次出现,难免有的朋友不太熟悉,有必要简单说明一 ...
 - 链接脚本(Linker Script)用法解析(二) clear_table & copy_table
			
可执行文件中的.bss段和.data段分别存放未赋初值的全局变量和已赋初值的全局变量,两者的特点分别为: (1).bss段:①无初值,所以不占ROM空间:②运行时存储于RAM:③默认初值为0 (2). ...
 - [TimLinux] Python 函数(2)
			
1. 作用 最大化的代码重用:建设复制.粘贴 最小化的代码冗余:减少重复代码 流程分解:将做一件事情分解为相应的步骤,不同步骤封装在不同的函数中. 2. 定义 def 函数名(可选的参数列表): 函数 ...