平日开发过程中,我们难免会遇到一些图文混排的格式,文字,自然是利用TextView控件去实现,若是单行文字,相信无论是左边还是右边添加图片对小伙伴们来说都不是难事,而且可以利用drawableleft或者直接利用ImageView实现就可以了。

不过,若是要求文字显示多行时,无论是利用drawableleft,还是ImageView,想要做到换行不错位,都是不可能的,此时,我们就要利用富文本显示效果的SpannableString了。

SpannableString其实和String一样,都是一种字符串类型,SpannableString可以直接作为TextView的显示文本,不同的是SpannableString可以通过使用其方法setSpan方法实现字符串各种形式风格的显示,重要的是可以指定设置的区间,也就是为字符串指定下标区间内的子字符串设置格式。

至于SpannableString的各种用法,这里就不多做介绍了,感兴趣的小伙伴可以查看这篇文章

>https://www.cnblogs.com/qynprime/p/8026672.html

下面是针对textview左右添加图标换行不错位的代码实现

    SpannableString spannableString = new SpannableString(" " + item.getGod_des());Drawable drawable = mContext.getResources().getDrawable(R.mipmap.loading);drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());spannableString.setSpan(new VerticalImageSpan(drawable), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);mtv.setText(spannableString);

关于上面代码

1.创建出SpannableString后,参数的item.getGod_des()为你的textview要显示的内容,为什么要在前面加上一个空格呢?

因为这个空格就是你的图标要占的位置,所以多加一个空格为图标腾出一个位置,否则图标会默认占用第一个字来显示,如果图标与文字之间想留间隙,还可以多加一个空格。

2.把你的图标转成一个drawable,并且给drawable设置最小宽高。

3.VerticalImageSpan: 这个是一个可以垂直居中的ImageSpan,实现代码会放在下边

4.解释一下0,1: 开始位置从0开始,到第一个位置结束。 如果大家想在最后面加上图标,可以把0换成字符串长度-1,把1换成字符串长度,切记要在后面加一个空格占位,否则会切割掉你原本的字符串哦。

5.设置textview,这个就不多说了

VerticalImageSpan的代码

    public class VerticalImageSpan extends ImageSpan {public VerticalImageSpan(Drawable drawable) {super(drawable);}public VerticalImageSpan(Bitmap b) {super(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();}}

基本的代码就是上面这两段,不过,针对这种经常用得到的代码,我们其实可以封装成一个工具类,平时用到时,只需要传入文字和图标,就可以实现想要的效果。

    工具类代码public class TextAndPictureUtil {private TextAndPictureUtil mTextAndPictureUtil;private TextAndPictureUtil(){}public  TextAndPictureUtil getInstance(){if (mTextAndPictureUtil==null){synchronized (TextAndPictureUtil.class){if (mTextAndPictureUtil==null){mTextAndPictureUtil=new TextAndPictureUtil();}}}return mTextAndPictureUtil;}public static SpannableString getText(Context mcontext,String text, int drawId){SpannableString spannableString = new SpannableString("  " + text);Drawable drawable = mcontext.getResources().getDrawable(drawId);drawable.setBounds(0, 0, drawable.getMinimumWidth(), drawable.getMinimumHeight());spannableString.setSpan(new VerticalImageSpan(drawable), 0, 1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);return spannableString;}}

调用

   TextAndPictureUtil.getInstance().getText("IT烟酒僧",R.drawable.it)

textview 垂直居中_在Textview左边或右边添加图标 ,换行不错位相关推荐

  1. java 如何实现分散对齐_[Android]TextView实现分散对齐(两端对齐)

    TextView是个特别基础的Android控件,只要有文本基本就少不了它.但是最近在项目开发的过程中我发现TextView存在很多局限性,其中最令我头疼的就是TextView文本排版方面的问题.我们 ...

  2. savefiledialog对话框的取消和确定按钮分别返回一个什么值?_确定按钮该放在左边还是右边?...

    更新优化一下. 英国的人机交互课题都喜欢研究一些和文化.游戏.智能硬件.弱势群体之类的"大课题",而我却偏喜欢琢磨一些接地气的东西,比如说:确定按钮应该放在左边还是右边? 做PC端 ...

  3. java斜体_设置TextView样式(粗体或斜体)

    回答(21) 2 years ago TextView text = (TextView)findViewById(R.layout.textName); text.setTypeface(null, ...

  4. android中textview记录日志,Android中TextView属性全纪录

    关于TextView TextView是Android开发中最最常见的控件之一,在API记录的属性有很多,但实际开发中,有很多很少涉及但是却非常有用的属性,值得去尝试,所以记录下来,既可以给大家提供参 ...

  5. android textview 设置字体,Android TextView设置字体风格

    在开发应用过程中经常会遇到显示一些不同的字体风格的信息犹如默认的LockScreen上面的时间和充电信息.对于类似的情况,可能第一反应就是用不同的多个TextView来实现,对于每个TextView设 ...

  6. html 右边是iframe 左右结构_HTML布局之左右结构,左边固定右边跟据父元素自适应...

    HTML布局之左右结构,左边固定右边跟据父元素自适应,兼容IE6+.Firefox.Chrome.Opera.Safari,这里是用表单写的一个demo,其实就在主体布局中也是可以的,比如像后台一些管 ...

  7. java中 菜单的触发事件_javaweb ajax+div实现左边菜单右边内容时点击菜单应该触发事件但是右边没反应...

    这样写点击左边菜单时无论怎么点击,叫content那个div都没有内容都不会更新,我猜是不是css的问题 这是代码,请问在此基础上要怎么写才能实现左边菜单右边内容呢 JSP Page 22222333 ...

  8. Java的if判断对象为null时,null放在比较运算符的左边还是右边较好?

    如java中:if(name == null)和if(null == name)有什么讲究吗? 答:在java里面,它们是一样的.但是通常写为null == name.这其实是在C语言里面引申出来的. ...

  9. ios textview间距_iOS 设置TextView控件内容行间距

    - (BOOL)textViewShouldBeginEditing:(UITextView *)textView { if (textView.text.length < 1) { textV ...

最新文章

  1. 约瑟夫环问题的两种解法(详解)
  2. python用哪个版本比较好 2020_2020年最常见的Python面试题答案
  3. Jmeter Web 性能测试入门 (六):Jmeter 解析 response 并传递 value
  4. 【AI-1000问】为什么现在大家喜欢用3*3小卷积?
  5. boost::python::def相关的测试程序
  6. 技术解读|云上企业级存储——打开存储新维度,促进用户核心业务创新
  7. 云计算助力企业快速转型
  8. 用MATLAB三步完成机器人搭建
  9. FileDescriptor的作用
  10. 线性结构 —— 单调栈与单调队列
  11. Fragment学习3--底部tab布局
  12. vue弹出框消息重置问题---一个投机取巧的方法
  13. C# 从入门到精通 学习笔记2 第3章 方法和作用域
  14. 计算机组成原理课程全套ppt,计算机组成原理课程复习指导.ppt
  15. Mac 如何安装tomcat
  16. 第七批中国历史文化名镇名村名单出炉 有你家吗?
  17. 嵊州D4T1 翻车 rollover 真的翻车了
  18. Spring 之 @Cacheable 源码解析(上)
  19. 损失惨重!数据中心失火,360万个网站下线,Rust游戏25台服务器数据永久丢失...
  20. 日语二级语法汇总(part16/16)(完结篇)

热门文章

  1. jittor和pytorch生成网络对比之dcgan
  2. Raft只读操作实现要点
  3. Swift UIAlertView 的使用
  4. 最快破亿,荣耀实力验证中高端领军地位
  5. Qcon大会归来(r12笔记第36天)
  6. Be a new gentleman
  7. django 动态更新属性值
  8. 网络之XML解析-原生
  9. PHP的词法解析器:re2c
  10. SparkStreaming从Kafka读取数据两种方式