textview是否超过一行_如何实现一个TextView自动换行单词不会被拆分
/**
* 单个单词可以显示在两行的TextView
* 缺点:setTextView时如果设置了SpannableString,则还需要调用本TextView的setSpan方法再次设置,而且由于Text换行导致设置Spannable时可能出现异常
* Created by lupeng.kang on 17/1/10.
*/
public class BreakTextView extends TextView {
private boolean mEnabled = true;
public BreakTextView(Context context) {
super(context);
}
public BreakTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public BreakTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
/**
* 设置单行展示不下一个单词时是否自动截断
*
* @param enable
*/
public void setAutoSplit(boolean enable) {
mEnabled = enable;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
if (getWidth() > 0 && getHeight() > 0 && mEnabled) {
CharSequence newText = autoSplitText(this);
if (!TextUtils.isEmpty(newText)) {
setText(newText);
}
}
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}
/**
* 自动折断单词
* 实现思路:测量TextView宽度时,测量每行Text的宽度,如果一行展示不下某个单词,就将这个单词折断
*
* @param tv
* @return
*/
private CharSequence autoSplitText(final TextView tv) {
final CharSequence rawCharSequence = tv.getText();
final String rawText = rawCharSequence.toString(); //原始文本
final Paint tvPaint = tv.getPaint(); //paint,包含字体等信息
final float tvWidth = tv.getWidth() - tv.getPaddingLeft() - tv.getPaddingRight(); //控件可用宽度
//将原始文本按行拆分
String[] rawTextLines = rawText.replaceAll("\r", "").split("\n");
StringBuilder sbNewText = new StringBuilder();
for (String rawTextLine : rawTextLines) {
if (tvPaint.measureText(rawTextLine) <= tvWidth) {
//如果整行宽度在控件可用宽度之内,就不处理了
sbNewText.append(rawTextLine);
} else {
//如果整行宽度超过控件可用宽度,则按字符测量,在超过可用宽度的前一个字符处手动换行
float lineWidth = 0;
for (int cnt = 0; cnt != rawTextLine.length(); ++cnt) {
char ch = rawTextLine.charAt(cnt);
lineWidth
+= tvPaint.measureText(String.valueOf(ch));
if (lineWidth <= tvWidth) {
sbNewText.append(ch);
} else {
if (cnt - 2 >= 0 && rawTextLine.charAt(cnt - 1) >= 'A' && rawTextLine.charAt(cnt - 1) <= 'z' && rawTextLine.charAt(cnt - 2) >= 'A' && rawTextLine.charAt(cnt - 2) <= 'z') {
sbNewText.deleteCharAt(sbNewText.length() - 1);
sbNewText.append("-\n");
lineWidth = 0;
cnt -= 2;
} else {
sbNewText.append("\n");
lineWidth = 0;
--cnt;
}
}
}
}
sbNewText.append("\n");
}
textview是否超过一行_如何实现一个TextView自动换行单词不会被拆分相关推荐
- 7-100 简单求阶乘问题 (10 分)本题要求编写程序,计算N的阶乘。输入格式:输入在一行中给出一个不超过12的正整数N。输出格式:在一行中输出阶乘的值。输入样例:4结尾无空行
7-100 简单求阶乘问题 (10 分) 本题要求编写程序,计算N的阶乘. 输入格式: 输入在一行中给出一个不超过12的正整数N. 输出格式: 在一行中输出阶乘的值. 样例">输入样例 ...
- numpy.array创建行数超过一行的矩阵为什么要用两层中括号?
numpy.array创建行数超过一行的矩阵为什么要用两个双括号? 真正正确的原因我也不是很清楚,以后清楚了再写上来. 这里写个比较肤浅甚至不正确的解释: array这个函数的原型如下: array( ...
- rust如何在木板上上传图片_通过编写一个简单的游戏来学习 Rust | Linux 中国
导读:你可以尝试以多种语言编程一个简单的游戏来开始编程之路. 本文字数:4068,阅读时长大约: 5分钟 https://linux.cn/article-12979-1.html 作者:Moshe ...
- Android 一个TextView中设置文字不同字体大小和颜色的最完整方法
在做项目的时候,经常会遇到过一行文字有两种颜色.有时候直接会想到用多个TextView来实现.今天就介绍一下更为简单的方法,用一个TextView实现. 效果: 这几个都实现了一行字有不同颜色,还有两 ...
- 典型的Top K算法_找出一个数组里面前K个最大数
原文 典型的Top K算法_找出一个数组里面前K个最大数...或找出1亿个浮点数中最大的10000个...一个文本文件,找出前10个经常出现的词,但这次文件比较长,说是上亿行或十亿行,总之无法一次读入 ...
- yytextview多种格式_Android 一个TextView字体设置多种不同颜色
最近由于项目需求,需要根据用户姓名与欢迎语字体颜色区分开来! 以前刚开始的时候会考虑用多个TextView配合 可是!如果用户数量不止一位呢!? 在baidu搜了一些资料,发现有些使用到了自定义Vie ...
- 一个TextView使用不同的颜色
一个TextView使用不同的颜色: textview中首先需要已经有内容了 public static void ColorFormatTextView(TextView tv,int color, ...
- python 剪切一行内容到另一个文件
自己做机器学习项目,手动打标签,完成后剪切一行数据到文件 参考内容:https://www.cnblogs.com/Dreamer-qiao/p/7390469.html # 剪切一行数据到另外一个文 ...
- matlab输入excel高版本,『matlab读取excel指定列』excel中大量数据如何导入matlab当中?超过1000个数据无法一个一个输入...
如何将excel表格中大量数据导入matlab中并作图 哈哈,选我吧!使用xlsread函数体的语法你在帮助里面搜索xlsread就可以了.我要是现在回答也接翻译帮助文件.xlsread的参数有文件表 ...
最新文章
- TensorFlow模型的签名推荐与快速上线\n
- USTC English Club Note20211110
- python爬虫实验
- firedac连接mysql,FireDAC连接数据库
- mysql打开慢查询_MySQL 开启慢查询日志的方法
- SQL Server数据库导入导出数据方式比较
- java guava map创建,数组合并,数组分割连接
- 写shell工具类,一个常用实例
- gazebo 直接获取传感器数据_如何以最简单的方式获取传感器数据?
- opencv-python 霍夫变换
- Java并发编程实践
- fa萤火虫算法c语言,优化算法笔记(十)萤火虫算法
- Netty权威指南2.1BIO通信Demo代码
- 网络推广有哪些常见的推广方法?
- 好看的皮囊 · 也是大自然的杰作 · 全球高质量 · 美图 · 集中营 · 美女 · 2017-08-22期...
- Xtool X100 PAD2 Error Code 5 Data Not Exist Solution
- CocosCreator接入穿山甲广告2-插屏广告
- android微信源生SDK分享问题
- 有没有支持P2P架构的直播技术?
- 云桌面与云盘如何集成?用什么方案集成?
热门文章
- 高可用 Prometheus 的常见问题
- 详解:UML类图符号、各种关系说明以及举例
- JDK/Java 14 正式发布!然而我还在用 Java 8...
- mysql ora01031_ORA-01031:insufficient privileges解决方法
- mxnet Module load
- Error: unsupported compiler: 9.3.0
- python 多进程共享类实例demo
- 图像质量损失函数SSIM Loss的原理详解和代码具体实现
- 机器学习:多分类的logistic回归
- UnsatisfiedLinkError解决办法