美文网首页安卓UIAndroid自定义View
Android获取文本的宽度和高度

Android获取文本的宽度和高度

作者: NoBugException | 来源:发表于2019-04-30 14:05 被阅读22次
    (1)获取文本的宽度
    图片.png

    方法一: 测量文本所在的矩形区域,再计算矩形区域的宽

        Rect rect = new Rect();
        mPaint.getTextBounds(text,0,text.length(), rect);
        canvas.drawRect(rect, mPaint);
        float textWidth1 = rect.width();
        Log.d("aaa", "textWidth1:"+textWidth1);
    

    求出矩形的宽度:982.0,上图中的矩形边框就是文本的矩形区域,其特点是紧贴着文字,没有多余的空间。

    方法二: 通过Paint的measureText方法直接测量文本宽度

        float textWidth2 = mPaint.measureText(text);
        Log.d("aaa", "textWidth2:"+textWidth2);
        canvas.drawLine(0, rect.bottom + 20, textWidth2, rect.bottom + 20, mPaint);
    

    求出矩形的宽度:1012.0,比前者稍微大一点,因为前者的矩形区域紧贴文字,没有多余的空间。而通过measureText计算出的宽度会加上开始和结尾的空间,这个空间就是文字和文字之间的空间,为了美观而存在。如上图矩形下面的一条直线就是文字的宽度。

    方法三: 计算出每个文字的宽度,最后计算总和

        float[] textWidths = new float[text.length()];
        mPaint.getTextWidths(text, textWidths);
        float textWidth1 = 0;
        for(int i=0;i<textWidths.length;i++){
            textWidth1 = textWidth1 + textWidths[i];
        }
        Log.d("aaa", "textWidth1:"+textWidth1);
    

    求出矩形的宽度:1012.0,和方式二结果一致。

    方法四: 通过Layout.getDesiredWidth来获取

        TextPaint textPaint = new TextPaint();
        textPaint.setTextSize(280);
        textPaint.setColor(Color.BLUE);
        textPaint.setStrokeWidth(8);
        textPaint.setAntiAlias(true);
        textPaint.setStyle(Paint.Style.FILL);
        float textWidth1 = Layout.getDesiredWidth(text,textPaint);
        Log.d("aaa", "textWidth1:"+textWidth1);
    

    求出矩形的宽度:1012.0,和方式二、方式三结果一致。

    (2)获取文本高度

    首先来画一张图:

    图片.png

    对应的代码是:

    private void init(){
        mPaint = new Paint();
        mPaint.setColor(Color.BLUE);
        mPaint.setAntiAlias(true);
        mPaint.setStrokeWidth(8);
        mPaint.setTextSize(280);
        //mPaint.setTextAlign(Paint.Align.CENTER);
        mPaint.setStyle(Paint.Style.FILL);
    }
    
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
    
        canvas.translate(200, 400);
    
        mPaint.setColor(Color.parseColor("#65A21F"));
    
        canvas.drawLine(-200, 0, canvas.getWidth() - 200, 0, mPaint);
        canvas.drawLine(0, -400, 0, canvas.getHeight() - 400, mPaint);
    
        mPaint.setColor(Color.BLACK);
        mPaint.setStrokeWidth(2);
        mPaint.setStyle(Paint.Style.STROKE);
    
        Rect rect = new Rect();
        mPaint.getTextBounds(text,0,text.length(), rect);
        canvas.drawRect(rect, mPaint);
        float textHeight1 = rect.height();
        Log.d("aaa", "textHeight1:"+textHeight1);
    
        float textWidth = mPaint.measureText(text);//获取文本的宽度
    
        Paint.FontMetrics fontMetrics = mPaint.getFontMetrics();
    
        mPaint.setStyle(Paint.Style.FILL);
        mPaint.setStrokeWidth(2);
    
    
        mPaint.setColor(Color.RED);
        canvas.drawLine(0, fontMetrics.ascent, mPaint.measureText(text), fontMetrics.ascent, mPaint);
        mPaint.setTextSize(50);
        canvas.drawText("ascent", textWidth, fontMetrics.ascent, mPaint);
    
        mPaint.setColor(Color.parseColor("#6EAD24"));
        canvas.drawLine(0, fontMetrics.bottom, textWidth, fontMetrics.bottom, mPaint);
        mPaint.setTextSize(50);
        canvas.drawText("bottom", textWidth, fontMetrics.bottom + 30, mPaint);
    
        mPaint.setColor(Color.parseColor("#13AA9C"));
        canvas.drawLine(0, fontMetrics.descent, textWidth, fontMetrics.descent, mPaint);
        mPaint.setTextSize(50);
        canvas.drawText("descent", textWidth, fontMetrics.descent, mPaint);
    
        mPaint.setColor(Color.parseColor("#9C17B3"));
        canvas.drawLine(0, 0, textWidth, 0, mPaint);
        mPaint.setTextSize(50);
        canvas.drawText("baseline", textWidth, fontMetrics.leading, mPaint);
    
        mPaint.setColor(Color.parseColor("#DF3A72"));
        canvas.drawLine(0, fontMetrics.top, textWidth, fontMetrics.top, mPaint);
        mPaint.setTextSize(50);
        canvas.drawText("top", textWidth, fontMetrics.top, mPaint);
    
        mPaint.setTextSize(280);
        mPaint.setColor(Color.BLUE);
        mPaint.setStrokeWidth(8);
        mPaint.setStyle(Paint.Style.FILL);
    
        canvas.drawText(text, 0, 0, mPaint);
    
    }
    

    方法一: 测量文本所在的矩形区域,再计算矩形区域的高

        Rect rect = new Rect();
        mPaint.getTextBounds(text,0,text.length(), rect);
        canvas.drawRect(rect, mPaint);
        float textHeight1 = rect.height();
        Log.d("aaa", "textHeight1:"+textHeight1);
    

    求出矩形的高度: 277.0,上图中的矩形边框就是文本的矩形区域,其特点是紧贴着文字,没有多余的空间。

    方法二: 通过getFontMetrics()getFontMetricsInt()返回测量数据

    主要有5个测量数据:

    Top: baseline到文本顶部的最大的距离
    Ascent: baseline到文本顶部到推荐距离
    Descent: baseline到文本底部到推荐距离
    Bottom: baseline到文本底部到最大距离
    Leading: 两行文本之间推荐到额外距离,一般为0。

        Paint.FontMetrics fontMetrics = mPaint.getFontMetrics();
    
        float height1 = fontMetrics.descent - fontMetrics.ascent;
        Log.d("aaa", "文本的推荐高度:"+height1);
        float height2 = fontMetrics.bottom - fontMetrics.top;
        Log.d("aaa", "文本的最大高度:"+height2);
    

    文本的推荐高度: 328.125
    文本的最大高度: 371.60156

    方法三: 通过getFontSpacing实现

        float height3 = mPaint.getFontSpacing();
        Log.d("aaa", "文本的高度:"+height3); 
    

    求出文本的高度为:328.125,它的计算结果和方法二求出的推荐高度一致。

    相关文章

      网友评论

        本文标题:Android获取文本的宽度和高度

        本文链接:https://www.haomeiwen.com/subject/qevumqtx.html