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);// textWidthfloat 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,比较麻烦。)比如是这样配置的:
<TextViewandroid: 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,转换成pxfloat 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转Pxprivate 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.010-22 01:17:42.048: D/Text(21495): #0: I, width=8.0, sum=810-22 01:17:42.049: D/Text(21495): #1: f, width=9.0, sum=1710-22 01:17:42.049: D/Text(21495): #2: , width=7.0, sum=2410-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=21310-22 01:17:42.053: D/Text(21495): #18: , width=7.0, sum=22010-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=57510-22 01:17:42.061: D/Text(21495): #51: g, width=16.0, sum=59110-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最多显示内容请搜索好吧啦网以前的文章或继续浏览下面的相关文章希望大家以后多多支持好吧啦网!
相关文章: