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文本不满一行由于英文,标点符号等原因换行相关推荐

  1. 安卓TextView文本框与自定义边框

    常用属性 自定义边框 基本使用 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:and ...

  2. python 文本处理 保留中英文和标点符号_问一下处理英文文本

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 输入一段英文文本,统计出现频率最高的前10个单词(除去of.a.the.and.be.to等无意义词语).提示:在统计单词出现频率之前,需要先进行预处理解 ...

  3. 安卓 TextView 七宗罪

    原文出自 http://blog.csdn.net/zhaizu/article/details/51038113,转载请注明. 安卓自带文本控件 TextView 有七个比较恶心人的地方: 默认情况 ...

  4. textview是否超过一行_如何实现一个TextView自动换行单词不会被拆分

    /** * 单个单词可以显示在两行的TextView * 缺点:setTextView时如果设置了SpannableString,则还需要调用本TextView的setSpan方法再次设置,而且由于T ...

  5. python 去除所有的中文 英文标点符号

    去除英文标点符号 python的string模块下的 punctuation 包含所有的英文标点符号,所以用replace()一下就可以去除. 代码示例: import string stri = ' ...

  6. Android 应用开发(40)---TextView(文本框)详解

    TextView(文本框)详解 1.基础属性详解: 通过下面这个简单的界面,我们来了解几个最基本的属性: 布局代码: <RelativeLayout xmlns:android="ht ...

  7. 3.3.1 TextView(文本框)

    3.3.1 TextView(文本框) 标签: StudyNote 本文声明: 本文由Coder-pig编写,想了解其他内容,可见CoderPig's Android Study Note--目录 尊 ...

  8. TextView文本尾部添加标签,支持自动换行

    文章目录 TextView文本尾部添加标签,支持自动换行 需求 使用SpannableStringBuilder + ImageSpan实现 代码实现 参考 TextView文本尾部添加标签,支持自动 ...

  9. TextView(文本框)详解

    本节引言: 学习完Android中的六大布局,从本节开始我们来一个个讲解Android中的UI控件,本节给大家带来的UI控件是:TextView(文本框),用于显示文本的一个控件,另外声明一点,我不是 ...

最新文章

  1. 2006鄂土整项目精神
  2. 深入Java核心 Java内存分配原理精讲
  3. VisualStudioAddIn2017.vsix的下载安装和使用
  4. 计算机网络原理(第二章)课后题答案
  5. mysql-cacti-templates-1.1.2.tar.gz 免费下载 cacti MySQL添加监控
  6. JAVA中的I/O流
  7. HDU-1869 六度分离 (矩阵的幂运算求通路个数)
  8. java v3格式转换wav格式比特率是13kbps_java 压缩mp3 比特率
  9. 将qq目录下文件写如qq.txt
  10. Android10支持volte,Nemo_LG V35 安卓10.0解锁Volte(联通、电信、移动)教程_Nemo社区_LinkNemo_关于分享和探索的好地方...
  11. OpenGL图形旋转
  12. 雨巷 喜欢文学 喜欢雨中撑伞的姑娘
  13. 考完软考中级,还可以向高级进阶
  14. Trie树沉思录(1)
  15. 一政网:拿到教师资格证后,一定要考编制?一文带你了解,带编教师的优势
  16. Putty连接树莓派被拒
  17. acfun html5 player ver 北山 正在加载,AcFun HTML5 Player插件
  18. mysql无法启动 1067
  19. DC综合的引导语句——synopsys translate_off/synopsys translate_on/parallel_case/full_case
  20. 81、基于STM32单片机智能台灯 PWM调光坐姿矫正 灯光控制定时台灯设计

热门文章

  1. Windows API函数(打印函数)
  2. pointnet 结果可视化_pointNet代码
  3. 通俗理解 React 高阶函数
  4. golang之高阶函数
  5. linux 下的 service 和systemctl 服务管理方式
  6. JSZip解压PDF文件并批量下载
  7. 2021年塔式起重机安装拆卸工(建筑特殊工种)新版试题及塔式起重机安装拆卸工(建筑特殊工种)考试总结
  8. QT 绘制贝塞尔曲线,并且获得曲线上的点的坐标
  9. 什么是单例模式和多例模式
  10. Eclipse Kepler (4.3.2) SR2 安装 Web Tools Platform (WTP)