安卓TextView文本不满一行由于英文,标点符号等原因换行
1、
String aaa = “随便复制一段文字,用于测试,大家自己写下。有特殊符号,然后标点,英文什么的。”
2、
转半角函数,因为实际看起来半角函数比较好看
public static String ToDBC(String input) {char[] c = input.toCharArray();for (int i = 0; i< c.length; i++) {if (c[i] == 12288) {c[i] = (char) 32;continue;}if (c[i]> 65280&& c[i]< 65375)c[i] = (char) (c[i] - 65248);}return new String(c); }
3、
文本肯定是自定义控件,java文件见最下面,demo引自:http://www.eoeandroid.com/forum.php?mod=viewthread&tid=555569&extra=page%3D1&page=1
4、
XXX.setText(ToDBC(aaa));
5、
上面3步骤的java文件
/** * Project Name:TextViewDemo * File Name:TypesetTextView.java * Package Name:com.example.view * Date:2014-11-29上午10:10:31 */ package com.uzmap.pkg.utils;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.text.TextUtils; import android.util.AttributeSet; import android.widget.TextView;/** * ClassName:TypesetTextView * Date: 2014-11-29 上午10:10:31 * @author Lenovo * @version * @since JDK 1.7 * @see */ public class TypesetTextView extends TextView {private int mLineY;private int mViewWidth;public static final String TWO_CHINESE_BLANK = " ";private StringBuffer mText;private StringBuffer newText = null;private Paint mPaint;/**VIEW的高度*/ private int mHeight = 0;/**行高*/ private static final int LINE_HEIGHT = 40;private int oneLine;//一行显示文字个数 private int number_of_words;//显示的字数 public TypesetTextView(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) {String text = getText().toString();// 获取文本内容 if (null == mText) {//以单例模式对文字进行拆分 mText = new StringBuffer(text);TextPaint paint = getPaint();//获取画笔 paint.setColor(getCurrentTextColor());// 获取文字颜色将其设置到画笔上 paint.setTextSize(getTextSize());//设置文字大小 paint.setTypeface(getTypeface());//设置字体,包括字体的类型,粗细,还有倾斜、颜色等 paint.drawableState = getDrawableState();mViewWidth = getMeasuredWidth();//获取填写字数的宽 mPaint = paint;caculateChangeLine();//对文字进行分行处理 }mLineY = getPaddingTop();//设置头部内边距 mLineY += getTextSize();Layout layout = getLayout();//避免出现空视图 if (layout == null) {return;}Paint.FontMetrics fm = mPaint.getFontMetrics();int textHeight = (int) (Math.ceil(fm.descent - fm.ascent));textHeight = (int) (textHeight * layout.getSpacingMultiplier() + layout.getSpacingAdd());//获取文字的高度 String[] split = newText.toString().split("\n");//将分割好滴文字进行排版 if (null != split && split.length > 0) {//此处设置文本显示的高度,适配一些手机无法显示 int i = (split.length) + 0;//多设置了几行以避免显示不全(看情况进行修改) int setheight = textHeight * i;setHeight(setheight);//设置textview高度 }for (int i = 0; i < split.length; i++) {//此处为源例子上的写法,标点符号换行问题还是存在(楼主引用,ToDBC(aaa)的方法进行了修改,已解决这个bug) // layout.getLineCount()//获取显示的行数 // int lineStart = layout.getLineStart(i); // int lineEnd = layout.getLineEnd(i);//获取每行要显示的字数 String string = split[i];float width = StaticLayout.getDesiredWidth(string, 0,string.length(), getPaint());if (null == string || TextUtils.isEmpty(string)) {continue;}int strWidth = (int) mPaint.measureText(string + "好好");//验证是否足够一个屏幕的宽度 if (needScale(string) && string.trim().length() > number_of_words - 5 && mViewWidth < strWidth)//判断是否足够一行显示的字数,足够久进行字的处理不够则直接画出来 //,避免出现字数不够,字间距被画出来的字间距过大影响排版 {// 判断是否结尾处需要换行,并且不是文本最后一行 drawScaledText(canvas, getPaddingLeft(), split[i], width, i);} else {canvas.drawText(split[i], getPaddingLeft(), mLineY, mPaint);// 将字符串直接画到控件上 }mLineY += textHeight;}}/** * @Description:计算出一行显示的文字 */ private String caculateOneLine(String str) {//对一段没有\n的文字进行换行 String returnStr = "";int strWidth = (int) mPaint.measureText(str);int len = str.length();int lineNum = strWidth / mViewWidth; //大概知道分多少行 int tempWidth = 0;String lineStr;int returnInt = 0;if (lineNum == 0) {returnStr = str;mHeight += LINE_HEIGHT;return returnStr;} else {oneLine = len / (lineNum + 1); //一行大概有多少个字 if (number_of_words < oneLine) {number_of_words = oneLine;}lineStr = str.substring(0, oneLine);tempWidth = (int) mPaint.measureText(lineStr);if (tempWidth < mViewWidth) //如果小了 找到大的那个 {while (tempWidth < mViewWidth) {oneLine++;lineStr = str.substring(0, oneLine);tempWidth = (int) mPaint.measureText(lineStr);}returnInt = oneLine - 1;returnStr = lineStr.substring(0, lineStr.length() - 2);} else//大于宽找到小的 {while (tempWidth > mViewWidth) {oneLine--;lineStr = str.substring(0, oneLine);tempWidth = (int) mPaint.measureText(lineStr);}returnStr = lineStr.substring(0, lineStr.length() - 1);returnInt = oneLine;}mHeight += LINE_HEIGHT;returnStr += "\n" + caculateOneLine(str.substring(returnInt - 1));}return returnStr;}public void caculateChangeLine() {newText = new StringBuffer();String tempStr[] = mText.toString().split("\n");int len = tempStr.length;for (int i = 0; i < len; i++) {String caculateOneLine = caculateOneLine(tempStr[i]);if (!TextUtils.isEmpty(caculateOneLine)) {newText.append(caculateOneLine);newText.append("\n");}}this.setHeight(mHeight);}private void drawScaledText(Canvas canvas, int lineStart, String line,float lineWidth, int currentline) {float x = 0;if (isFirstLineOfParagraph(lineStart, line)) {// 判断是否是第一行 canvas.drawText(TWO_CHINESE_BLANK, x, mLineY, getPaint());float bw = StaticLayout.getDesiredWidth(TWO_CHINESE_BLANK, 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 - lineWidth) / 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 == null || line.length() == 0) {return false;} else {char charAt = line.charAt(line.length() - 1);return charAt != '\n';}}}
安卓TextView文本不满一行由于英文,标点符号等原因换行相关推荐
- 安卓TextView文本框与自定义边框
常用属性 自定义边框 基本使用 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:and ...
- python 文本处理 保留中英文和标点符号_问一下处理英文文本
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 输入一段英文文本,统计出现频率最高的前10个单词(除去of.a.the.and.be.to等无意义词语).提示:在统计单词出现频率之前,需要先进行预处理解 ...
- 安卓 TextView 七宗罪
原文出自 http://blog.csdn.net/zhaizu/article/details/51038113,转载请注明. 安卓自带文本控件 TextView 有七个比较恶心人的地方: 默认情况 ...
- textview是否超过一行_如何实现一个TextView自动换行单词不会被拆分
/** * 单个单词可以显示在两行的TextView * 缺点:setTextView时如果设置了SpannableString,则还需要调用本TextView的setSpan方法再次设置,而且由于T ...
- python 去除所有的中文 英文标点符号
去除英文标点符号 python的string模块下的 punctuation 包含所有的英文标点符号,所以用replace()一下就可以去除. 代码示例: import string stri = ' ...
- Android 应用开发(40)---TextView(文本框)详解
TextView(文本框)详解 1.基础属性详解: 通过下面这个简单的界面,我们来了解几个最基本的属性: 布局代码: <RelativeLayout xmlns:android="ht ...
- 3.3.1 TextView(文本框)
3.3.1 TextView(文本框) 标签: StudyNote 本文声明: 本文由Coder-pig编写,想了解其他内容,可见CoderPig's Android Study Note--目录 尊 ...
- TextView文本尾部添加标签,支持自动换行
文章目录 TextView文本尾部添加标签,支持自动换行 需求 使用SpannableStringBuilder + ImageSpan实现 代码实现 参考 TextView文本尾部添加标签,支持自动 ...
- TextView(文本框)详解
本节引言: 学习完Android中的六大布局,从本节开始我们来一个个讲解Android中的UI控件,本节给大家带来的UI控件是:TextView(文本框),用于显示文本的一个控件,另外声明一点,我不是 ...
最新文章
- 2006鄂土整项目精神
- 深入Java核心 Java内存分配原理精讲
- VisualStudioAddIn2017.vsix的下载安装和使用
- 计算机网络原理(第二章)课后题答案
- mysql-cacti-templates-1.1.2.tar.gz 免费下载 cacti MySQL添加监控
- JAVA中的I/O流
- HDU-1869 六度分离 (矩阵的幂运算求通路个数)
- java v3格式转换wav格式比特率是13kbps_java 压缩mp3 比特率
- 将qq目录下文件写如qq.txt
- Android10支持volte,Nemo_LG V35 安卓10.0解锁Volte(联通、电信、移动)教程_Nemo社区_LinkNemo_关于分享和探索的好地方...
- OpenGL图形旋转
- 雨巷 喜欢文学 喜欢雨中撑伞的姑娘
- 考完软考中级,还可以向高级进阶
- Trie树沉思录(1)
- 一政网:拿到教师资格证后,一定要考编制?一文带你了解,带编教师的优势
- Putty连接树莓派被拒
- acfun html5 player ver 北山 正在加载,AcFun HTML5 Player插件
- mysql无法启动 1067
- DC综合的引导语句——synopsys translate_off/synopsys translate_on/parallel_case/full_case
- 81、基于STM32单片机智能台灯 PWM调光坐姿矫正 灯光控制定时台灯设计
热门文章
- Windows API函数(打印函数)
- pointnet 结果可视化_pointNet代码
- 通俗理解 React 高阶函数
- golang之高阶函数
- linux 下的 service 和systemctl 服务管理方式
- JSZip解压PDF文件并批量下载
- 2021年塔式起重机安装拆卸工(建筑特殊工种)新版试题及塔式起重机安装拆卸工(建筑特殊工种)考试总结
- QT 绘制贝塞尔曲线,并且获得曲线上的点的坐标
- 什么是单例模式和多例模式
- Eclipse Kepler (4.3.2) SR2 安装 Web Tools Platform (WTP)