最近做项目功能时,需要在TextView中展示图文,刚开始做的时候以为很简单,只需要用个ImageView跟TextView来展示就行了,可是发现这样做,不能实现我们需要的效果,这就需要涉及到富文本TextView来展示图文,下面介绍静态图片的图文和动态GIF的图文两种展示方式:

静态图片的图文:

效果如下:

代码:

String content = "“我最糟糕的时刻,就是我希望自己当初能与那个年轻人(科比-布莱恩特)有更好的沟通,”奥尼尔说道,“因为人们常说,如果我们俩没有分开,我们可能可以一起得到6、7个冠军。看着勒布朗(詹姆斯)过去7年做到的事情,我也常对自己说,如果我们当初能够解决好,我们可能会得到6、7个甚至8个冠军";

SpannableString sp = new SpannableString(content);

//获取一张图片

Drawable drawable = getDrawable(R.drawable.activity_jing);

drawable.setBounds(0, 0, 20, 20);//设置展示图片的大小

//drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());//设置展示图片的大小

//居中对齐imageSpan

CenterAlignImageSpan imageSpan = new CenterAlignImageSpan(drawable);

sp.setSpan(imageSpan, 0, 1, ImageSpan.ALIGN_BASELINE);//0,1表示展示图片的起始位置,占一个字的位置

textOne.setText(sp);

CenterAlignImageSpan工具类:

public class CenterAlignImageSpan extends ImageSpan {

public CenterAlignImageSpan(Drawable drawable) {

super(drawable);

}

public CenterAlignImageSpan(Bitmap b) {

super(b);

}

@Override

public 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();

}

}

动态GIF的图文:

效果如下:

首先我们使用的html,解析成Spanned,然后设置Span来实现图文混排的,代码如下:

public class ImageTextUtil {

public static Drawable getUrlDrawable(String source, TextView mTextView) {

GlideImageGetter imageGetter = new GlideImageGetter(mTextView.getContext(),mTextView);

return imageGetter.getDrawable(source);

}

public static void setImageText(TextView tv, String html){

Spanned htmlStr = Html.fromHtml(html);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {

tv.setLayerType(View.LAYER_TYPE_SOFTWARE, null);

tv.setTextIsSelectable(true);

}

tv.setText(htmlStr);

tv.setMovementMethod(LinkMovementMethod.getInstance());

CharSequence text = tv.getText();

if(text instanceof Spannable){

int end = text.length();

Spannable sp = (Spannable)tv.getText();

URLSpan[] urls=sp.getSpans(0, end, URLSpan.class);

ImageSpan[] imgs = sp.getSpans(0,end,ImageSpan.class);

StyleSpan[] styleSpens = sp.getSpans(0,end,StyleSpan.class);

ForegroundColorSpan[] colorSpans = sp.getSpans(0,end,ForegroundColorSpan.class);

SpannableStringBuilder style=new SpannableStringBuilder(text);

style.clearSpans();

for(URLSpan url : urls){

style.setSpan(url,sp.getSpanStart(url),sp.getSpanEnd(url), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

ForegroundColorSpan colorSpan = new ForegroundColorSpan(Color.parseColor("#FF12ADFA"));

style.setSpan(colorSpan,sp.getSpanStart(url),sp.getSpanEnd(url), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

}

for(ImageSpan url : imgs){

ImageSpan span = new ImageSpan(getUrlDrawable(url.getSource(),tv),url.getSource());

style.setSpan(span,sp.getSpanStart(url),sp.getSpanEnd(url), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

}

for(StyleSpan styleSpan : styleSpens){

style.setSpan(styleSpan,sp.getSpanStart(styleSpan),sp.getSpanEnd(styleSpan), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

}

for(ForegroundColorSpan colorSpan : colorSpans){

style.setSpan(colorSpan,sp.getSpanStart(colorSpan),sp.getSpanEnd(colorSpan), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

}

tv.setText(style);

}

}

}

上面代码图片展示是通过ImageSpan来实现的,但默认的图片展示的gif图片是静态取第一帧图片,我们可以在获取图片时候使用Glide,来实现播放gif,glide是图片加载库,这个库被广泛的运用在google的开源项目中,包括2014年google I/O大会上发布的官方app。Glide和Picasso有90%的相似度,准确的说,就是Picasso的克隆版本。但是在细节上还是有不少区别的。而且性能上更加优化。

把Glide引入到我们项目中,然后在创建UrlDrawable 和 GlideImageGetter

代码可以参考:底部公众号回复"富文本"即可获取

方法调用:

String content = "“我最糟糕的时刻,就是我希望自己当初能与那个年轻人(科比-布莱恩特)有更好的沟通,”奥尼尔说道,“因为人们常说,如果我们俩没有分开,我们可能可以一起得到6、7个冠军。看着勒布朗(詹姆斯)过去7年做到的事情,我也常对自己说,如果我们当初能够解决好,我们可能会得到6、7个甚至8个冠军";

String html = "" + content;

ImageTextUtil.setImageText(textTwo, html);

以下是个人公众号(longxuanzhigu),之后发布的文章会同步到该公众号,方便交流学习Android知识及分享个人爱好文章:

Android动态图文混排,Android控件TextView实现静态图与动态GIF图文混排相关推荐

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

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

  2. 动态改变标题_插入控件-gt;引用变量-gt;实现动态图表纵横筛选

    欢迎关注我的微信公众号:HR爱玩儿Excel和PPT,分享有趣又有逼格的Excel和PPT创意和技巧,emmm...不关注也没有关系...哼 昨晚没睡好,因为睡前老友跟我说了句话: 我们总部做的表没有 ...

  3. 野人学Android基础篇之初探UI控件第一课--TextView动态赋值

    除了上节课中讲到的TextView静态赋值,还有一种更加灵活的赋值方法–动态赋值.在app的运行过程中,根据程序的需要可以随时改变TextView的值. 其实现的基本逻辑可以归纳如下: 1.通过id获 ...

  4. android 3d布局轮播,android 图片/视频混合轮播控件banner

    android 图片/视频混合轮播控件banner 在youth5201314的图片轮播控件做的修改 原作者github地址:https://github.com/youth5201314/banne ...

  5. Android学习--02(猜猜我的星座App源码+Android常用控件TextView+EditText+Button+ImangeView+DatePicker+App间通信+跳转页面)

    猜猜我的星座App 1 Android常用控件 1.1 TextView控件 1.1.1 简介 1.1.2属性 1.1.3 扩展属性 1.1.4 TextView的使用方法 1.1.5总结 1.2 E ...

  6. android 巧妙利用反射机制获取控件id,避免大量冗杂的findviewbyid和butterknife注解

    android 巧妙利用反射机制获取控件id,避免大量冗杂的findviewbyid和butterknife注解 一.反射机制概述 Java 反射机制是在运行状态中,对于任意一个类,都能够获得这个类的 ...

  7. Android - 最基础的控件TextView

    TextView TextView是一个十分简单和基础的控件,相信大家使用TextView主要就是用来显示文字的, 而创建一个项目的时候,页面显示的就一个内容为Hello World 的 TextVi ...

  8. Android入门(七) | 常用控件

    文章目录 TextView 控件:文本信息 Button 控件:按钮 EditText 控件:输入框 ImageView 控件:图片 ProgressBar 控件:进度条 AlertDialog 控件 ...

  9. 003 Android之线性布局与基础控件

    文章目录 Android快速入门三步 布局介绍 LinearLayout布局属性 代码示例 基础控件 TextView和EditText 使用TextView与EditText ImageView I ...

最新文章

  1. MySQL Connector/ODBC 5.2.2 发布
  2. Linux下修改root密码以及找回root密码的方法
  3. 牛客网剑指offer编程实践41-50题
  4. SCN exercise navigation的实现原理
  5. 为使用mysql而配置codeblocks工程
  6. nifity scaffold gem
  7. linux可平通网关但不能上网,redhat问题:能ping通网关和本网段的IP,但是不能ping通DNS,也不能上网...
  8. 谈谈button标签和input标签的区别
  9. nginx配置不记录指定文件类型日志
  10. 使用Chrome快速实现数据的抓取(三)——JQuery
  11. 【每日算法Day 99】你们可能不知道只用20万赢到578万是什么概念
  12. sqlserver200864位下载_sql2008r2企业版下载-sql2008r2安装包64位 最新版 - 极光下载站...
  13. 毕业设计:基于SSM框架的学生实习管理系统
  14. oracle imp导入dmp文件流程
  15. 借助MPU6050上手卡尔曼滤波
  16. el-table行合并,单列行合并或者指定列合并行
  17. 基于vivado实现FFT/IFFT
  18. 【推荐】无需路由器,利用WIN7开启wifi,手机高速上网
  19. 对项目软件产品化的思考
  20. 隐私计算工程化之殇,为什么“久攻不破”?

热门文章

  1. PHP将word文件转为图片预览
  2. caffe.bin caffe的框架
  3. 转:成为Java高级程序员需要掌握哪些?
  4. 技术人生:真的要注意身体了,坚持锻炼
  5. 5G科普——CU和DU分离
  6. UML建模——活动图(Activity Diagram)
  7. 日有所思(4)——磁密,磁场强度,磁通量傻傻分不清
  8. 网站建设视频教程,史上最精,最全。
  9. 嵌入式行业真的没有前途吗?
  10. SVM算法(三层境界)