TextView 实现最后一行缩进指定距离

实现图上类似的效果。

指定最大行数为三行,最后一行缩进指定的距离。

如果行数小于三行,则不缩进。

同时文字两端对齐


代码里的  JustifyTextView (两端对齐的 Textview )详见

Android Textview 多行文本两端对齐_android textveiw实现两端对齐-CSDN博客

 这里代码中写死了行数 mMaxLineCount = 3 以及缩进的px  mReduceWidth ,可根据实际需求修改或者 xml 中指定


import android.annotation.SuppressLint
import android.content.Context
import android.graphics.Canvas
import android.text.Layout
import android.text.StaticLayout
import android.util.AttributeSet@SuppressLint("AppCompatCustomView")
class CusTextview@JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0) : JustifyTextView(context, attrs, defStyleAttr)   {// 最大的绘制行数(从0开始)private var mMaxLineCount = 3// 缩进的长度 pxprivate var mReduceWidth = 82.dpoverride fun onDraw(canvas: Canvas) {mLineY = 0.0fmViewWidth = measuredWidth //获取textview的实际宽度// 最后一行的绘制的宽度val lastLineWidth = mViewWidth - mReduceWidthmLineY += textSize.toInt()val text = text.toString()val layout: Layout = layout// 原始行数val lineCount: Int = layout.lineCount// 计算后的行数val drawLineCount = lineCount.coerceAtMost(mMaxLineCount)//每行循环for (i in 0 until drawLineCount) {val lineStart: Int = layout.getLineStart(i)val lineEnd: Int = layout.getLineEnd(i)//获取TextView每行中的内容val lineText = text.substring(lineStart, lineEnd)// 开始进行针对行的绘制if (needScale(lineText)) {// 如果设置三行,但是实际只有两行,处理第二行不要平铺!if (i == (drawLineCount - 1)) {// 最后一行if (lastLineWidth < 0 || drawLineCount < mMaxLineCount){// 长度太低,或者长度不满足于最大长度。不进行重绘canvas.drawText(lineText, 0.0f, mLineY, paint)}else{// 缩进后的文本var paintText = lineText// 获取原始文本的长度var measuredTextLength = paint.measureText(paintText)// 减少字数计算合适的长度while (measuredTextLength > lastLineWidth && paintText.length > 1) {// 逐步减少文本末尾的字符paintText = paintText.dropLast(1)// 重新计算文本长度measuredTextLength = paint.measureText(paintText)}// 绘制最终文本// 避免最后一行长度不够时,还被加 ...if (paintText != lineText) {canvas.drawText("$paintText...", 0.0f, mLineY, paint)}else{canvas.drawText("$paintText", 0.0f, mLineY, paint)}}} else {// 常规行,平铺填充val width = StaticLayout.getDesiredWidth(text, lineStart, lineEnd, paint)drawScaleText(canvas, lineText, width)}} else {canvas.drawText(lineText, 0.0f, mLineY, paint)}mLineY += lineHeight //写完一行以后,高度增加一行的高度}}}

 xml 中使用:

    <!--简介信息位置--><com.xxx.widget.CusTextviewandroid:textColor="@color/white_alpha_70"android:id="@+id/base_info"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_below="@id/base_info"android:layout_alignLeft="@id/t_textview"android:layout_marginRight="27dp"android:layout_toLeftOf="@id/p_view"android:lineSpacingExtra="5dp"android:maxLines="3"android:textSize="17sp" />

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

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

相关文章

Go语言入门之基础语法

Go语言入门之基础语法 1.简单语法概述 行分隔符&#xff1a; 一行代表一个语句结束&#xff0c;无需写分号。将多个语句写在一行可以用分号分隔&#xff0c;但是不推荐 注释&#xff1a; // 或者/* */ 标识符&#xff1a; 用来命名变量、类型等程序实体。 支持大小写字母、数字…

k8s核心操作_Deployment的扩缩容能力_Deployment自愈和故障转移能力---分布式云原生部署架构搭建022

然后我们上面说了k8s中的deployment的多副本能力 然后,我们再来看 k8s中的deployment的扩缩容能力 可以看到,对于扩容,要使用 kubectl scale 命令 对于缩容 要使用kubectl scale 命令都是使用这个命令对吧 来试试,可以看到上面命令 首先看看 kubectl get pod 可以看到有…

第58期 | GPTSecurity周报

GPTSecurity是一个涵盖了前沿学术研究和实践经验分享的社区&#xff0c;集成了生成预训练Transformer&#xff08;GPT&#xff09;、人工智能生成内容&#xff08;AIGC&#xff09;以及大语言模型&#xff08;LLM&#xff09;等安全领域应用的知识。在这里&#xff0c;您可以找…

网络编程:TCP

一、tcp编程 注意 1.数据本身有顺序 2.发送和接收次数不需要对应 3. 1. C/S 模式 》服务器/客户端模型 server:socket()-->bind()--->listen()-->accept()-->recv()-->close() client:socket()-->connect()-->send()-->close(); int on 1; setso…

常用的设计模式和使用案例汇总

常用的设计模式和使用案例汇总 【一】常用的设计模式介绍【1】设计模式分类【2】软件设计七大原则(OOP原则) 【二】单例模式【1】介绍【2】饿汉式单例【3】懒汉式单例【4】静态内部类单例【5】枚举&#xff08;懒汉式&#xff09; 【三】工厂方法模式【1】简单工厂模式&#xf…

GuLi商城-商品服务-API-品牌管理-OSS获取服务端签名

新建第三方服务: 引入common 把common中oss的依赖都拿到第三方服务中来 配置文件: 加上nacos注解:<

HTML 标签简写和全称及其对应的中文说明和实例

<!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>HTML 标签简写及全称</title><style>…

用c++模拟一个赌博游戏

源码: #include <iostream> #include<stdlib.h> #include<time.h> #define MAXTIMES 20 using namespace std;double multiple;double money; double bet; double add; int times; void betting(); int main() {srand(time(NULL));money=1000.0;while(time…

全面解析C#:现代编程语言

引言 C#&#xff08;读作 “C Sharp”&#xff09;是一种现代、通用、面向对象的编程语言&#xff0c;由微软在2000年开发。它是.NET框架的重要组成部分&#xff0c;广泛应用于桌面应用程序、Web应用程序、游戏开发、企业级解决方案等领域。本文将详细介绍C#的基本概念、高级主…

PHP数据结构之队列

本文由 ChatMoney团队出品 队列是一种基本的数据结构&#xff0c;遵循先进先出&#xff08;FIFO, First In First Out&#xff09;原则&#xff0c;即最先添加的元素将是最先被移除的。在本篇文章中&#xff0c;我们将深入探讨队列的概念&#xff0c;并通过PHP代码实现一个简单…

Android 通知访问权限

问题背景 客户反馈手机扫描三方运动手表&#xff0c;下载app安装后&#xff0c;通知访问权限打不开。 点击提示“受限设置” “出于安全考虑&#xff0c;此设置目前不可用”。 问题分析 1、setting界面搜“授予通知访问权限”&#xff0c;此按钮灰色不可点击&#xff0c;点…

TensorFlow系列:第三讲:MobileNetV2使用介绍

使用TensorFlow官方提供的API进行模型训练&#xff0c;keras系列API中&#xff0c;存在很多算法&#xff0c;使用MobileNetV2进行讲解。 一. MobileNetV2简介 MobileNetV2 是由 Google 在 2018 年发布的一种轻量级深度神经网络架构&#xff0c;旨在优化移动设备和嵌入式设备上…

<PLC><模拟量><SMC>使用SMC温度流量传感器PF3W系列与汇川PLC进行模拟量通讯的接线与设置

前言 本系列是关于PLC相关的博文,包括PLC编程、PLC与上位机通讯、PLC与下位驱动、仪器仪表等通讯、PLC指令解析等相关内容。 PLC品牌包括但不限于西门子、三菱等国外品牌,汇川、信捷等国内品牌。 除了PLC为主要内容外,PLC相关元器件如触摸屏(HMI)、交换机等工控产品,如…

微服务节流阀:Eureka中服务限流策略的精妙实现

微服务节流阀&#xff1a;Eureka中服务限流策略的精妙实现 引言 在微服务架构中&#xff0c;服务的稳定性和可靠性至关重要。限流策略作为保障服务稳定性的一种手段&#xff0c;通过控制服务的访问速率&#xff0c;可以有效避免服务过载和故障扩散。Eureka作为Netflix开源的服…

大小端详解

引例 我们知道整形(int)是4个字节&#xff0c;例如随便举个例子&#xff1a;0x01020304&#xff0c;它一共占了四个地址位&#xff0c;01,02,03,04分别占了一个字节&#xff08;一个字节就对应了一个地址&#xff09;。 那么就会有个问题&#xff1a;我们的01到底是存储在高地…

mysql 5.7.44 32位 zip安装

前言 因为研究别人代码&#xff0c;他使用了5.7的 32位 mysql &#xff0c;同时最新的 8.4 64位 mysql 不能用官方lib连接。所以安装这个版本使用&#xff0c;期间有些坑&#xff0c;在这里记录一下。 下载路径 mysql官方路径&#xff1a;https://downloads.mysql.com/archi…

软考高级第四版备考--第15天(管理团队)Management Team

定义&#xff1a;跟踪团队成员工作表现、提供反馈、解决问题并管理团队变更以优化项目绩效的过程 作用&#xff1a;影响团队行为&#xff0c;管理冲突以及解决问题。 输入&#xff1a;项目管理计划&#xff08;资源管理计划&#xff09;、项目文件&#xff08;问题日志、经验…

Android IdleHandler源码分析

文章目录 Android IdleHandler源码分析概述前提基本用法源码分析添加和删除任务执行任务 应用场景 Android IdleHandler源码分析 概述 IdleHandler是一个接口&#xff0c;它定义在MessageQueue类中&#xff0c;用于在主线程的消息队列空闲时执行一些轻量级的任务。IdleHandle…

Linux——多线程(五)

1.线程池 1.1初期框架 thread.hpp #include<iostream> #include <string> #include <unistd.h> #include <functional> #include <pthread.h>namespace ThreadModule {using func_t std::function<void()>;class Thread{public:void E…

Redis 7.x 系列【21】主从复制

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 工作原理2.1 建立连接2.2 全量复制2.3 命令传播2.4 增量复制 3. 拓扑架构3.…