关于Android中字体宽度的计算(附高度)

当时使用流式布局写搜索历史,如果输入文字过长会导致重叠堆积。最开始的解决思路是:计算屏幕宽度下,一行最多可以显示多少个字,然后设置下。但后来并没有采用这个方案,而是固定宽度,中间使用省略号。文章可见:

仿各APP搜索历史的实现(greendao+流式布局)

现在有时间回顾代码,就把最开始的思路整理下(准确地讲,当时只限于思路,找了些文章看,但没有实施)。

参考文献:

https://blog.csdn.net/u010661782/article/details/52805939

https://blog.csdn.net/ZoNE17/article/details/39967439

简单点,直接上代码,解析的部分第一篇参考文献可以借鉴。

lenTv = findViewById(R.id.cal_text_len);
        String str = "测试长度";
        lenTv.setText(str);
        Log.e("crsh","屏幕宽度:" + Utils.getScreenWidth(mContext));
        Log.e("crsh","TextView视图的宽度:" + lenTv.getWidth());
        TextPaint tp = new TextPaint();
        tp.setTextSize(14);
        Log.e("crsh","TextPaint测量得出的宽度:" + tp.measureText(str));
        tp.measureText(str);
        Rect rect = new Rect();
        tp.getTextBounds(str,0,str.length(),rect);
        Log.e("crsh","TextPaint测量TextBounds的宽度:" + rect.width());
        int strCount = (int)(Utils.getScreenWidth(mContext) / (rect.width() / str.length()));
        Log.e("crsh","strCount = " + strCount);
        String oneStr = "测";
        StringBuffer stringBuffer = new StringBuffer();
        for (int i = 0; i < strCount; i++) {
            stringBuffer.append(oneStr);
        }
        lenTv.setText(stringBuffer.toString());

打印Log结果:

01-08 16:22:01.913 25125-25125/com.migu.crsh.test.all.crshtestapplication E/crsh: 屏幕宽度:360
01-08 16:22:01.913 25125-25125/com.migu.crsh.test.all.crshtestapplication E/crsh: TextView视图的宽度:0
01-08 16:22:01.923 25125-25125/com.migu.crsh.test.all.crshtestapplication E/crsh: TextPaint测量得出的宽度:56.0
01-08 16:22:01.923 25125-25125/com.migu.crsh.test.all.crshtestapplication E/crsh: TextPaint测量TextBounds的宽度:56
01-08 16:22:01.923 25125-25125/com.migu.crsh.test.all.crshtestapplication E/crsh: strCount = 25
 

代码涉及到的工具类实现:

    public static int getScreenWidth(Context context) {
        DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
        int width = (int)(displayMetrics.widthPixels / displayMetrics.density);
        return width;
    }

    public static int getScreenHeight(Context context) {
        DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
        return displayMetrics.heightPixels;
    }

上述代码有一处是有必要解释下的。

两点:

一、获取屏幕宽度的方法有两类:getResources()和WindowManager 。但最终都是得到DisplayMetrics类的对象或是Display类的对象。

二、计算个数时需要使用dp而非px。所以我对求宽度的工具类的代码做了调整,而求高度的代码没有动。两个对比可知,如果想返回px应该怎么用;如果想返回dp应该怎么用。

结束!?

问题:这个中文的,如果文字包含英文或数字,则会出现问题。解决:

过滤掉中文汉字,剩下的字符除以2,这样的操作使用一个汉字的宽度占两个字符,所以两个英文或是数字字符的宽度等于一个汉字宽。问题转化为:计算汉字个数。可百度众多实现,下面直接贴实现代码:

//过滤中英文  //计算汉字个数
        String regEx = "[\\u4e00-\\u9fa5]";     //中文的Unicode编码范围
        String allChar = str.replaceAll(regEx, "aa");
        int count = allChar.length()-str.length();
        float tempLen = (str.length() - count) / 2 + count;     //除却中文的字符数,除以2

        int strCount = (int)(Utils.getScreenWidth(mContext) / (rect.width() / tempLen));

OK了吧?应该是的。

 

 

你可能感兴趣的:(android)