平日开发过程中,我们难免会遇到一些图文混排的格式,文字,自然是利用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. 巧用Linux 架设TFTP Server备份路由器的配置文件
  2. latex 下划线_备战美赛!论文写作必备Latex排版教程之单词间隔、标题及交叉引用...
  3. JavaScript encodeURI() 函数
  4. 【Qt】Qt5.9编译MySQl5.7驱动
  5. numpy基础(part3)--加载文件
  6. c语言建立迷宫坐标,c语言 找到迷宫出口并显示坐标,可以自定义迷宫或者选用已经设计好的迷宫...
  7. javascript中的小括号
  8. idea 修改样式要编译_在IDEA中DEBUG Javac源码
  9. 常用api查询网站记录
  10. Android自动测试之Monkey工具2
  11. EMNLP2020文档级关系抽取模型GAIN 论文Double Graph Based Reasoning for Document-level Relation Extraction
  12. 工程项目进度表excel模板_救命,每天都要做工作报告!Excel一键生成精美报告的技巧,必学!...
  13. fn键台式计算机在哪,电脑键盘上FN键的使用方法【图文】
  14. cortana打开_如何在Windows 10中打开“嘿Cortana”
  15. poi报空指针_空指针异常apache poi
  16. 如何在线将PDF文档压缩到最小?
  17. 平均年薪20W,自动化测试工程师这么吃香?
  18. Android设备获取mp3中的专辑封面信息
  19. 2021中石油程序设计平台新生热身赛7-挨打记录2021/11/29
  20. java的八种基本数据类型以及变量的声明

热门文章

  1. jittor和pytorch生成网络对比之relativistic_gan
  2. opencv-python(PIL)图像处理之训练模型前的几种图预处理
  3. node版本升级for ubuntu
  4. 利用人脑神经突触进行网络模型剪枝
  5. Spring Cloud云服务架构 - common-service 项目构建过程
  6. String 中的hashCode方法
  7. 并发编程11-测试并发程序
  8. android SwipeRefreshLayout 增加上拉加载更多
  9. JavaScript跨域方法
  10. ArcEngine读取数据(数据访问)-转载