使用android SpannableStringBuilder实现图文混排,查看更多

Android 富文本 SpannableStringBuilder 探究 今天为什么要说 SpannableStringBuilder 这个类呢 ,这还要从之前悲催的项目经历说起,原型是这样子的,我们主要看文本,其余暂时忽略当你看到图,是不是感觉很熟悉,因为他就是个服务条款跟隐私政策一样的勾选提交功能,如果不出意外的话,TextView 文本拼接,然后再添加上点击事件跳转,大功告成,但往往这时候都会出意外,这个服务条款很隐私政策是接口动态获取的,可能是一个也可能是两个,但此时我告诉你一个 TextView 即可搞定是不是很神奇?来看下本章最终的实现效果。 阅读详情

项目开发中需要实现这种效果


多余两行,两行最后是省略号,省略号后面是下拉更多

之前用过的是Html.fromHtml去处理图文混排的,仅仅是文字后图片或者文字颜色字体什么的,

但是这里需要在最后文字的省略号后面添加图片。

直接上代码吧,代码注释很多,慢慢研究

private void toggleEllipsize(final TextView tv,final String desc){
		if(desc == null){
		return;
		}
		tv.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
			
			@Override
			public void onGlobalLayout() {
				boolean isEllipsized = (tv.getTag()==null||tv.getTag().equals(false))?false:(Boolean)tv.getTag();
				if(isEllipsized){
					tv.setTag(false);
				tv.setText(desc);
				}else{
				tv.setTag(true);
				int paddingLeft = tv.getPaddingLeft();
				int paddingRight = tv.getPaddingRight();
				TextPaint paint = tv.getPaint();
				float moreText = tv.getTextSize()*3;
				float availableTextWidth = (tv.getWidth()-paddingLeft-paddingRight)*2-moreText;
				
				CharSequence ellipsizeStr = TextUtils.ellipsize(desc,paint,availableTextWidth,TextUtils.TruncateAt.END);
				if(ellipsizeStr.length()<desc.length()){
					/*String html = "<img src='game_info_lookmore'/>";
					CharSequence charSequence = Html.fromHtml(html, new ImageGetter() {

						@Override
						public Drawable getDrawable(String source) {
							Drawable drawable = getResources().getDrawable(
									getResourceId(source));
							drawable.setBounds(
									0,
									0,
									drawable.getIntrinsicWidth()
											- DensityUtil.dip2px(GridGameInfoActivity.this, 3),
									drawable.getIntrinsicHeight()
											- DensityUtil.dip2px(GridGameInfoActivity.this, 1));
							return drawable;
						}
					}, null);
					ellipsizeStr = ellipsizeStr.toString() + charSequence.toString();*/
					
					
					CharSequence temp = ellipsizeStr+".";
					SpannableStringBuilder ssb = new SpannableStringBuilder(temp);
					Drawable dd = getResources().getDrawable(R.drawable.game_info_lookmore);
					dd.setBounds(0, 0, dd.getIntrinsicWidth(), dd.getIntrinsicHeight());
					ImageSpan is = new ImageSpan(dd, ImageSpan.ALIGN_BASELINE);
					ssb.setSpan(is, temp.length()-1, temp.length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);
					
//					int yellow = getResources().getColor(R.color.red);
//					ssb.setSpan(new ForegroundColorSpan(yellow),ssb.length()-2,ssb.length(),Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
					tv.setText(ssb);
					tv.setMovementMethod(LinkMovementMethod.getInstance());
				}else{
					tv.setText(desc);
				}
				}
				if(Build.VERSION.SDK_INT>=16){
					tv.getViewTreeObserver().removeOnGlobalLayoutListener(this);
				}else{
					tv.getViewTreeObserver().removeGlobalOnLayoutListener(this);
				}
			}
		});
		}

主要是通过SpannableStringBuilder把省略的文字和最后的图片给拼接起来。也可以最后拼接的是文字,

不让...更多

转篇博客:

Android spannableStringBuilder用法整理

spannableStringBuilder 用法详解:
 SpannableString ss = new SpannableString("红色打电话斜体删除线绿色下划线图片:.");  
         //用颜色标记文本
         ss.setSpan(new ForegroundColorSpan(Color.RED), 0, 2,  
                 //setSpan时需要指定的 flag,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE(前后都不包括).
                 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
         //用超链接标记文本
         ss.setSpan(new URLSpan("tel:4155551212"), 2, 5,  
                 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
         //用样式标记文本(斜体)
         ss.setSpan(new StyleSpan(Typeface.BOLD_ITALIC), 5, 7,  
                 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
         //用删除线标记文本
         ss.setSpan(new StrikethroughSpan(), 7, 10,  
                 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
         //用下划线标记文本
         ss.setSpan(new UnderlineSpan(), 10, 16,  
                 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
         //用颜色标记
         ss.setSpan(new ForegroundColorSpan(Color.GREEN), 10, 13,  
                 Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
         //获取Drawable资源
         Drawable d = getResources().getDrawable(R.drawable.icon);  
         d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
         //创建ImageSpan
         ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE);
         //用ImageSpan替换文本
         ss.setSpan(span, 18, 19, Spannable.SPAN_INCLUSIVE_EXCLUSIVE);  
         txtInfo.setText(ss);
         txtInfo.setMovementMethod(LinkMovementMethod.getInstance()); //实现文本的滚动  
通常用于显示文字,但有时候也需要在文字中夹杂一些图片,比如QQ中就可以使用表情图片,又比如需要的文字高亮显示等等,如何在android中也做到这样呢? 
记得android中有个android.text包,这里提供了对文本的强大的处理功能。 
添加图片主要用SpannableString和ImageSpan类:
 
     Drawable drawable = getResources().getDrawable(id);  
        drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());  
        //需要处理的文本,[smile]是需要被替代的文本  
        SpannableString spannable = new SpannableString(getText().toString()+"[smile]");  
        //要让图片替代指定的文字就要用ImageSpan  
        ImageSpan span = new ImageSpan(drawable, ImageSpan.ALIGN_BASELINE);  
        //开始替换,注意第2和第3个参数表示从哪里开始替换到哪里替换结束(start和end)  
       //最后一个参数类似数学中的集合,[5,12)表示从5到12,包括5但不包括12  
        spannable.setSpan(span, getText().length(),getText().length()+"[smile]".length(), Spannable.SPAN_INCLUSIVE_EXCLUSIVE);    
        setText(spannable);  
 
将需要的文字高亮显示: 
 
 
 
public void highlight(int start,int end){  
        SpannableStringBuilder spannable=new SpannableStringBuilder(getText().toString());//用于可变字符串  
        ForegroundColorSpan span=new ForegroundColorSpan(Color.RED);  
        spannable.setSpan(span, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
        setText(spannable);  
    }  
   
加下划线: 
 
 
 
public void underline(int start,int end){  
        SpannableStringBuilder spannable=new SpannableStringBuilder(getText().toString());  
        CharacterStyle span=new UnderlineSpan();  
        spannable.setSpan(span, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
        setText(spannable);  
    }  
   
组合运用:
 
 
 
SpannableStringBuilder spannable=new SpannableStringBuilder(getText().toString());  
        CharacterStyle span_1=new StyleSpan(android.graphics.Typeface.ITALIC);  
        CharacterStyle span_2=new ForegroundColorSpan(Color.RED);  
        spannable.setSpan(span_1, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
        spannable.setSpan(span_2, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
        setText(spannable);  
   
案例:带有\n换行符的字符串都可以用此方法显示2种颜色
 
 
 
    /** 
     * 带有\n换行符的字符串都可以用此方法显示2种颜色 
     * @param text 
     * @param color1 
     * @param color2 
     * @return 
     */  
    public SpannableStringBuilder highlight(String text,int color1,int color2,int fontSize){  
        SpannableStringBuilder spannable=new SpannableStringBuilder(text);//用于可变字符串  
        CharacterStyle span_0=null,span_1=null,span_2;  
        int end=text.indexOf("\n");  
        if(end==-1){//如果没有换行符就使用第一种颜色显示  
            span_0=new ForegroundColorSpan(color1);  
            spannable.setSpan(span_0, 0, text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
        }else{  
            span_0=new ForegroundColorSpan(color1);  
            span_1=new ForegroundColorSpan(color2);  
            spannable.setSpan(span_0, 0, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
            spannable.setSpan(span_1, end+1, text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
              
            span_2=new AbsoluteSizeSpan(fontSize);//字体大小  
            spannable.setSpan(span_2, end+1, text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);  
        }  
        return spannable;  
    }


有疑问可以留言,交流讨论

Android---ImageSpan + SpannableStringBuilder 图文混排解决表情文字高度不一致排版错乱问题(设置padding 行间距依然生效) android图文混排的最常见实现方案就是使用SpannableStringBuilder ,比如我们要实现聊天框输入表情的功能就需要用到其实现。但是当我们的icon图标大于或者小于字体高度时会导致字体跟图标不能垂直居中对齐,这样UI显示就不是很友好。ImageSpan自带的DynamicDr awableSpan.ALIGN_CENTER配置会在换行,或者设置了padding等情况下失效造成错乱。 阅读详情

相关推荐

Android SpannableStringBuilder 实现testview关键字点亮操作

Android SpannableStringBuilder 实现testview关键字点亮操作

qq_68469751的博客 333

SpannableStringBuilder从简单到复杂的使用

很多 APP 都有下面的效果: 这样的效果就是用SpannableStringBuilder 实现的,下面就了解SpannableStringBuilder 的简单使用以及实现上面的效果。 SpannableString、SpannableStringBuilder与String的关系 SpannableString、SpannableStringBuilder 基本上与 St...

wuqingsen1的博客 1万+

人工势场法在自动驾驶避障中的实践与优化

本文深入探讨了人工势场法在自动驾驶避障中的核心原理与实践优化。通过解析引力与斥力模型,揭示了经典算法在局部最优和目标不可达等问题上的局限性,并重点介绍了改进斥力场函数、引入道路边界斥力及动态参数调整等关键优化策略,有效提升了该局部路径规划算法在复杂动态场景下的实用性与鲁棒性。

weixin_29208327的博客 927

Android TextView富文本SpannableStringBuilder的使用详解

在android开发过程中,做内容的时候,不仅只有字符,基本都是图文混排,升职个还会对内容中某段文字进行特殊处理,比如:字体加粗、字体变大、改变字体颜色、对某一段文字新增点击事件,等等。这些内容不可能通过一个一个view去拼接,这么复杂的SpannableStringBuilder:可生成字符串生成器,这是内容和标记都可以更改的文本类。常见的富文本修饰如:新增、删除、字体颜色、大小、背景色、图片、上标、下标、删除、点击等,接下来我们将介绍常用的一些 public SpannableStringBuilder

5886

无人机室内悬停如何稳?光流与IMU数据融合实战解析

在无GPS的室内环境中,无人机自主悬停依赖多传感器融合,其中光流与IMU是核心组合。光流传感器通过图像像素位移估算相对地面的速度,长期无漂移,但易受光照和纹理影响;IMU高频响应出色,却存在积分累积漂移。两者在频率与误差特性上天然互补,融合后可实现高精度位置估计。工程实践中,需合理选型、正确处理坐标变换与时间对齐,并通过互补滤波或扩展卡尔曼滤波将光流速度修正引入状态估计,进而支撑位置环与速度环控制。这一技术不仅解决室内定点悬停,也为视觉惯性里程计等更复杂的自主定位提供基础。本文结合真实调试案例,梳理从硬件安

weixin_33314040的博客 294

【fNIRS可视化学习1】基于NIRS-SPM进行光极可视化并计算通道坐标

设头皮上的目标点为P₀(x₀, y₀, z₀),需要在大脑皮层点集S上找到最合适的投影点P'。

Rose9614的博客 2208

使用android SpannableStringBuilder实现图文混排源码

在android开发中,我们常常需要对文字和图片进行一些排版,以提升客户体验度。要让图文混排更加友好,这个功能怎么实现呢?不妨可以尝试android SpannableStringBuilder来实现图文混排,而如果想要更多其他的效果的话,也可以进行修改调整实现。        废话不多说,直接上代码,大家自己琢磨研究吧: private voidtoggleEllipsize(final T

ydmaizi的博客 546

2024年上市公司ESG评级全解析:六大权威数据源横向对比与应用指南

本文深度解析2024年国内主流ESG评级数据源,包括华证、商道融绿、Wind、富时罗素和彭博,横向对比其覆盖范围、评分逻辑与应用侧重点。文章提供实战指南,帮助投资者与企业根据投资决策、风险管理和学术研究等不同场景,精准选择并有效应用ESG数据,实现从概念到实用分析工具的转变。

weixin_29229055的博客 312

使用android SpannableStringBuilder实现图文混排

项目开发中需要实现这种效果 多余两行,两行最后是省略号,省略号后面是下拉更多 之前用过的是Html.fromHtml去处理图文混排的,仅仅是文字后图片或者文字颜色字体什么的, 但是这里需要在最后文字的省略号后面添加图片。 直接上代码吧,代码注释很多,慢慢研究 private void toggleEllipsize(final TextView tv,final ...

dielucui7698的博客 337

从零到一:DETR模型在自定义数据集上的实战部署与调优

本文详细介绍了DETR模型在自定义数据集上的实战部署与调优过程,包括环境准备、数据转换、模型配置、训练技巧及问题排查。通过具体代码示例和实用建议,帮助开发者高效完成从零到一的DETR模型部署,特别适合目标检测领域的实践应用。

weixin_42524100的博客 464

从时序博弈到数据稳定:CS1237驱动中的信号滤波与卡尔曼实践

本文探讨了CS1237高精度ADC驱动在复杂工业环境中的信号处理挑战,重点介绍了一阶滤波与自适应卡尔曼滤波算法的实践应用。通过参数优化和动态调整策略,有效提升了数据稳定性和抗干扰能力,为嵌入式系统在噪声环境下的精密测量提供了可靠解决方案。

rnn9storyteller的博客 866

android 你所不知道的类SpannableStringBuilder的总结--实现图文混排,查看更多,下划线等等

今天无意中看到的一个类SpannableStringBuilder,查了下感觉很牛叉; 1.看下实现的效果 第一种 引用自:使用android SpannableStringBuilder实现图文混排,查看更多 第二种 实现的代码见   使用的模板 2.简单的使用模板: 引用自    http://blog.it985.com/14433.html public cla

彭思正的博客 3246

别再傻傻分不清!用R语言5分钟搞定RR、AR、OR的计算与解读(附代码)

本文通过R语言实战演示,详细讲解了RR(相对风险)、AR(绝对风险)和OR(比值比)的计算方法与科学解读。提供完整的代码示例和可视化技巧,帮助医学研究者快速掌握这些核心流行病学指标的应用与常见陷阱规避。

weixin_42526015的博客 266

android TextView查看更多(图文混排)

效果如下: 代码有很多注释,看懂应该没问题 /** * Created by sxy on 2016/11/10. */ public class TextUtils { public static void toggleEllipsize(final Context context, final TextView tv, final String desc)

小爸爸他爸的博客 1374

将MathType、zotero嵌入Word、WPS

最近也是慢慢学起了写文稿之类的内容,在写论文的时候,肯定会遇到一些数学公式的插入,如果使用wps、word等自带的插入公式,一般不符合投稿期刊的格式要求,而且不方便、不美观,故开始研究MathType 这款插入公式的工具。

2401_83617940的博客 2278

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

用 Hypothesis 属性化测试覆盖配置参数:以 Argon2 密码哈希库为例

配置参数测试是软件测试中极易被忽视、却又极易出错的一环。本文基于 Hypothesis 项目仓库中的经典实践文章 [testing-configuration-parameters.md](https://link.gitcode.com/i/98b4a6f5c0601c6c599d1731df795607),讲解如何用属性化测试(property-based testing)系统性地遍历大量配置

gitblog_00149的博客 749

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

一种简单的实现标签标题的混排方式

在很多情况下,尤其是电商类网站,都会有促销活动或者其他一类的活动,在UI设计上通常会出现以下设计: 以及以下设计: 针对第一种情况,标题和标签在一行且标题只有一行的情况下,我们可以使用两个控件,一个imageView(simpleDrawView),一个textView,并设置他们的位置关系即可。(或者drawableLeft) 但是大多数情况下并非是这样的,而是和图2一样,这样设置两个...

wzlyd1的专栏 659

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Android自定义Span示例

CharSequence

wlkdb的博客 874

SpannableStringBuilder用法

SpannableStringBuilder用法 先说下SpannableString与SpannableStringBuilder的区别:     SpannableStringBuilder可以说是String性能的扩展,也可理解为变异的String,只是它们可以对这些字符串添加额外的样式信息,但String则不行,如加下划线、加背景色、改变字体颜色、用图片把指定的文字给替换掉等。

Wshiduo的博客 1926

图文混排 ——SpannableStringBuilder的使用

简介SpannableStringBuilder与String一样都实现了CharSequence类,用来存储字符串,区别在于SpannableStringBuilder有一个setSpan()函数,能给给存储的字符串添加各种各样的格式或者属性,,将原来的String以不同的样式显示出来,比如加上下划线、背景颜色、字体颜色、设置点击监听、设置超链接等。 setSpan()函数:SpannableSt

benhuo931115的博客 2516

安卓开发SpannableStringBuilder展示富文本

在安卓开发中,如果你们的项目需要展示文本,然后文本里面嵌套着图片,并且展示的文字有些字需要标记成不同的颜色,文字还需要有点击事件。如果让你按之前的思路去实现这样的一个效果,你会这样来设计实现思路: 1)文字用TextView展示,图片用ImageView展示,然后文字需要被截取,根据后台返回的文字索引脚标。 2)截取的文字会和图片链接进行组合布局进行展示,这样的问题就会是文字和图片的布局是不...

阿甘正传 1216

SpannableStringBuilder

SpannableString、SpannableStringBuilder、String的基本作用都是用来存储字符串,但是SpannableString、SpannableStringBuilder的setSpan()函数可以给这些存储的字符串添加各种格式或者样式(Span),将原来的String以不同的样式展示出来,比如在原来String上加下划线、加背景色、改变字体颜色、用图片把指定的文字给替换掉,等等。 SpannableString与SpannableStringBuilder Spannable

aaqian1的博客 596
上一篇: 解决Activity启动黑屏及设置android:windowIsTranslucent不兼容activity切换动画问题
下一篇: GridView.setChoiceMode(GridView.CHOICE_MODE_MULTIPLE_MODAL)不兼容低版本系统解决方案
fancylovejava
博客等级 码龄16年 1052粉丝 184原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值