Android TextView内容包含中英文时满行居中,不足一行则左对齐,会出现左右空格不一致。

2023-11-13

在这里插入图片描述
package com.roya.shandong.view;

import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.text.Layout;
import android.text.StaticLayout;
import android.text.TextPaint;
import android.util.AttributeSet;
import android.widget.TextView;

/**

  • Created by Aphrodite on 2017/8/28.
    */

public class DialogTextView extends TextView {
private float mLineY;
private float mViewWidth;

public DialogTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}

@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
super.onLayout(changed, left, top, right, bottom);
}

@Override
protected void onDraw(Canvas canvas) {
TextPaint paint = getPaint();
paint.setColor(getCurrentTextColor());
paint.drawableState = getDrawableState();
mViewWidth = getMeasuredWidth();
String text = getText().toString();
mLineY = 0;
mLineY += getTextSize();
Layout layout = getLayout();
if (null == layout) {
return;
}
Paint.FontMetrics fm = paint.getFontMetrics();
int textHeight = (int) Math.ceil(fm.descent - fm.ascent);
textHeight = (int) (textHeight * layout.getSpacingMultiplier() + layout.getSpacingAdd());
for (int i = 0; i < layout.getLineCount(); i++) {
int lineStart = layout.getLineStart(i);
int lineEnd = layout.getLineEnd(i);
float width = StaticLayout.getDesiredWidth(text, lineStart, lineEnd, getPaint());
String line = text.substring(lineStart, lineEnd);
if (line.equals("")) {
break;
}

  if (i < layout.getLineCount() - 1) {
    if (needScale(line)) {
      drawScaledText(canvas, lineStart, line, width);
    } else {
      canvas.drawText(line, 0, mLineY, paint);
    }
  } else {
    canvas.drawText(line, 0, mLineY, paint);
  }
  mLineY += textHeight;
}

}

private void drawScaledText(Canvas canvas, int lineStart, String line, float width) {
float x = 0;
if (isFirstLineOfParagraph(lineStart, line)) {
String blanks = “”;
canvas.drawText(blanks, x, mLineY, getPaint());
float bw = StaticLayout.getDesiredWidth(blanks, getPaint());
x += bw;
line = line.substring(3);
}

int gapCount = line.length() - 1;
int i = 0;
if (line.length() > 2 && line.charAt(0) == 12288 && line.charAt(1) == 12288) {
  String substring = line.substring(0, 2);
  float cw = StaticLayout.getDesiredWidth(substring, getPaint());
  canvas.drawText(substring, x, mLineY, getPaint());
  x += cw;
  i += 2;
}

float d = (mViewWidth - width) / gapCount;
for (; i < line.length(); i++) {
  String c = String.valueOf(line.charAt(i));
  float cw = StaticLayout.getDesiredWidth(c, getPaint());
  canvas.drawText(c, x, mLineY, getPaint());
  x += cw + d;
}

}

private boolean isFirstLineOfParagraph(int lineStart, String line) {
return line.length() > 3 && line.charAt(0) == ’ ’ && line.charAt(1) == ’ ';
}

private boolean needScale(String line) {
if (line.length() == 0) {
return false;
} else {
return line.charAt(line.length() - 1) != ‘\n’;
}
}
}
在这里插入图片描述

借鉴:https://www.zhihu.com/question/23768161/answer/82424947

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android TextView内容包含中英文时满行居中,不足一行则左对齐,会出现左右空格不一致。 的相关文章

  • Python自动化测试专栏——元素定位不到常见问题及解决办法

    1 元素id动态变化 以如下图片举例 当我们要定位到该元素时 如果采用id属性定位 那么很有可能定位不到 原因 当我们刷新一遍网页时 会发现id值发生变化 表明它是个动态id 每次自动化时会因为值不同无法定位到该元素 解决方法 采用其他属性
  • SQL Server(三)-查询数据(1)

    一 普通查询1 查询stu info表中所有数据 SELECT FROM table source 2 查询表中指定字段的数据 查询出stu info表中 depart 院系 字段的值 即可知道有哪些院系的学生 SELECT depart
  • 9.4 sobel算子和scharr算子的比较

    点击此处返回总目录 这一节我们看一下sobel算子和scharr算子的比较 首先我们看一下他们的卷积核 sobel算子和scharr算子他们的卷积核大小是一样的 这意味着他们计算起来 工作量是一样的 不同在哪呢 sobel计算起来 精确度不
  • js判断输入框不能为空格或null值

    var sno sno val var sname sname val if sno indexOf gt 0 sno null sname indexOf gt 0 sname null alert 学号和名称不能为空格或null值 re
  • Git安装(Windows)

    一 下载 官网下载页面 https git scm com downloads 我选择的是Win 64位的安装版本 地址 https github com git for windows git releases download v2 3
  • ElasticSearch (五) Postman查询数据

    match all size from size match 返回指定字段 排序 sort range wildcard查询 合并查询语句 1 match all 匹配所有文档 match all 下面为查询结果 result size 例
  • 了解Wi-fi频段概念

    前言 信道带宽 应该了解wi fi频段 这样才能分析有多少信道带宽可用 以及如何在没有任何干扰 失真 的情况下有效地使用它 2 4GHz和5GHz频段可用于wi fi 2 4 GHz Wi Fi频段 在2 4 GHz频段 可用带宽为100
  • QT窗口缩放,自定义边框,无边框缩放拉伸

    目录 什么情况下需要自定义边框 效果图 一 基本思路 二 参考程序一 2 1 源码 2 2 思路说明 2 3 缺点说明 三 参考程序2 3 1 源码 3 2 思路说明 3 3 优缺点说明 四 参考程序3 4 1源码 4 2 思路说明 4 3
  • 无缘

    何时相逢 何时相见 闲暇的日子中 总抱着那一份的想念 昨日的黄昏 急匆匆赶到那约定的地点 道旁的杨树枝繁叶茂 晚风随着鸟鸣声悠扬 我徘徊在你的身旁 你驻足于她的身边 笑语从月牙一般的屋顶上掠过 而我却不屑看上你一眼 能否相逢 能否相见 寂静
  • React完整上手攻略(转)

    转自https typescript bootcss com tutorials react html 这篇快速上手指南会教你如何将TypeScript与React结合起来使用 在最后 你将学到 使用TypeScript和React创建工程
  • JDBC注册多个驱动

    我们可以在静态块中注册多个JDBC驱动 如下同时注册了mysql oracle驱动 try Class forName com mysql jdbc Driver Class forName oracle jdbc driver Oracl
  • ClearCanvas 源码解析 1

    国内 网上关于ClearCanvas开源的文章太少 最近刚好在做PACS 发现这个源码后 调试了一下 运行效果还可以 ClearCanvas是C 开源源码 对PACS的解析操作 底层和C 开源fo dicom有什么关系 还没有时间去研究 看
  • Python嵌套字典的遍历

    对于字典 d 1 1 2 2 3 4 44 5 55 6 7 7 1024 8 88 9 9 1 如何获取到 7 1024 中的1024 2 如何获取到所有key为7的value值 方法一 直接输出 d 1 1 2 2 3 4 44 5 5
  • C/C++面试题

    1 指针和引用的区别 答 引用是在C 中引入的 它们之间的区别有 1 非空区别 指针可以为空 而引用不能为空 2 可修改区别 如果指针不是常指针 那么就可以修改指向 而引用不能 3 初始化区别 指针在定义时可以不用初始化 而引用在定义的同时
  • python调用js文件

    python调用js文件生成参数 JS逆向 安装exejs与nodejs 调用js生成参数 JS逆向 我就随便找了一个网站https cloud kingdee com passport auth login 随手输入一个账号密码 抓包后发
  • 正在配置更新请勿关闭计算机怎么办,电脑开机“显示正在配置更新请勿关闭计算机”该怎么办?...

    电脑开机 显示正在配置更新请勿关闭计算机 该怎么办 以下文字资料是由 历史新知网www lishixinzhi com 小编为大家搜集整理后发布的内容 让我们赶快一起来看一下吧 电脑开机 显示正在配置更新请勿关闭计算机 该怎么办 系统打补丁

随机推荐

  • 法兰轴机械加工工艺及夹具设计(说明书+CAD图纸+工序卡)

    一 零件的分析 1 1零件的作用 题目所给定的零件车床输出轴 见图1 其主要作用 一是传递转矩 使车床主轴获得旋转的动力 二是工作过程中经常承受载荷 三是支撑传动零部件 零件上的 80mm孔与动力源 电动机主轴等 配合起定心作用 用10 2
  • 疫情期间谁干谁赚钱的三个小副业,普通人也能干,基本不用你投资

    一切生意的本质 都是低买高卖 只是有时 这个利差来自货物 有时利差来自服务而已 疫情过后 三个生意千万不要干 谁干谁倒闭 天王老子救不了你 还有三个生意 谁干谁发财 一年赚个三五十万 搞点生活费一点毛病都没有 我先说不能碰的行业啊 第一个服
  • Linux进程信号

    目录 信号入门 信号的本质 信号的处理 产生信号 通过终端按键产生信号 调用系统函数向进程发信号 由软件条件产生信号 硬件异常产生信号 阻塞信号 信号其他相关常见概念 信号在内核中的表示 sigset t 信号集操作函数 sigprocma
  • sudo rosdep init 遇到Website may be down问题以及解决方案

    sudo rosdep init 遇到Website may be down问题以及解决方案 1 在终端中输入sudo gedit etc hosts 2 文末添加199 232 28 133 raw githubusercontent c
  • 华为OD机试真题-去除多余空格【2023.Q1】

    题目内容 去除文本多余空格 但不去除配对单引号之间的多余空格 给出关键词的起始和结束下标 去除多余空格后刷新关键词的起始和结束下标 输入描述 输入为两行字符串 第一行 待去除多余空格的文本 用例保证如果有单引号 则单引号成对出现 且单引号可
  • PPTP/L2TP协议详解以及应用部署

    PPTP L2TP协议讲述以及应用部署 一 基本概念 PPTP PPTP是对端对端协议 PPP 的一种扩展 它采用了PPP所提供的身份验证 压缩与加密机制 PPTP能够随TCP IP协议一道自动进行安装 PPTP与Microsoft端对端加
  • 最好用的兼容多种数据库通用高效的大数据分页功能

    通用权限管理系统底层有一个通用分页查询功能 该功能可实现多种数据库的查询 支持多表关联分页查询 目前是最完善的分页功能实现 下面代码是使用的方法截图 后台代码截图1 后台代码截图2 后台代码截图3 后台代码截图4 后台代码截图5 页面后台代
  • 完整软件研发流程

    软件产品开发流程 下图所示的是一个软件产品开发大体上所需要经历的全部流程 1 启动 在项目启动阶段 主要确定项目的目标及其可行性 我们需要对项目的背景 干系人 解决的问题等等进行了解 并编制项目章程和组建项目团队 包括 产品经理 架构工程师
  • 哈夫曼编码与译码(数据结构课程设计)

    事先声明 哈夫曼编码中的选择函数Select思路借鉴了csdn大佬 非原创 吹一波彩虹屁 大佬真厉害 众所周知 数据结构这门课程是非常非常重要的 无论是找工作还是考研 你都能体会到 数据结构这本书的知识也非常的奇特美妙 希望大家好好学习研究
  • vscode函数跳转环境搭建(C/C++)

    之前读书学习时 代码量比较小 装个C C 插件就可搞定 但面对比较大的工程 只安装这个插件就不起作用了 就需要建立符号链接 1 基础环境C C 插件 C C 插件是来自微软官方的 C C 插件 必备的插件 是代码跳转 自动补全 代码大纲显示
  • 【教程】制作能在ARM板上直接运行的gcc本地编译器

    编译好的程序的下载链接 百度网盘 请输入提取码 提取码 ocmm 概述 通常情况下 我们是在电脑里面开一个Linux虚拟机 在虚拟机里面用交叉编译工具链编译好可执行文件后 将可执行文件拷贝到板子里面运行 也就是说 我们是用电脑上运行的gcc
  • gateway整合sentinel限流不生效排查

    问题 线上的sentinel 在测试压测时候可以正常被限流 但是在正常的流量中 发现被限流的接口很少 我发誓肯定都配置了限流规则 约定 文中的 服务名称以及地址 都被改写了 排查步骤 1 检查相关配置 以及 pom依赖配置 发现Sentin
  • effective java

    第一章 Java开发中通用的方法和准则 建议1 不要在常量和变量中出现易混淆的字母 i l 1 o 0等 建议2 莫让常量蜕变成变量 代码运行工程中不要改变常量值 建议3 三元操作符的类型务必一致 不一致会导致自动类型转换 类型提升int
  • 谷歌云

    本文由 Cloud Ace 云一整理 越来越多的组织正在Cloud Run上构建应用程序 这是一个完全托管的计算平台 可让您在 Google 的基础架构之上运行容器化应用程序 想想 Web 应用程序 实时仪表板 API 微服务 批量数据处理
  • Hibernate学习笔记(三) --- 映射枚举类型

    对于枚举类型 不能通过org hibernate annotations Type注解来简单的映射对应的数据库字段类型 除非自定义类型 对此 Hibernate提供了javax persistence Enumerated注解 该注解的参数
  • POI 操作word

    关于POI 操作word的基础知识在这个博客 http elim iteye com blog 2049110 中有非常清晰的解释 在这里我就不多解释了 本文研究的内容就是 XWPFParagraph 代表一个段落 XWPFRun 代表具有
  • 深入学习jquery源码之html()与text()和val()

    深入学习jquery源码之html 与text 和val html val fn 概述 取得第一个匹配元素的html内容 这个函数不能用于XML文档 但可以用于XHTML文档 在一个 HTML 文档中 我们可以使用 html 方法来获取任意
  • 均值滤波计算_【从零学习OpenCV 4】均值滤波

    点击上方 小白学视觉 选择 星标 公众号 重磅干货 第一时间送达 经过几个月的努力 小白终于完成了市面上第一本OpenCV 4入门书籍 从零学习OpenCV 4 为了更让小伙伴更早的了解最新版的OpenCV 4 小白与出版社沟通 提前在公众
  • L1-063 吃鱼还是吃肉(Python实现) 测试点全过

    前言 color Blue 前言 前言 本系列题使用的是 PTA中的团体程序设计天梯赛 练习集 的题库 难度有L1 L2 L3三个等级 分别对应团体程序设计天梯赛的三个难度 更新取决于题目的难度 和学校的事情 但尽可能保证每日更新 若没更新
  • Android TextView内容包含中英文时满行居中,不足一行则左对齐,会出现左右空格不一致。

    package com roya shandong view import android content Context import android graphics Canvas import android graphics Pai