android如何获取textview最多显示

 更新时间:2021年06月02日 10:35:33   作者:一叶飘舟Finder  
今天在公司遇到一个需求;TextView设置最多显示8个字符,超过部分显示...(省略号),那么android如何获取textview最多显示,感兴趣的可以了解一下

方法一

工作中用的一个方法,虽然不算特别准确,但效果还是不错的,这里分享下。

    /**
     * 获取textview最大能显示几个字
     * @param text 文本内容
     * @param size 文本字体大小
     * @param maxWidth textview的最大宽度
     * @return
     */
    private float getLineMaxNumber(String text, float size,float maxWidth) {
        if (null == text || "".equals(text)){
            return 0;
        }
        Paint paint = new Paint();
        paint.setTextSize(size);
        //得到文本内容总体长度
        float textWidth = paint.measureText(text);
        // textWidth
        float width = textWidth / text.length();
        float total = maxWidth / width;
        return total;
    }

上面这个方法不太精确,不过比较适合在 RecyclerView 或 ListView 里面使用,避免生成太多对象

方法二

/**
     * 获取textview一行最大能显示几个字(需要在TextView测量完成之后)
     *
     * @param text     文本内容
     * @param paint    textview.getPaint()
     * @param maxWidth textview.getMaxWidth()/或者是指定的数值,如200dp
     */
    private int getLineMaxNumber(String text, TextPaint paint, int maxWidth) {
        if (null == text || "".equals(text)) {
            return 0;
        }
        StaticLayout staticLayout = new StaticLayout(text, paint, maxWidth, Layout.Alignment.ALIGN_NORMAL
                , 1.0f, 0, false);
        //获取第一行最后显示的字符下标
        return staticLayout.getLineEnd(0);
    }

利用 StaticLayout 可以非常轻松的得到一行可以显示的最大字符数

延伸:
对于一个单行 TextView,当字符串超出一行时,如何获取未显示的部分字符串?
textview 设定最大行数为 1 后,文本超出了 textview,textView 末尾显示省略号,我就想知道省略号代表的内容
思路:
假设 TextView 的宽度是在 xml 内设置的具体数值,比如 300dp,
(目的是为了简化这个问题,如果设置为 match_parent 或者 wrap_content,需要在程序运行时计算其宽度,而直接 getWidth 总是返回 0,比较麻烦。)
比如是这样配置的:

  <TextView
        android:id="@+id/textView"
        android:layout_width="300dp"
        android:layout_height="wrap_content"
        android:ellipsize="end"
        android:singleLine="true" />

然后填充了一个超长的字符串,比如这样:

String str = "If you really want to hear about it, the first thing you'll probably want to know";
这样就会导致显示不全,像这样:
If you really want to hear about it, the first thin...

所以,如果你想得到已显示的字符个数,或者未显示的字符个数,那么其中的关键是如何计算每一个字符的宽度。
然后遍历这个字符串,当前n个字符宽度总和,超过TextView宽度时,就得到了已显示的字符个数。

String str = "If you really want to hear about it, the first thing you'll probably want to know";
mTextView = (TextView) findViewById(R.id.textView);

// 计算TextView宽度:xml中定义的宽度300dp,转换成px
float textViewWidth = convertDpToPixel(300);
float dotWidth = getCharWidth(mTextView, '.');
Log.d(TAG, "TextView width " + textViewWidth);

int sumWidth = 0;
for (int index=0; index<str.length(); index++) {
    // 计算每一个字符的宽度
    char c = str.charAt(index);
    float charWidth = getCharWidth(mTextView, c);
    sumWidth += charWidth;
    Log.d(TAG, "#" + index + ": " + c + ", width=" + charWidth + ", sum=" + sumWidth);
    
    if (sumWidth + dotWidth*3 >= textViewWidth) {
        Log.d(TAG, "TextView shows #" + index + " char: " + str.substring(0, index));
        break;
    }
}

// Dp转Px
private float convertDpToPixel(float dp){
    Resources resources = getResources();
    DisplayMetrics metrics = resources.getDisplayMetrics();
    float px = dp * (metrics.densityDpi / 160f);
    return px;
}

// 计算每一个字符的宽度
public float getCharWidth(TextView textView, char c) {
    textView.setText(String.valueOf(c));
    textView.measure(0, 0);
    return textView.getMeasuredWidth();
} 

结果如下,在荣耀 3C 和 LG G3 上测试通过(G3 比计算的结果,多显示了一个字符):

10-22 01:17:42.046: D/Text(21495): TextView width 600.0
10-22 01:17:42.048: D/Text(21495): #0: I, width=8.0, sum=8
10-22 01:17:42.049: D/Text(21495): #1: f, width=9.0, sum=17
10-22 01:17:42.049: D/Text(21495): #2:  , width=7.0, sum=24
10-22 01:17:42.049: D/Text(21495): #3: y, width=14.0, sum=38
......
10-22 01:17:42.053: D/Text(21495): #17: t, width=9.0, sum=213
10-22 01:17:42.053: D/Text(21495): #18:  , width=7.0, sum=220
10-22 01:17:42.053: D/Text(21495): #19: t, width=9.0, sum=229
......

10-22 01:17:42.061: D/Text(21495): #50: n, width=16.0, sum=575
10-22 01:17:42.061: D/Text(21495): #51: g, width=16.0, sum=591
10-22 01:17:42.061: D/Text(21495): TextView shows #51 char: If you really want to hear about it, the first thin

到此这篇关于android获取textview最多显示的文章就介绍到这了,更多相关android textview最多显示内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Android编程获取并设置Activity亮度的方法

    Android编程获取并设置Activity亮度的方法

    这篇文章主要介绍了Android编程获取并设置Activity亮度的方法,涉及Android针对屏幕亮度的相关操作技巧,需要的朋友可以参考下
    2015-12-12
  • Android实现图片区域裁剪功能

    Android实现图片区域裁剪功能

    这篇文章主要为大家详细介绍了Android实现图片区域裁剪功能,调用相册、拍照实现缩放、切割图片,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • android中圆角图像生成方法

    android中圆角图像生成方法

    这篇文章主要介绍了android中圆角图像生成方法,涉及Android处理圆角图像的技巧,需要的朋友可以参考下
    2015-04-04
  • Android Messenger实现进程间双向通信

    Android Messenger实现进程间双向通信

    这篇文章主要为大家详细介绍了Messenger实现进程间双向通信,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • Android实用的Toast工具类封装

    Android实用的Toast工具类封装

    这篇文章主要为大家详细介绍了Android实用Toast工具类的封装,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • Android第三方微信支付教程

    Android第三方微信支付教程

    这篇文章主要为大家详细介绍了Android第三方微信支付教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • Android仿微信支付密码弹出层功能

    Android仿微信支付密码弹出层功能

    最近项目中使用到了支付密码功能,感觉这类界面应该是比较常用的,涉及支付密码的输入的一般都会用到吧,所以单独地把这部分抽取出来,有需要的朋友可以拿去用用
    2017-04-04
  • 获取Android界面性能数据的快捷方法

    获取Android界面性能数据的快捷方法

    这篇文章主要介绍了获取Android界面性能数据的快捷方法,帮助大家更好的理解和学习使用Android开发,感兴趣的朋友可以了解下
    2021-04-04
  • Android自定义View实现多图片选择控件

    Android自定义View实现多图片选择控件

    这篇文章主要为大家详细介绍了Android自定义View实现多图片选择控件,具有一定的实用性,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • Android自定义Camera实现拍照功能

    Android自定义Camera实现拍照功能

    这篇文章主要为大家详细介绍了Android自定义Camera实现拍照功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05

最新评论