中英文混排-Textview重写后ellipsize属性失效

问题描述

Textview重写后ellipsize属性失效

最近遇到textview内容中英文符号混排,重写自定义textview绘制后不会提前换行了,但是不显示全部省略号ellipsize属性不起作用,不管是xml还是代码写都看不见省略号了,希望有经验的人能给出更好地解决办法

解决方案

省略号也要自己绘制,所以你要改写你的自定义组件,判断文字宽度是否快达到右侧边缘了,然后加上省略号

解决方案二:

TextView中ellipsize属性
TextView中ellipsize属性
TextView中ellipsize属性
----------------------

解决方案三:

代码能否贡献出来,让我等参谋参谋

解决方案四:

package com.mtextview;

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;

public class MTextView extends TextView {

private int mLineY;
private int mViewWidth;
public static final String TWO_CHINESE_BLANK = "  ";

public MTextView(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();

    // layout.getLayout()在4.4.3出现NullPointerException
    if (layout == null) {
        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(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 lineWidth) {
    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 - 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 {
        return line.charAt(line.length() - 1) != '
';
    }
}

}

时间: 2024-12-21 05:55:13

中英文混排-Textview重写后ellipsize属性失效的相关文章

中英文混排时的最佳化状态

  汉字(以下中文字称呼)以及受其影响的日文.韩文有一个很大的特色,就是其文字的造型为方块形的文字基本元素.也因为如此,中文在书写的时候会有直书以及横书两种书写应用方式. 相信大家阅读过直行排版的中文书籍,直书是中文字最传统的排版方式,中文字从发展以来一直到毛笔书写.篆刻.一直到活字印刷,直式编排一直都是中文字特有的编排方式. 而在中文传统的匾额.春联上的横式缩写.其实是一字一行的直写编排,因此其书写方向亦为由右至左的书写方式,知道这点以后,下次记得别再买到横批为由左至右书写印刷春联啦. 正由于

实现中英文混排字符串截取的php代码

提到中英文混排计数.截取,大家首先想到的是ascii.16进制.正则匹配.循环计数. 今天我给大家分享的是php的mb扩展,教你如何轻松处理字符串. 先给大家介绍用到的函数: mb_strwidth($str, $encoding) 返回字符串的宽度 $str 要计算的字符串 $encoding 要使用的编码,如 utf8.gbk mb_strimwidth($str, $start, $width, $tail, $encoding) 按宽度截取字符串 $str 要截取的字符串 $start

Word中如何清除中英文混排文档中的英文

为了提高个人专业技术水平,单位又让上交阶段性学习笔记.专业技术论文了,不过上有政策下有对策,同事们利用计算机点点鼠标从网上复制粘贴来完成此项工作.但有时一不留神发现搞下来的东西太高深,竟然是中英文混排的,太超过笔者的水平了,思前想后还是把这些英文都干掉的好. 在Word中单击"编辑/替换",在打开的"查找和替换"对话框中的"替换"选项卡下,单击"查找内容"框,输入[^1-^127],"替换为"框中什么也不用

php strlen mb_strlen计算中英文混排字符串长度_php技巧

比较strlen和mb_strlen 当字符全是英文字符的时候,两者是一样.这里主要比较一下,中英文混排的时候,两个计算结果.(测试时编码方式是UTF8) 复制代码 代码如下: <?php $str='中文a字1符'; echo strlen($str); echo '<br />'; echo mb_strlen($str,'UTF8'); //输出结果 //14 //6 ?> 结果分析:在strlen计算时,对待一个UTF8的中文字符是3个长度,所以"中文a字1符&q

js汉字排序问题 支持中英文混排,兼容各浏览器,包括CHROME_javascript技巧

具体技术 1.使用GB编码与UNICODE的转换 2.数组关联排序 注意:GB编码 库地址 http://demo.jb51.net/jslib/qswhGB2312.js 代码(demo写的很简陋) 复制代码 代码如下: <script> //power by 毛绒猫猫 liuyutong@baidu.com var strGB="啊阿埃挨哎唉哀皑癌蔼矮艾碍爱隘鞍氨安俺按暗岸胺案肮昂盎凹敖熬翱袄傲奥懊澳芭捌扒叭吧笆八疤巴拔跋靶把耙坝霸罢爸白柏百摆佰败拜稗斑班搬 扳般颁板版扮拌伴瓣半

字符串处理:中英文混排固定长度截取问题

/// <summary>    /// 从包含中英文的字符串中截取固定长度的一段,strInput为传入字符串,intLen为截取长度(一个汉字占两个位).    /// </summary>    public string cutString(string strInput,int intLen)    {     strInput=strInput.Trim();     byte[] myByte = System.Text.Encoding.Default.GetByt

php mb_strwidth函数实现中英文混排字符串截取

mb_strwidth($str, $encoding) 返回字符串的宽度 $str 要计算的字符串 $encoding 要使用的编码,如 utf8.gbk mb_strimwidth($str, $start, $width, $tail, $encoding) 按宽度截取字符串 $str 要截取的字符串 $start 从哪个位置开始截取,默认是0 $width 要截取的宽度 $tail 追加到截取字符串后边的字符串,常用的是 ... $encoding 要使用的编码  代码如下 复制代码 <

php轻松实现中英文混排字符串截取_php技巧

先给大家介绍用到的函数: 复制代码 代码如下: mb_strwidth($str, $encoding) 返回字符串的宽度$str 要计算的字符串$encoding 要使用的编码,如 utf8.gbk 复制代码 代码如下: mb_strimwidth($str, $start, $width, $tail, $encoding) 按宽度截取字符串$str 要截取的字符串$start 从哪个位置开始截取,默认是0$width 要截取的宽度$tail 追加到截取字符串后边的字符串,常用的是 ...$

Android中使用TextView实现图文混排的方法_Android

向TextView或EditText中添加图像比直接添加文本复杂一点点,需要用到<img>标签. <img>只有一个src属性,该属性原则上应该指向一个图像地址或可以找到某个图像资源的唯一标识.但要注意的是,系统并不会直接根据src属性所指的值自动获取和显示图像,这一切都需要我们去做.说白了,src属性指的是什么只有开发者自己知道.开发者需要告诉系统src属性到底指的是什么,然后系统才会知道怎么做. 解析src属性值需要ImageGetter对象的getDrawable方法来完成.