Android自定义View - Paint

170 阅读2分钟

当我们有了画板,还不行,还需要一支好画笔。

绘制图形相关

Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); // 抗锯齿,更加丝滑,哦不,平滑的画笔

重置画笔

paint.reset();

清除设置的属性。

设置抗锯齿

paint.setAntiAlias(true);

会损失一定的性能

设置线条相交的地方怎么补齐

paint.setStrokeJoin(Paint.Join.MITER);//锐角,延长线相交
paint.setStrokeJoin(Paint.Join.ROUND);//圆弧,平滑曲线连接
paint.setStrokeJoin(Paint.Join.BEVEL);//直线,简单连接顶点为一条直线

画笔比较粗的情况下,效果差异比较明显 设置线帽,即画笔底部的形状

paint.setStrokeCap(Paint.Cap.BUTT);//没有
paint.setStrokeCap(Paint.Cap.ROUND);//圆形
paint.setStrokeCap(Paint.Cap.SQUARE);//方形

设置画笔的宽度

paint.setStrokeWidth(50); //单位,px

设置画笔的样式

paint.setStyle(Paint.Style.FILL);//仅填充内容
paint.setStyle(Paint.Style.FILL_AND_STROKE);//填充内容并描边
paint.setStyle(Paint.Style.STROKE);//仅描边

设置透明度

paint.setAlpha(255);

设置画笔颜色

paint.setColor(Color.RED);

绘制文字相关

TextPaint paint = new TextPaint(Paint.ANTI_ALIAS_FLAG); // 抗锯齿,更加丝滑,哦不,平滑的画笔

设置文字之间的间距

paint.setLetterSpacing(letterSpacing);

设置文字删除线

paint.setStrikeThruText(true);

设置文字下划线

paint.setUnderlineText(true);

设置文字大小

paint.setTextSize(textSize); //单位,px

与TextView不一样的是,TextView的setTextSize()方法单位是sp,这里需要注意

设置字体类型

paint.setTypeface(Typeface.BOLD);

Typeface.BOLD 加粗,Typeface.ITALIC 倾斜, 使用Typeface.create(familyName, style);加载自定义字体

设置文字倾斜

paint.setTextSkewX(-0.25f);	//默认0,官方推荐的-0.25f是斜体

设置文字对齐方式

paint.setTextAlign(Align.LEFT);
paint.setTextAlign(Align.CENTER);
paint.setTextAlign(Align.RIGHT);

计算字符串所占的宽高

void getTextBounds(String text, int start, int end, Rect bounds);

以上为标准方法,text为要计算宽高的字符串,start表示从第几个位置开始截取,end表示截取到第几个位置之前。bounds你要事先创建好一个空的Rect,此方法一调用,Rect就有值了,然后可以通过rect.width()和rect.height()获取宽高。

  • 仅计算字符串的宽度,简要计算文字宽度的方法

    float measureText(String text);
    
  • 精确计算字符串中单个文字的宽度

    int getTextWidths(String text, int start, int end, float[] widths);
    

    获取字符串中每个字符的宽度,并把结果填入参数 widths。事先创建好widths数组,此方法一调用,widths就会被赋值。

文字的基线

FontMetrics fontMetrics = paint.getFontMetrics();
  • 公式1:基于基线顶点,指定左上角的顶点坐标,绘制文本
float baselineY = topY - fontMetrics.top;
  • 公式2:基于基线中间,指定中间位置,绘制文本
float baselineY = centerY + (fontMetrics.bottom-fontMetrics.top)/2-fontMetrics.bottom

通过了公式计算后,使用这个baselineY的值传入参数y,这个就是校准基线后应该绘制的y坐标。