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

简述

自定义控件具有很强的灵活性,可以根据你的想法画出各种各样的图案,在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);
    
android高级自定义View之Paint高级使用(文字绘制)_第1张图片
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);//方形
    
android高级自定义View之Paint高级使用(文字绘制)_第2张图片
image.png
  • 两线相交样式(还是看图,有三种样式应该能明白)

     mPaint.setStrokeJoin(Paint.Join.MITER);//锐角
      mPaint.setStrokeJoin(Paint.Join.ROUND);//圆角
      mPaint.setStrokeJoin(Paint.Join.BEVEL);//直线
    
android高级自定义View之Paint高级使用(文字绘制)_第3张图片
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);
    

文字的基线

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


android高级自定义View之Paint高级使用(文字绘制)_第4张图片
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高级自定义View之Paint高级使用(文字绘制)_第5张图片
android的那点事.jpg

你可能感兴趣的:(android高级自定义View之Paint高级使用(文字绘制))