• /**

  • * 单个单词可以显示在两行的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自动换行单词不会被拆分相关推荐

  1. 7-100 简单求阶乘问题 (10 分)本题要求编写程序,计算N的阶乘。输入格式:输入在一行中给出一个不超过12的正整数N。输出格式:在一行中输出阶乘的值。输入样例:4结尾无空行

    7-100 简单求阶乘问题 (10 分) 本题要求编写程序,计算N的阶乘. 输入格式: 输入在一行中给出一个不超过12的正整数N. 输出格式: 在一行中输出阶乘的值. 样例">输入样例 ...

  2. numpy.array创建行数超过一行的矩阵为什么要用两层中括号?

    numpy.array创建行数超过一行的矩阵为什么要用两个双括号? 真正正确的原因我也不是很清楚,以后清楚了再写上来. 这里写个比较肤浅甚至不正确的解释: array这个函数的原型如下: array( ...

  3. rust如何在木板上上传图片_通过编写一个简单的游戏来学习 Rust | Linux 中国

    导读:你可以尝试以多种语言编程一个简单的游戏来开始编程之路. 本文字数:4068,阅读时长大约: 5分钟 https://linux.cn/article-12979-1.html 作者:Moshe ...

  4. Android 一个TextView中设置文字不同字体大小和颜色的最完整方法

    在做项目的时候,经常会遇到过一行文字有两种颜色.有时候直接会想到用多个TextView来实现.今天就介绍一下更为简单的方法,用一个TextView实现. 效果: 这几个都实现了一行字有不同颜色,还有两 ...

  5. 典型的Top K算法_找出一个数组里面前K个最大数

    原文 典型的Top K算法_找出一个数组里面前K个最大数...或找出1亿个浮点数中最大的10000个...一个文本文件,找出前10个经常出现的词,但这次文件比较长,说是上亿行或十亿行,总之无法一次读入 ...

  6. yytextview多种格式_Android 一个TextView字体设置多种不同颜色

    最近由于项目需求,需要根据用户姓名与欢迎语字体颜色区分开来! 以前刚开始的时候会考虑用多个TextView配合 可是!如果用户数量不止一位呢!? 在baidu搜了一些资料,发现有些使用到了自定义Vie ...

  7. 一个TextView使用不同的颜色

    一个TextView使用不同的颜色: textview中首先需要已经有内容了 public static void ColorFormatTextView(TextView tv,int color, ...

  8. python 剪切一行内容到另一个文件

    自己做机器学习项目,手动打标签,完成后剪切一行数据到文件 参考内容:https://www.cnblogs.com/Dreamer-qiao/p/7390469.html # 剪切一行数据到另外一个文 ...

  9. matlab输入excel高版本,『matlab读取excel指定列』excel中大量数据如何导入matlab当中?超过1000个数据无法一个一个输入...

    如何将excel表格中大量数据导入matlab中并作图 哈哈,选我吧!使用xlsread函数体的语法你在帮助里面搜索xlsread就可以了.我要是现在回答也接翻译帮助文件.xlsread的参数有文件表 ...

最新文章

  1. TensorFlow模型的签名推荐与快速上线\n
  2. USTC English Club Note20211110
  3. python爬虫实验
  4. firedac连接mysql,FireDAC连接数据库
  5. mysql打开慢查询_MySQL 开启慢查询日志的方法
  6. SQL Server数据库导入导出数据方式比较
  7. java guava map创建,数组合并,数组分割连接
  8. 写shell工具类,一个常用实例
  9. gazebo 直接获取传感器数据_如何以最简单的方式获取传感器数据?
  10. opencv-python 霍夫变换
  11. Java并发编程实践
  12. fa萤火虫算法c语言,优化算法笔记(十)萤火虫算法
  13. Netty权威指南2.1BIO通信Demo代码
  14. 网络推广有哪些常见的推广方法?
  15. 好看的皮囊 · 也是大自然的杰作 · 全球高质量 · 美图 · 集中营 · 美女 · 2017-08-22期...
  16. Xtool X100 PAD2 Error Code 5 Data Not Exist Solution
  17. CocosCreator接入穿山甲广告2-插屏广告
  18. android微信源生SDK分享问题
  19. 有没有支持P2P架构的直播技术?
  20. 云桌面与云盘如何集成?用什么方案集成?

热门文章

  1. 高可用 Prometheus 的常见问题
  2. 详解:UML类图符号、各种关系说明以及举例
  3. JDK/Java 14 正式发布!然而我还在用 Java 8...
  4. mysql ora01031_ORA-01031:insufficient privileges解决方法
  5. mxnet Module load
  6. Error: unsupported compiler: 9.3.0
  7. python 多进程共享类实例demo
  8. 图像质量损失函数SSIM Loss的原理详解和代码具体实现
  9. 机器学习:多分类的logistic回归
  10. UnsatisfiedLinkError解决办法