TagTextView 行内标签TextView

效果

效果如下,可以解析xml中配置的drawableStart ,然后将这个drawable显示在一行内。下一个开始。从这个drawable开始。
在这里插入图片描述

代码

MaxLengthTextView 是我另外一个自定义view MaxLengthTextView 如果内容超过xml中maxLength属性定义的文字数量时,会被添加省略号

package com.trs.v7.home.toutiao_v2.provider.rdwz;import static android.text.Spanned.SPAN_INCLUSIVE_EXCLUSIVE;import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.text.SpannableString;
import android.text.style.ImageSpan;
import android.util.AttributeSet;import androidx.annotation.NonNull;
import androidx.annotation.Nullable;import com.trs.nmip.common.ui.news.list.view.MaxLengthTextView;/*** <pre>* Created by zhuguohui* Date: 2024/1/9* Time: 10:39* Desc:这个类的作用是将在xml中配置的drawableStart* 对应的drawable 显示在一行里面。* </pre>*/
public class TagTextView extends MaxLengthTextView {private Drawable leftDrawable;public TagTextView(@NonNull Context context) {super(context);}@SuppressLint("UseCompatLoadingForDrawables")public TagTextView(@NonNull Context context, @Nullable AttributeSet attrs) {super(context, attrs);leftDrawable = null;if(attrs!=null) {int resourceValue = attrs.getAttributeResourceValue("http://schemas.android.com/apk/res/android","drawableStart", -1);if(resourceValue!=-1){leftDrawable=getResources().getDrawable(resourceValue);}//重置setCompoundDrawables(null, null, null, null);}}@Overridepublic void setText(CharSequence text, BufferType type) {super.setText(getTextWithLeftIcon(text, leftDrawable), type);}private static CharSequence getTextWithLeftIcon(CharSequence text, Drawable icon) {if (icon == null) {return text;}icon.setBounds(0, 0, icon.getIntrinsicWidth(), icon.getIntrinsicHeight());Bitmap bitmap = Bitmap.createBitmap(icon.getIntrinsicWidth(), icon.getIntrinsicHeight(), Bitmap.Config.ARGB_8888);Canvas canvas = new Canvas(bitmap);icon.draw(canvas);//获取View的截图,用来当Tag图标//将图片设置到TextView中BitmapDrawable bitmapDrawable = new BitmapDrawable(bitmap);bitmapDrawable.setBounds(0, 0, bitmap.getWidth(), bitmap.getHeight());SpannableString spannableString = new SpannableString("icon" + text);MyIm imageSpan = new MyIm(bitmapDrawable);spannableString.setSpan(imageSpan, 0, "icon".length(), SPAN_INCLUSIVE_EXCLUSIVE);return spannableString;}/*** 可以居中对齐的ImageSPan*/public static class MyIm extends ImageSpan {public MyIm(Context arg0, int arg1) {super(arg0, arg1);}public MyIm(Drawable drawable) {super(drawable);}public int getSize(Paint paint, CharSequence text, int start, int end,Paint.FontMetricsInt fm) {Drawable d = getDrawable();Rect rect = d.getBounds();if (fm != null) {Paint.FontMetricsInt fmPaint = paint.getFontMetricsInt();int fontHeight = fmPaint.bottom - fmPaint.top;int drHeight = ((Rect) rect).bottom - rect.top;int top = drHeight / 2 - fontHeight / 4;int bottom = drHeight / 2 + fontHeight / 4;fm.ascent = -bottom;fm.top = -bottom;fm.bottom = top;fm.descent = top;}//15为paddingreturn rect.right + 15;}@Overridepublic void draw(Canvas canvas, CharSequence text, int start, int end,float x, int top, int y, int bottom, Paint paint) {Drawable b = getDrawable();canvas.save();int transY = 0;transY = ((bottom - top) - b.getBounds().bottom) / 2 + top;canvas.translate(x, transY);b.draw(canvas);canvas.restore();}}}

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

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

相关文章

数据治理实践 | 小文件治理

前言 感谢关注&#xff0c;可以关注B站同名&#xff1a;语兴呀或公众号语数获取资料。 小文件是数仓侧长期头痛问题&#xff0c;它们会占用过多的存储空间&#xff0c;影响查询性能。因此&#xff0c;我们需要采取一些措施来对小文件进行治理&#xff0c;以保证Hive的高效性和…

@DependsOn:解析 Spring 中的依赖关系之艺术

欢迎来到我的博客&#xff0c;代码的世界里&#xff0c;每一行都是一个故事 DependsOn&#xff1a;解析 Spring 中的依赖关系之艺术 前言简介基础用法高级用法在 XML 配置中使用 DependsOn通过 Java Config 配置实现依赖管理 生命周期与初始化顺序Bean 生命周期的关键阶段&…

自养号测评,打造速卖通爆款的正确方式

对于新卖家来说&#xff0c;积极进行产品测评并不可耻&#xff0c;而是一个明智之举。耗费过多时间却无法起步才算可耻&#xff0c;因为新店在速卖通几乎得不到任何活动支持&#xff0c;流量也相当有限。在最初的90天内完成60单交易对于新手来说是一项艰巨的任务&#xff0c;因…

阿里云服务器e实例和云服务器u1实例有什么区别?

阿里云服务器u1和e实例有什么区别&#xff1f;ECS通用算力型u1实例是企业级独享型云服务器&#xff0c;ECS经济型e实例是共享型云服务器&#xff0c;所以相比较e实例&#xff0c;云服务器u1性能更好一些。e实例为共享型云服务器&#xff0c;共享型实例采用非绑定CPU调度模式&am…

Android签名漏洞

1. 什么是签名漏洞 Android证书签名漏洞&#xff0c;是指攻击者可以在不改变原APK的签名情况下修改APK的代码&#xff0c;从而绕过Android的签名认证安全机制。通过植入恶意代码的到仿冒的App中&#xff0c;就可替代原有的App做下载、更新。 正常情况下&#xff0c;开发者发布了…

Java基础语法之泛型

什么是泛型 泛型就是适用于许多类型&#xff0c;一个泛型类或者一个泛型方法可以应用于多种类型&#xff0c;从代码上讲&#xff0c;就是对类型实现了参数化&#xff08;换句话说就是使类型也可以传参&#xff09; 引出泛型 实现一个类&#xff0c;类中包含一个数组成员&…

IS-IS协议基本配置实验(初学版)

实验组网&#xff1a; 介绍&#xff1a;IP 地址、IS-IS 区域、IS-IS 路由器等级如图所示&#xff0c;其中 R1、R2、R3 属于 49.0001 区域&#xff0c;R4、R5 属于 49.0002 区域&#xff0c;所有路由器均创建 Lopback0 接口&#xff0c;其P 地址为 10.0.xx/32&#xff0c;其中x为…

伺服电机:编码器原理与分类

什么是编码器&#xff1f; 编码器是将旋转位置的改变转换为电气信号。 编码器是伺服系统闭环控制不可缺少的部件&#xff0c;编码器应用在轴的闭环控制和大多数的自动化控制中。编码器为闭环控制提供位置或速度的实际测量值。 一、编码器的分类 从编码器的原理和产生的信号类…

Gravatar头像服务器镜像站搭建

前言 Gravatar是Globally Recognized Avatar的缩写&#xff0c;是gravatar推出的一项服务&#xff0c;意为“全球通用头像”。如果在Gravatar的服务器上放置了你自己的头像&#xff0c;那么在任何支持Gravatar的blog或者留言本上留言时&#xff0c;只要提供你与这个头像关联的…

基于Python爬虫的B站弹幕可视化

介绍 这是一个基于Python的B站弹幕可视化项目&#xff0c;主要使用了python django、requests、jieba等库。该项目实现了以下功能&#xff1a; 1. 爬取Bilibili视频弹幕数据&#xff1a;通过爬虫获取视频的标题、视频总时长、封面图&#xff0c;视频地址以及所有弹幕数据等。 …

java SSM社区文化服务管理系统myeclipse开发mysql数据库springMVC模式java编程计算机网页设计

一、源码特点 java SSM社区文化服务管理系统是一套完善的web设计系统&#xff08;系统采用SSM框架进行设计开发&#xff0c;springspringMVCmybatis&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的 源代码和数据库&#xff0c;系统主…

【分布式微服务专题】SpringSecurity OAuth2快速入门

目录 前言阅读对象阅读导航前置知识笔记正文一、OAuth2 介绍1.1 使用场景*1.2 基本概念&#xff08;角色&#xff09;1.3 优缺点 二、OAuth2的设计思路2.1 客户端授权模式2.1.0 基本参数说明2.1.1 授权码模式2.1.2 简化&#xff08;隐式&#xff09;模式2.1.3 密码模式2.1.4 客…