android iconfont带图标的图文并茂的一种实现

android实现图文并茂方法很多。
这里针对,仅本地图标,需要对齐,任意位置,兼容换行导致后面空白的问题做的一种方案。

www.iconfont.cn,注册;
上传svg的icon;
下载项目得到iconfont.ttf;
Typeface.createFromAsset得到TF。
替换unicode码iconfont的16进制,比如  改成\ue602
通过CustomTypefaceSpan, RelativeSizeSpan等修改语句中的unicode部分,拼接到ssb中设置给textView。

其他:
iconfont 某些svg上传到iconfont出现图标不对的问题。
参考:
https://zhuanlan.zhihu.com/p/494625217
第1个,先做outline stroke,轮廓化描边;
第2个,将多个图层合并成一层;
第3个,使用插件fill rule editor调整。

效果图:
在这里插入图片描述

class CustomTypefaceSpan(family: String?, private val newType: Typeface) : TypefaceSpan(family) {override fun updateDrawState(ds: TextPaint) {applyCustomTypeFace(ds, newType)}override fun updateMeasureState(paint: TextPaint) {applyCustomTypeFace(paint, newType)}companion object {private fun applyCustomTypeFace(paint: Paint, tf: Typeface) {val oldStyle: Intval old = paint.typefaceoldStyle = old?.style ?: 0val fake = oldStyle and tf.style.inv()if (fake and Typeface.BOLD != 0) {paint.isFakeBoldText = true}if (fake and Typeface.ITALIC != 0) {paint.textSkewX = -0.25f}paint.typeface = tf}}
}//如果有必要cache就通过hashmap来cache
fun getOrCreateFontFace(context: Context, assetsPath: String?) : Typeface? {if(assetsPath.isNullOrEmpty()) return nullreturn Typeface.createFromAsset(context.assets, assetsPath)
}/*** 一部分一部分的拼接*/
interface IIconFontPart/*** 拼接文字*/
data class IconFontNormalPart(val normalText:String) : IIconFontPart/*** 拼接上一个unicode的iconFont*/
open class IconFontIconPart(val unicode:Char, val colorStr:String? = null, val relativeSize:Float? = null) : IIconFontPart/*** 要求TextView自身已经具有常规的字体;常规的textSize;常规的颜色。** 再来设置结合iconFontPart。*/
fun TextView.setIconFont(vararg parts:IIconFontPart) {val sb = StringBuilder()parts.forEach {if (it is IconFontNormalPart) {sb.append(it.normalText)} else if (it is IconFontIconPart) {sb.append(it.unicode)}}val text = sb.toString()val ss = SpannableStringBuilder(text)var len = 0val iconTf = getOrCreateFontFace(globalContext, "fonts/iconfont.ttf")!!parts.forEach {if (it is IconFontNormalPart) {len += it.normalText.length} else if (it is IconFontIconPart) {ss.setSpan(CustomTypefaceSpan("", iconTf), len, len + 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE)if (it.colorStr != null) {ss.setSpan(ForegroundColorSpan(Color.parseColor(it.colorStr)), len, len + 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE)}if (it.relativeSize != null) {ss.setSpan(RelativeSizeSpan(it.relativeSize), len, len + 1, Spanned.SPAN_INCLUSIVE_EXCLUSIVE)}len += 1 //最后}}setText(ss)
}

那么使用上就会很简单了。

val blank = IconFontNormalPart(" ")binding.textView.setIconFont(IconFontNormalPart("小明和小红 "),IconFontIconPart('\ue602'),blank,IconFontIconPart('\ue604'),blank,IconFontIconPart('\ue604', relativeSize = 1.25f),IconFontNormalPart("一起去打水 "),IconFontIconPart('\ue604', colorStr = "#ff8899"),)

自动换行右侧空白问题

英文的自动换行可能会导致文字显示过长,而自动换行后右侧空出太多,如下图:
请添加图片描述
解决方案给基础TextView继承后添加代码:

//解决换行右侧太多的问题
var fixWrapEndSpace = false//https://stackoverflow.com/questions/50287198/textview-remove-space-after-line-break
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {super.onMeasure(widthMeasureSpec, heightMeasureSpec)if (fixWrapEndSpace) {var maxWidth = ceil(getMaxLineWidth(layout)).toInt()maxWidth += paddingRight + paddingLeftsetMeasuredDimension(maxWidth, measuredHeight)}
}private fun getMaxLineWidth(layout: Layout): Float {var maximumWidth = 0.0fval lines = layout.lineCountfor (i in 0 until lines) {maximumWidth = max(layout.getLineWidth(i), maximumWidth)}return maximumWidth
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/866991.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI绘画Stable Diffusion【图生图教程】:图片高清修复的三种方案详解,你一定能用上!(附资料)

大家好,我是画画的小强 今天给大家分享一下用AI绘画Stable Diffusion 进行 高清修复(Hi-Res Fix),这是用于提升图像分辨率和细节的技术。在生成图像时,初始的低分辨率图像会通过放大算法和细节增强技术被转换为高分辨…

以某头部基金实践为例,验证深信服超融合对TA系统承载能力

TA(Transfer Agent)开放式基金登记过户系统是交易管理系统的重要组成部分,是登记注册机构向投资者提供账户管理、份额登记、交易清算、红利发放、持有人名册保管的综合服务系统。 作为开放式基金运作的核心系统之一,承担着投资者…

计算机视觉——opencv快速入门(二) 图像的基本操作

前言 上一篇文章中我们介绍了如何配置opencv,而在这篇文章我们主要介绍的是如何使用opencv来是实现一些常见的图像操作。 图像的读取,显示与存储 读取图像文件 在opencv中我们利用imread函数来读取图像文件,函数语法如下: imagecv2.imre…

深度调峰汽轮机相关技术资料 厂家培训用

网盘 https://pan.baidu.com/s/16KfuoVko5xCUk3bDOfTlvQ?pwdezjb 亚临界循环流化床机组深度调峰下的输出功率预测方法.pdf 基于时间序列分析的燃煤电厂深度调峰预测方法及装置】.pdf 基于汽轮机低压缸排汽压力调节的深度调峰方法.pdf 基于深度调峰工况下阀门阀杆的振动预测方…

01--SpringAI接入大模型,chatgpt,Java接入人工智能大模型

01–SpringAI接入大模型,chatgpt,Java接入人工智能大模型 文章目录 01--SpringAI接入大模型,chatgpt,Java接入人工智能大模型一、准备工作?①:环境准备 二、创建一个springAI项目①:创建一个根项目②:创建一个SpringAI模块01.解决…

国际水务交流 | 一带一路沿线水环境考察暨中马水务合作论坛

从具体区域来看,“一带一路"沿线国家环境问题复杂而多样,各国生态环境特征差异明显 东南亚尤其是东盟地区受热带季风影响,降水较多,洪水高发,也是世界生物最为多样最为丰富的地区之一,这一区域面临森…

项目实战--Spring Boot与PageHelper的集成及线程污染解决

一、PageHelper使用背景 公司要做个简单管理系统,要我搭建Spring BootMyBatisPageHelperRedis的项目框架然后交i给实习生来开发。这个其实很简单,但是遇到搭建和使用过程中PageHelper有好多小坑,就记录一下,避免再踩。 版本选择&…

C语言_操作符

目录 算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号表达式 下标引用,函数调用,结构成员 表达式求值 隐式类型转换 算术转换 操作符的属性 练习题 代码仓库 算术操作符 加()&#x…

自定义通信协议实例

自定义通信协议是指通信双方为了实现特定功能或满足特定需求,在通信过程中自行约定的一种通信规则。这种协议通常包括数据的格式、传输方式、校验方法等内容,以确保通信双方能够正确地理解和交换信息。以下是关于自定义通信协议的一些详细解释和示例&…

智能插座搭配BIOS唤醒功能实现远程定时开关机

智能插座 智能插座凭借其强大的联网能力,不仅能够实现远程操控开关电源,部分高端型号更是集成了电量统计与自动化操作功能,为用户带来了前所未有的便捷体验。以下是我对几款体验过的智能插座的简要评价,因版本差异可能有所不同。…

工业交换机端口统计功能

工业交换机端口统计功能不仅是一项技术手段,更是一双透视企业网络健康状态的慧眼。通过这一功能,企业能够实时捕捉到网络中每一个端口的流量情况,这不仅仅是数据的积累,更是对网络脉搏的精准把握。当网络的每一个脉动都被记录在案…

建智慧医院核心:智能导航系统的功能全析与实现效益

在数字化转型的浪潮中,智慧医院的建设是医疗行业数字化转型的关键步骤。随着医院规模的不断扩大和医疗设施的日益复杂,传统的静态不连续的导航方式已无法满足患者的需求。院内智能导航系统,作为医疗数字化转型的关键组成部分,正逐…

环境检测聚四氟乙烯微波消解罐 特氟龙反应釜 适用于COD测定

COD消解罐是实验室中用于测定水样中化学需氧量(Chemical Oxygen Demand,简称COD)的一种专用设备。化学需氧量是衡量水体污染程度的一个重要参数,它表示在一定条件下,水样中的有机物质和部分无机物质被氧化的程度。以下…

中霖教育:二建报名成功后怎么审核?

【中霖教育怎么样】【中霖教育靠谱吗】 在成功完成二级建造师资格考试的报名流程后,需要准备后续的审核阶段,审核是否通过关乎考生是否能顺利参加考试,审核的方式包括:现场审核、网络审核以及考试后的审核。 某些地区会要求考生…

AI文字图片人脸生成原创视频文生图生肖生小程序开发

AI文字图片人脸生成原创视频文生图生肖生小程序开发 无限开 0.12生成 图生视频 AI技术在生成文字、图片、人脸以及视频方面已经取得了显著的进步。以下是一些可能包含在AI文字图片人脸生成原创视频小程序中的功能列表: 文字转视频: 输入文字或文章&…

使用Godot4组件制作竖版太空射击游戏_2D卷轴飞机射击(一)

文章目录 概要开发思路界面编辑新建工程,设置界面大小导入素材场景编辑场景编辑 移动组件输入组件添加移动状态脚本定位组件 概要 飞船设计游戏的学习,如下所示 原视频地址: https://www.youtube.com/playlist?listPL9FzW-m48fn09w6j8Now…

go语言day09 通道 协程的死锁

Go语言学习——channel的死锁其实没那么复杂 - JackieZheng - 博客园 (cnblogs.com) 目录 通道 创建通道 1)无缓冲通道 2)有缓冲通道 通道的使用 1) 值从通道入口进 2) 值从通道出口出 信道死锁: 0)死锁现场0 1)死…

# [0701] Task05 策略梯度、Actor-critic 算法

easy-rl PDF版本 笔记整理 P4、P9 joyrl 比对 补充 P9 - P10 相关 代码 整理 最新版PDF下载 地址:https://github.com/datawhalechina/easy-rl/releases 国内地址(推荐国内读者使用): 链接: https://pan.baidu.com/s/1isqQnpVRWbb3yh83Vs0kbw 提取码: us…

气压传感器在自动驾驶汽车还有哪些应用场景

气压传感器在近年来被广泛应用于各种新兴领域,以下是其中几个最新的应用: 1、自动驾驶汽车:自动驾驶汽车需要精确的气压传感器来监测道路上的气压变化,帮助车辆进行准确的定位和导航。气压传感器可以提供高精度、可靠的气压数据&…

GUKE万能工具箱(附带源码)

GUKE万能工具箱&#xff08;附带源码&#xff09; 效果图部分源码领取完整源码下期更新 效果图 部分源码 <!DOCTYPE html> <html><head><meta charset"utf-8" name"viewport" content"widthdevice-width, initial-scale1"…