android-自定义TextView在文字内容末尾添加图片icon、可以添加间距

2024-04-09 09:12

本文主要是介绍android-自定义TextView在文字内容末尾添加图片icon、可以添加间距,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

样式示意图

样式示意图

自定义属性 style.xml

    <declare-styleable name="IconLabelTextView"><attr name="iconSrc" format="reference"/><attr name="iconPaddingStart" format="dimension"/><attr name="iconPaddingTop" format="dimension"/><attr name="iconPaddingBottom" format="dimension"/></declare-styleable>

自定义View-IconLabelTextView代码片段

import android.content.Context
import android.graphics.Canvas
import android.graphics.drawable.Drawable
import android.text.Layout
import android.text.StaticLayout
import android.text.TextPaint
import android.util.AttributeSet
import androidx.appcompat.widget.AppCompatTextView
import com.foreo.common.utils.DensityUtils
import com.xyz.Rclass IconLabelTextView : AppCompatTextView {private var icon: Drawable? = nullprivate var iconPaddingStart: Int = 0private var iconPaddingTop: Int = 0private var iconPaddingBottom: Int = 0constructor(context: Context) : super(context) {init(null)}constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {init(attrs)}constructor(context: Context, attrs: AttributeSet?, defStyleAttr: Int) : super(context,attrs,defStyleAttr) {init(attrs)}private fun init(attrs: AttributeSet?) {val a = context.obtainStyledAttributes(attrs, R.styleable.IconLabelTextView)icon = a.getDrawable(R.styleable.IconLabelTextView_iconSrc)iconPaddingStart = a.getDimensionPixelSize(R.styleable.IconLabelTextView_iconPaddingStart, 0)iconPaddingTop = a.getDimensionPixelSize(R.styleable.IconLabelTextView_iconPaddingTop, 0)iconPaddingBottom = a.getDimensionPixelSize(R.styleable.IconLabelTextView_iconPaddingBottom, 0)a.recycle()}override fun onDraw(canvas: Canvas?) {super.onDraw(canvas)canvas?.let { canvas ->val textPaint: TextPaint = paintval lineHeight = textPaint.descent() - textPaint.ascent()val lineCount = layout.lineCountval paddingTop = paddingTop.toFloat()val availableWidth = width - paddingLeft - paddingRight - DensityUtils.dp2px(30)val layout = layout ?: return@letfor (i in 0 until lineCount) {val lineStart = layout.getLineStart(i)val lineEnd = layout.getLineEnd(i)val lineText = text.subSequence(lineStart, lineEnd).toString()if (i == lineCount - 1 && layout.getLineWidth(i) >= availableWidth) {// last line with maxLines and text filled completely, adjust text to fit iconvar adjustedText = lineTextvar textWidth = textPaint.measureText(lineText)val iconWidth = icon?.intrinsicWidth ?: 0while (textWidth + iconWidth + iconPaddingStart > availableWidth) {adjustedText = adjustedText.substring(0, adjustedText.length - 1)textWidth = textPaint.measureText(adjustedText)}if (!adjustedText.isNullOrBlank() && lineText != adjustedText) {val splitIndex = text.indexOf(adjustedText) + adjustedText.lengthtext?.substring(0, splitIndex)?.let { text = "$it..." }return}if (adjustedText.isNotEmpty()) {val staticLayout = StaticLayout(adjustedText,textPaint,availableWidth.toInt(),Layout.Alignment.ALIGN_NORMAL,1f,0f,false)val iconY =paddingTop + (lineHeight * i) + (lineHeight - (icon?.intrinsicHeight?: 0)) / 2 + iconPaddingTop - iconPaddingBottomval iconX = paddingLeft + staticLayout.width + iconPaddingStarticon?.setBounds(iconX.toInt(),iconY.toInt(),(iconX + iconWidth).toInt(),(iconY + (icon?.intrinsicHeight ?: 0)).toInt())icon?.draw(canvas)}} else if (i == lineCount - 1 && lineEnd <= text.length) {// last line, add iconicon?.let {val textWidth = textPaint.measureText(lineText)val iconY =paddingTop + (lineHeight * i) + (lineHeight - it.intrinsicHeight) / 2 + iconPaddingTop - iconPaddingBottomval iconX = paddingLeft + textWidth + iconPaddingStartit.setBounds(iconX.toInt(),iconY.toInt(),(iconX + it.intrinsicWidth).toInt(),(iconY + it.intrinsicHeight).toInt())it.draw(canvas)}}}}}fun setIcon(icon: Drawable?, paddingStart: Int, paddingTop: Int, paddingBottom: Int) {this.icon = iconthis.iconPaddingStart = paddingStartthis.iconPaddingTop = paddingTopthis.iconPaddingBottom = paddingBottominvalidate()}
}

xml中使用

  <com.xyz.IconLabelTextViewandroid:id="@+id/productVariation"android:layout_width="match_parent"android:layout_height="wrap_content"android:ellipsize="end"android:maxLines="2"android:textSize="12sp"app:iconPaddingBottom="0dp"app:iconPaddingStart="5dp"app:iconPaddingTop="3dp"app:iconSrc="@drawable/ic_arrow_down_cart"tools:text="Normal Skin" />

代码中使用

productVariation.setIcon(getDrawable(R.drawable.ic_arrow_down_cart),10,0,0)

这篇关于android-自定义TextView在文字内容末尾添加图片icon、可以添加间距的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/887746

相关文章

Python实现精准提取 PDF中的文本,表格与图片

《Python实现精准提取PDF中的文本,表格与图片》在实际的系统开发中,处理PDF文件不仅限于读取整页文本,还有提取文档中的表格数据,图片或特定区域的内容,下面我们来看看如何使用Python实... 目录安装 python 库提取 PDF 文本内容:获取整页文本与指定区域内容获取页面上的所有文本内容获取

Python基于微信OCR引擎实现高效图片文字识别

《Python基于微信OCR引擎实现高效图片文字识别》这篇文章主要为大家详细介绍了一款基于微信OCR引擎的图片文字识别桌面应用开发全过程,可以实现从图片拖拽识别到文字提取,感兴趣的小伙伴可以跟随小编一... 目录一、项目概述1.1 开发背景1.2 技术选型1.3 核心优势二、功能详解2.1 核心功能模块2.

Go语言如何判断两张图片的相似度

《Go语言如何判断两张图片的相似度》这篇文章主要为大家详细介绍了Go语言如何中实现判断两张图片的相似度的两种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 在介绍技术细节前,我们先来看看图片对比在哪些场景下可以用得到:图片去重:自动删除重复图片,为存储空间"瘦身"。想象你是一个

如何自定义一个log适配器starter

《如何自定义一个log适配器starter》:本文主要介绍如何自定义一个log适配器starter的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求Starter 项目目录结构pom.XML 配置LogInitializer实现MDCInterceptor

使用Python实现base64字符串与图片互转的详细步骤

《使用Python实现base64字符串与图片互转的详细步骤》要将一个Base64编码的字符串转换为图片文件并保存下来,可以使用Python的base64模块来实现,这一过程包括解码Base64字符串... 目录1. 图片编码为 Base64 字符串2. Base64 字符串解码为图片文件3. 示例使用注意

Python实现自动化Word文档样式复制与内容生成

《Python实现自动化Word文档样式复制与内容生成》在办公自动化领域,高效处理Word文档的样式和内容复制是一个常见需求,本文将展示如何利用Python的python-docx库实现... 目录一、为什么需要自动化 Word 文档处理二、核心功能实现:样式与表格的深度复制1. 表格复制(含样式与内容)2

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

c/c++的opencv实现图片膨胀

《c/c++的opencv实现图片膨胀》图像膨胀是形态学操作,通过结构元素扩张亮区填充孔洞、连接断开部分、加粗物体,OpenCV的cv::dilate函数实现该操作,本文就来介绍一下opencv图片... 目录什么是图像膨胀?结构元素 (KerChina编程nel)OpenCV 中的 cv::dilate() 函

Druid连接池实现自定义数据库密码加解密功能

《Druid连接池实现自定义数据库密码加解密功能》在现代应用开发中,数据安全是至关重要的,本文将介绍如何在​​Druid​​连接池中实现自定义的数据库密码加解密功能,有需要的小伙伴可以参考一下... 目录1. 环境准备2. 密码加密算法的选择3. 自定义 ​​DruidDataSource​​ 的密码解密3

spring-gateway filters添加自定义过滤器实现流程分析(可插拔)

《spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔)》:本文主要介绍spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔),本文通过实例图... 目录需求背景需求拆解设计流程及作用域逻辑处理代码逻辑需求背景公司要求,通过公司网络代理访问的请求需要做请