项目开发需要达到这种效果

多余两行,两行最后是省略号,省略号后面是下拉很多其它

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

可是这里须要在最后文字的省略号后面加入图片。

直接上代码吧,代码凝视非常多,慢慢研究

private void toggleEllipsize(final TextView tv,final String desc){if(desc == null){return;}tv.getViewTreeObserver().addOnGlobalLayoutListener(new OnGlobalLayoutListener() {@Overridepublic 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());//创建ImageSpanImageSpan 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;  }

有疑问能够留言,交流讨论

复制去Google翻译翻译结果

版权声明:本文博客原创文章。博客,未经同意,不得转载。

使用android SpannableStringBuilder实现图文混排,看到许多其他相关推荐

  1. Android TextView中图文混排设置行间距导致高度不一致问题解决

    Android TextView中图文混排设置行间距导致高度不一致问题解决 参考文章: (1)Android TextView中图文混排设置行间距导致高度不一致问题解决 (2)https://www. ...

  2. android多媒体图文混排,干货!!!Android富文本实现图文混排

    效果图 rich.jpg 像图中的效果,大家在开发并不少见,大家可能不知道android提供了实现图文混排的类.大家或许会写一个布局或者使用drawableLeft这个属性实现文本的左侧图标. and ...

  3. Android动态图文混排,Android控件TextView实现静态图与动态GIF图文混排

    最近做项目功能时,需要在TextView中展示图文,刚开始做的时候以为很简单,只需要用个ImageView跟TextView来展示就行了,可是发现这样做,不能实现我们需要的效果,这就需要涉及到富文本T ...

  4. Android图文混排(仿QQ空间评论)

    你知道TextView中可以"塞入"图片么? 之前项目需求,做一个类似QQ的点赞评论功能,效果图如下: 本文主要讲解评论这一块,至于点赞和表情帖,后续再说. 评论功能的介绍:评论内 ...

  5. Android控件TextView实现静态图与动态GIF图文混排

    最近做项目功能时,需要在TextView中展示图文,刚开始做的时候以为很简单,只需要用个ImageView跟TextView来展示就行了,可是发现这样做,不能实现我们需要的效果,这就需要涉及到富文本T ...

  6. android 实现表格横向混动_Android图文混排实现方式详解

    在使用TextView的时候,我们经常需要在TextView中进行图文混排,比如在QQ中聊天的消息中的表情,底部tab图标等. 一.场景 二.实现方式 Android官方对TextView的图文混排提 ...

  7. android富文本图片自适应,Android Span富文本图文混排 - ImageSpan(图文垂直居中)...

    ###为文字实现很丰富的特殊效果,当然少不了图文混排 so... 直接上效果(有直接使用和自定义垂直居中效果) ##1 ImageSpan: ImageSpan(context, resourceId ...

  8. android 点击图片事件,android图文混排点击事件

    图文混排顾名思义就是把文字和图片混合排列在一起,比较简单的需求我们也可以通过TextView和ImageView配合使用来达到目的,但是遇到稍微复杂一些的情况这种方法就不适用了. 做这样一个按钮: 对 ...

  9. Android中实现不同文字颜色和图文混排的Span总结

    一.怎么在TextView中设置首行缩进两个字符 在string资源文件中,在文字的前面加入"\u3000\u3000"即可实现首行缩进 在Java代码中,使用setText(&q ...

  10. Android 图文混排 通过webview实现并实现点击图片

    在一个开源项目看到是用的webview 实现的 1. 这是在asset中的一个模板html <html> <head> <title>News Detail< ...

最新文章

  1. Halcon模板轮廓坐标点获取
  2. 著名软件公司的java笔试算法题!(含参考答案)
  3. 【Leetcode | 03】String
  4. 含噪数据的有效训练,谷歌地标图像检索竞赛2020冠军方案解读
  5. VS2010+Opencv-2.4.0的配置攻略
  6. UI设计灵感|引人注目的弹窗设计参考
  7. mybatis中resultMap的几种用法
  8. C语言练习:第二大整数
  9. 中达优控触摸屏编程视频教程_YKBuilder(中达优控触摸屏编程软件)下载
  10. win10专业版/企业版怎样永久激活并查看激活期限
  11. Caused by: javax.security.auth.login.LoginException: unable to find LoginModule class: com.ibm.secur
  12. matlab泰勒 习题,泰勒公式及其应用典型例题
  13. @Transient注解
  14. scratch实现秋天的画
  15. Cesium中如何获取鼠标单击位置的经纬度
  16. vue货币过滤器以及路由参数的使用
  17. Multisim14安装报错fatal error!Required NIPathsDir property NISHAREDDIR is undefined.
  18. 批量提取同一文件夹内相同后缀名文件
  19. 什么是你的核心竞争力之六善用你的弱点
  20. window.print()打印指定页面内容

热门文章

  1. Hash和Bloom Filter
  2. sql2005中一个xml聚合的例子
  3. Bigasoft Audio Converter for Mac - 音频转换器
  4. mac Desktop 在Terminal 无法访问,错误提示:ls: .: Operation not permitted
  5. 如何用EasyRecovery找回删除的文档(附注册机下载地址)
  6. 如何使用EasyRecovery进行深度扫描和继续扫描
  7. 如何快速制作短视频?拥有这个神器,轻松搞定!
  8. POJ 2996, Help Me with the Game
  9. 搭建vue项目时运行npm run dev 报错问题解决
  10. 利用卷积自编码器对图片进行降噪