在开发中通常通常会遇到图文混编的情况,例如文字中插入置顶,热门等图片标签,在很多时候换行的时候TextView文字换行后都无法占满首位字符,要求TextView中要求某些文字设置其他颜色,字体,样式等等,这篇文章就是解决这种问题,如下:

一、SpannableString

SpannableString是富文本显示效果一个重要的类,是CharSequence的一种,和String一样,都是一种字符串类型,SpannableString可以直接作为TextView的显示文本,不同的是SpannableString可以通过使用其方法setSpan方法实现字符串各种形式风格的显示,重要的是可以指定设置的区间,也就是为字符串指定下标区间内的子字符串设置格式。在开发中,TextView可以通过setText(CharSequence)传入SpannableString作为参数,来达到显示不同样式文字的效果。一般通过以下方式进行设置:

spannableString.setSpan(Object what, int start, int end, int flags);

  1. what:对SpannableString进行处理的各种Span;
  2. int:需要处理文字段开始的下标;
  3. end:需要处理文字段结束的下标;
  4. flags:决定开始和结束下标是否包含的标志位,有四个参数可选
  • SPAN_INCLUSIVE_EXCLUSIVE:包括开始下标,但不包括结束下标
  • SPAN_EXCLUSIVE_INCLUSIVE:不包括开始下标,但包括结束下标
  • SPAN_INCLUSIVE_INCLUSIVE:既包括开始下标,又包括结束下标
  • SPAN_EXCLUSIVE_EXCLUSIVE:不包括开始下标,也不包括结束下标

除了SpannableString之外还有SpannableStringBuilder和SpannableString相似,类似于String和SpannableStringBuilder的关系, 在实际开发中发现SpannableStringBuilder字符占位会出现问题,所有没有用。

二、setSpan

在这里主要介绍两类Span:ClickableSpan和ImageSpan,在开发中基本够用了。

1、ClickableSpan 继承自CharacterStyle,用来设置指定区间文字的点击事件和文字样式设置。

        class TopicSpan extends ClickableSpan {@Overridepublic void onClick(@NonNull View widget) {Toast.makeText(context,"点击了处理的文字",Toast.LENGTH_LONG).show();}@Overridepublic void updateDrawState(@NonNull TextPaint ds) {super.updateDrawState(ds);//设置颜色、字体大小等等ds.setColor(Color.parseColor("#ff000"));//设置取消下划线ds.setUnderlineText(false);}}//在这里可以处理表情库添加到SpannableString构造方法里面作为参数SpannableString spannable = new SpannableString(text);spannable.setSpan(new TopicSpan(), 0, spannable.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);textview.setText(spannable);//如果处理的本文需要点击跳转,则需要加上setMovementMethod响应点击事件,否则点击无响应textview.setMovementMethod(LinkMovementMethod.getInstance());

2、ImageSpan:继承自DynamicDrawableSpan,用在在指定的文本中插入图片。

    class LogoSpan extends ImageSpan {public LogoSpan(@NonNull Context context, @NonNull Bitmap b) {super(context, b);}@Overridepublic void draw(@NonNull Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom,@NonNull Paint paint) {//处理让图片和文字居中,不处理会对不齐Drawable b = getDrawable();Paint.FontMetricsInt fm = paint.getFontMetricsInt();int transY = (y + fm.descent + y + fm.ascent) / 2 - b.getBounds().bottom / 2;//计算y方向的位移canvas.save();canvas.translate(x, transY);//绘制图片位移一段距离b.draw(canvas);canvas.restore();}}

//"  "表示图片插入的文本

SpannableString imageSpannable = new SpannableString("  ");

LogoSpan imageSpan = new LogoSpan(context, bitmap);

//0, 1表示插入的文本位置

imageSpannable.setSpan(imageSpan, 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

textview.setText(imageSpannable);

三、文本超过几行显示省略号

设置SpannableString后的TextView设置android:ellipsize="end"是无法生效的,但是android:maxLines="4"是可以生效的,意味着超过4行是无法显示省略号,直接就被截断了,需要重写TextVie的onDraw方法:

    private static final String YX_THREE_DOTS = "...";private static final int YX_THREE_DOTS_LENGTH = YX_THREE_DOTS.length();private SpannableStringBuilder mSpannableStringBuilder;@Overrideprotected void onDraw(Canvas canvas) {if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {final Layout layout = getLayout();if (layout.getLineCount() >= getMaxLines()) {CharSequence charSequence = getText();int lastCharDown = layout.getLineVisibleEnd(getMaxLines() - 1);if (lastCharDown >= YX_THREE_DOTS_LENGTH && charSequence.length() > lastCharDown) {if (mSpannableStringBuilder == null) {mSpannableStringBuilder = new SpannableStringBuilder();} else {mSpannableStringBuilder.clear();}mSpannableStringBuilder.append(charSequence.subSequence(0, lastCharDown - 1)).append(YX_THREE_DOTS);setText(mSpannableStringBuilder);}}}super.onDraw(canvas);}

Android图文混排相关推荐

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

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

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

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

  3. android多媒体图文混排,android图文混排

    背景 最近我们的产品来了个新的模块,给学生做题提高成绩的.需求如下: 支持单选.多选.填空题 支持图片文字混排 输入框有交互,排版精致美观 为了体验优化,不能使用网页实现效果 思路分析 我们的图文混排 ...

  4. Android图文混排-实现EditText图文混合插入上传

    前段时间做了一个Android会议管理系统,项目需求涉及到EditText的图文混排,如图: 在上图的"会议详情"中,需要支持文本和图片的混合插入,下图演示输入的示例: 当会议创建 ...

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

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

  6. Android 图文混排 异步加载图片

    学习老罗课程的练习实例 1.原始json数据来自图灵机器人,URL为:http://www.tuling123.com/openapi/api?key=36082454b270b90d0900d251 ...

  7. RichEditeText——android图文混排富文本文章编辑器实现详解

    需求:android 实现富文本编辑器,并且实现html解析和生成. 功能点: 字体加粗,斜体,下划线,删除线 字体设置大小   默认大(18px),中(16px),小(14px) 字体设置颜色 换行 ...

  8. Android-实现图文混排编辑

    RichTextX RichTextX一个帮助开发者实现Android图文混排编辑和显示的库. 开源地址:https://github.com/shine56/RichTextX 添加依赖 imple ...

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

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

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

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

最新文章

  1. ==和equals()的作用及区别
  2. 喜欢古诗词的性格分析
  3. new,delete总结
  4. Elasticsearch如何物理删除给定期限的历史数据?
  5. Linux的目录结构与磁盘分区
  6. CiteSpace在CNKI中的应用
  7. 使用公司邮箱名登录之PHP代码实现
  8. 技术篇-符号制作-线符号制作
  9. esp32 arduion 加速下载json
  10. Dxg——Keil 单片机 开发笔记整理分类合集【所有的相关记录,都整理在此】
  11. sqlserver入门
  12. 网络工程师linux题,历年软考网络工程师Linux真题详解
  13. 马来西亚于4月1日重新开放边境
  14. 运行django代码报错ModuleNotFoundError: No module named 'myapp'如何解决
  15. android长按home键流程
  16. vue导致页面白屏几种情况
  17. 史上最全的边缘计算应用场景
  18. 5G产业——新智能时代革命
  19. 简单的复习下箭头函式
  20. JavaScript基础 ——【了解JavaScript】

热门文章

  1. (转)粒子编辑器Particle designer属性的介绍
  2. Apache虚拟主机的实现方式
  3. ibmr系列服务器怎么装架子,R440/R540/R640/R740 R820 R930 DELL服务器导轨 滑轨 支架 理线架...
  4. CocosCreator之字体资源
  5. 专业学习经验交流会成功举行
  6. 小米手机、一加手机、华为手机、小米手环NFC刷门禁卡,全教程!
  7. android 发短信 oppo,OPPO R11短信发送失败怎么办?OPPO手机短信发送失败的解决方法...
  8. android 生成条码,Android -条形码的生成
  9. 千峰Java教程:071. 数据结构之链表①
  10. 开源项目推荐系列(短信网关)