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最多显示内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • android开发教程之textview内容超出屏幕宽度显示省略号

    实现如下: 复制代码 代码如下: <TextView android:layout_width="fill_parent"                    android:layout_height="wrap_content"                   android:id="@+id/hello"                    android:ellipsize="end"          

  • Android中TextView显示圆圈背景或设置圆角的方法

    前言 在我们学习android这么久,而且使用TextView那么长时间,我们一直没有用过给TextView添加背景,或者是给TextView添加添加边框,以及怎么样设置TextView的形状.今天在写代码的时候就用到了,怎么在java代码部分设置TextView的背景,和TextView的形状及边框. 方法如下: 接下来我们来看一下,怎么在Java代码部分怎么设置TextView的背景颜色,其实很简单的就一句话. tvTemp.setBackgroundColor(Color.parseCol

  • Android设置TextView显示指定个数字符,超过部分显示...(省略号)的方法

    本文实例讲述了Android设置TextView显示指定个数字符,超过部分显示...(省略号)的方法.分享给大家供大家参考,具体如下: 一.问题: 今天在公司遇到一个需求:TextView设置最多显示8个字符,超过部分显示...(省略号) 二.解决方法: 网上找了很多资料,有人说分别设置TextView的android:signature="true",并且设置android:ellipsize="end";但是我试了,并没有成功,最后自己试出一种方式如下:供大家参

  • Android编程开发之TextView文字显示和修改方法(附TextView属性介绍)

    本文实例讲述了Android编程开发之TextView文字显示和修改方法.分享给大家供大家参考,具体如下: 一. 新建一个Activity 和 Layout 首先在layout文件夹中新建一个activity_main.xml,在新建工程的时候一般默认会新建此xml文件,修改其代码如下: activity_main.xml 代码 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" x

  • Android实现在TextView文字过长时省略部分或滚动显示的方法

    本文实例讲述了Android实现在TextView文字过长时省略部分或滚动显示的方法.分享给大家供大家参考,具体如下: TextView中有个ellipsize属性,作用是当文字过长时,该控件该如何显示,解释如下: 1.android:ellipsize="start"-–省略号显示在开头 2.android:ellipsize="end"--省略号显示在结尾 3.android:ellipsize="middle"--省略号显示在中间 4.an

  • 利用Android中的TextView实现逐字显示动画

    前言 Android的TextView只能设置整个TextView的动画,而不能设置每个文字的动画.即使是使用TextSwitcher,也很难实现我想要的效果. 所以选择自定义一个.大体思路是:继承ViewGroup,设置Text的时候,每个文字为一个TextView,每隔一个固定时间,启动每个TextView的动画. 定义一个CTextView,继承ViewGroup: 实现主要代码: public class CTextView extends ViewGroup { } 向外提供一个方法s

  • Android中TextView实现超过固定行数显示“...展开全部”

    前言 大家都知道,如果要让TextView只显示一行,多出部分用省略号代替的话非常容易,只需要为xml文件中的TextView控件添加android:singleLine="true"即可,那么如果我想让它显示多行的时候应该怎么做呢? 废话不多说,先看效果图: 展开前: 展开后: 示例代码: 工具类: /** * 设置textView结尾...后面显示的文字和颜色 * @param context 上下文 * @param textView textview * @param minL

  • android如何获取textview最多显示

    方法一 工作中用的一个方法,虽然不算特别准确,但效果还是不错的,这里分享下. /** * 获取textview最大能显示几个字 * @param text 文本内容 * @param size 文本字体大小 * @param maxWidth textview的最大宽度 * @return */ private float getLineMaxNumber(String text, float size,float maxWidth) { if (null == text || "".

  • 在Android TextView中显示图片的4种方式详解

    我们知道,TextView控件一般是用来显示文本的,而图片一般是用ImageView控件来显示. 那TextView能否显示图片呢?答案是肯定的!下面列出常见的4种方式. 1.XML文件中指定属性值 这种方式应该是最常用的了,在TextView的左上右下显示图片,可用  android:drawableLeft  android:drawableTop  android:drawableRight  android:drawableBottom 比如我们要在TextView的顶部设置图片,代码如

  • Android TextView高级显示技巧实例小结

    本文实例总结了Android TextView高级显示技巧.分享给大家供大家参考,具体如下: 1. 自定义字体 可以使用setTypeface(Typeface)方法来设置文本框内文本的字体,而Android的 Typeface又使用TTF字体文件来设置字体 所以,我们可以在程序中放入TTF字体文件,在程序中使用Typeface来设置字体:第一步,在assets目录下新建fonts目录,把TTF字体文件放到这里.第二步,程序中调用: TextViewtv = (TextView)findView

  • Android开发实现TextView显示丰富的文本

    本文实例讲述了Android开发实现TextView显示丰富的文本的方法.分享给大家供大家参考,具体如下: 如图,显示html的元素控件,点击连接实现上网,发email,拨号 实现源码如下: MainActivity.java package com.example.textview2; import android.os.Bundle; import android.app.Activity; import android.text.Html; import android.text.meth

  • Android获取网络图片并显示的方法

    本文实例为大家分享了Android获取网络图片并显示的具体代码,供大家参考,具体内容如下 使用 HttpURLConnection 获得连接,再使用 InputStream 获得图片的数据流,通过 BitmapFactory 将数据流转换为 Bitmap,再将 Bitmap 通过线程的 Message 发送出去,Handler 接收到消息就会通知 ImageView 显示出来. 记得要在manifest文件中添加 < uses-permission android:name="androi

  • Android开发中TextView文本过长滚动显示实现方法分析

    本文实例讲述了Android开发中TextView文本过长滚动显示实现方法.分享给大家供大家参考,具体如下: 项目中在使用TextView时,总会有因要显示的内容过多而需要我们进行处理的问题.我们第一时间想到的是TextView的android:ellipsize属性,比如 android:ellipsize="end",效果是在文字的尾部打三个小点. 但是这个属性要配合android:singLine="true"使用.通常来说,要实现尾端三个点的省略号形式是比较

  • Android文本视图TextView实现聊天室效果

    本文实例为大家分享了Android文本视图TextView实现聊天室的具体代码,供大家参考,具体内容如下 Math.random()生成随机数的范围是 0 到 1 之间的 日期时间格式new SimpleDateFormat("dd-MM-yyyy HH:mm:ss"); //年-月-日 时:分:秒  : HH大写24小时, String类的format()方法用于创建格式化的字符串以及连接多个字符串对象. MainActivity package com.example.junior

随机推荐