美文网首页android高级进阶
android高级自定义View之Paint高级使用(文字绘制)

android高级自定义View之Paint高级使用(文字绘制)

作者: android的那点事 | 来源:发表于2017-11-28 14:12 被阅读57次

    简述

    自定义控件具有很强的灵活性,可以根据你的想法画出各种各样的图案,在Android中如果是自定义控件的话,Paint这个类用的还是较多的,这一篇就来简单介绍Paint这个类的使用.

    基本方法

    • 初始化一个画笔

        Paint mPaint = new Paint();
      
    • 画笔的重置,在自定义控件时,前面设置了画笔的各个参数,如果后面还要用到画笔但要更改参数, 这时就不用重新new一个画笔,直接重置下就可以了

        mPaint.reset();
      
    • 设置画笔的颜色

       mPaint.setColor(Color.RED);
      
    • 设置画笔的样式(有三种样式,看以下图就明白了)

       //Paint.Style.FILL //填充
      //Paint.Style.FILL_AND_STROKE //描边加填充
      //Paint.Style.STROKE;//描边
       mPaint.setStyle(Paint.Style.FILL);
      
    image.png
    • 设置画笔的宽度

      mPaint.setStrokeWidth(30);
      
    • 防锯齿,设置为true时,会损失一定的性能,使用时视情况而定

       mPaint.setAntiAlias(true);
      
    • 设置是否使用图像抖动处理。会使绘制的图片等颜色更加的清晰以及饱满。(也是损失性能)

      mPaint.setDither(true);
      
    • 笔帽,就是画笔画出来的线的两端的样式,(直接看图是按,有三种样式)

        mPaint.setStrokeCap(Paint.Cap.BUTT);//没有样式
        mPaint.setStrokeCap(Paint.Cap.ROUND);//圆形
        mPaint.setStrokeCap(Paint.Cap.SQUARE);//方形
      
    image.png
    • 两线相交样式(还是看图,有三种样式应该能明白)

       mPaint.setStrokeJoin(Paint.Join.MITER);//锐角
        mPaint.setStrokeJoin(Paint.Join.ROUND);//圆角
        mPaint.setStrokeJoin(Paint.Join.BEVEL);//直线
      
    image.png

    文字绘制方法

    • 获取字符行间距

      mPaint.getFontSpacing();
      
    • 获取字符间间距

        mPaint.getLetterSpacing();
      
    • 设置字符间间距

        mPaint.setLetterSpacing(12);
      
    • 设置字符大小

        mPaint.setTextSize(20);
      
    • 文本对齐方式

        mPaint.setTextAlign(Paint.Align.CENTER);//居中
        mPaint.setTextAlign(Paint.Align.LEFT);//左对齐
        mPaint.setTextAlign(Paint.Align.RIGHT);//右对齐
      
    • 设置字体类型

        mPaint.setTypeface(Typeface.DEFAULT_BOLD);
       // Typeface.create(familyName, style)//加载自定义字体
      
    • 文字倾斜 默认0,官方推荐的-0.25f是斜体

      mPaint.setTextSkewX(-0.25f);
      
    • 计算制定长度的字符串(字符长度、字符个数、显示的时候真实的长度)

        //measureForwards为true,从头开始测否则从尾向前测
        //maxWidth 最大的宽度
        //measuredWidth实测长度
        //int breadText = mPaint.breakText(text, measureForwards, maxWidth, measuredWidth)
      
    • Rect bounds获取文本的矩形区域(宽高)

      mPaint.getTextBounds(text, index, count, bounds)
      mPaint.getTextBounds(text, start, end, bounds)
      
    • 获取文本的宽度,和上面类似,但是是一个比较粗略的结果

      float measureText = mPaint.measureText(str);
      
    • 获取文本的宽度,和上面类似,但是是比较精准的。

        float[] measuredWidth = new float[10];
        //measuredWidth得到每一个字符的宽度;textWidths字符数
        int textWidths = mPaint.getTextWidths(str, measuredWidth);
        mPaint.getTextWidths(text, start, end, widths)
        Log.i("RICKY", "measureText:"+measureText+", textWidths:"+textWidths);
      

    文字的基线

    这里着重来讲解一下文字的基线,应该好多同仁都不是很清楚,先看一下下面的图,多像我们小学写拼音的本子啊 >>>>>>>>>>>>>我看了半天还是看不明白,好吧,让我慢慢道来:


    image.png

    先看一下我们绘制文字的方法:

      canvas.drawText(str, X, Y, mPaint);
    

    在这个方法中,X,Y就是确定文字绘制的位置,但是X,Y到底是设多少好呢,其实X还是比较好确认的,这里暂时先不讲,着重讲一下这个Y.
    这个Y不是文字的左上角,而是上图的baseline,这下你应该清楚了吧,为什么每次绘制文字时总时画不到自己想要的位置上了;
    从上图我们可以看出有五种线:

    • top线:就是文字绘制的顶线,文字是不会超过这个顶线的

    • ascent 线:

    • baseline线:就是文字绘制的基准线,但是这个线实际是不存在的

    • descent线:

    • bottom线:就是文字绘制裁的底线,文字是不会越过这个底线的

      FontMetrics fontMetrics = mPaint.getFontMetrics();
        fontMetrics.top;
        fontMetrics.ascent;
        fontMetrics.descent;
        fontMetrics.bottom;
      

    通上以前方法可以得四线的值,其实这些值以基线baseLine为基准来计算的。baseline以上的就是负的;以下的是正的。
    讲到这里你应该清楚了吧,好吧,在这里我再讲二个实例,结合实例应该会更清楚些;

    • 1)实例:指定左上角的顶点坐标 绘制文本

        公式: float baselineY = Y - fontMetrics.top;
      
    • 2)实例:指定中间位置,绘制文本

        公式: float baselineY = centerY + (fontMetrics.bottom-fontMetrics.top)/2 - fontMetrics.bottom
      

    本人做android开发多年,以后会陆续更新关于android高级UI,NDK开发,性能优化等文章,更多请关注我的微信公众号:谢谢!

    android的那点事.jpg

    相关文章

      网友评论

        本文标题:android高级自定义View之Paint高级使用(文字绘制)

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