自定义View之Paint和Canvas

学了自定义View,一直都想整一篇关于自定义View流程中涉及的知识的博客,如下是自定义View的流程,今天将简单说一下onDraw中涉及到的两个类Paint和Canvas。

  1. 自定义属性的声明与获取
     分析需要的自定义属性
     在res/values/attrs.xml中定义声明
     在layout xml 中进行使用
     在View的构造方法中进行获取
  2. 测量onMeasure
  3. 绘制onDraw
  4. 状态的存储与恢复
     重写onSaveInstanceState
     重写onRestoreInstanceState

接下来进入重点
Paint:
Paint类主要保存关于如何绘制几何图形,文本和位图的样式和颜色信息,相当于画画中的画笔

setARGB:
void setARGB (int a, int r, int g, int b)
这个方法使用a,r,g,b来构造颜色,a是一个0-255的值,可以用来设置颜色的透明度,后面三个参数分别对应颜色的RGB(举例颜色#FFFFFF,它的三个颜色通道为R:0xFF,G:0xFF,B:0xFF)

setColor
void setColor (int color)
设置画笔的颜色,参数color是包含alpha以及r,g,b的int值(Color类中有相应的转换方法,比如:Color.rgb(0x00, 0xdd, 0x4d))

setAlpha:
void setAlpha (int a)
辅助setColor, 只分配颜色的alpha值,保持其r,g,b值不变

setAntiAlias
void setAntiAlias (boolean aa)
用于setFlags()的帮助器,设置或清除ANTI_ALIAS_FLAG位AntiAliasing平滑正在绘制的边缘,但对形状内部没有影响,总结来说用来抗锯齿

setDither
void setDither (boolean dither)
Helper for setFlags(),设置或清除DITHER_FLAG位抖动会影响比设备更高精度的颜色如何下采样。 不抖动通常更快,但更高精度的颜色只会被截断(例如8888 - > 565)。 抖动尝试分配此过程中固有的错误,以减少视觉伪影。

setMaskFilter
MaskFilter setMaskFilter (MaskFilter maskfilter)
设置或清除maskfilter对象,画笔设置BlurMaskFilter 可以画出毛玻璃效果,具体效果与BlurMaskFilter 有关
使用方法:mPaint.setMaskFilter(new BlurMaskFilter(strokeWidth, BlurMaskFilter.Blur.SOLID))
strokeWidth为画笔的宽度,BlurMaskFilter.Blur.SOLID为BlurMaskFilter中的枚举类Blur中的值(具体见下图)
自定义View之Paint和Canvas
setStrokeCap
void setStrokeCap (Paint.Cap cap)
设置油漆的帽子,即设置画笔起始的样式,Paint.Cap为Paint中的枚举类,具体值如下图:
自定义View之Paint和Canvas
setStrokeWidth
void setStrokeWidth (float width)
设置画笔的宽度,参数是个float值

setStyle
void setStyle (Paint.Style style)
设置油漆的风格,用于控制原始图的几何形状是如何解释的,Paint.Style为枚举类,其值如下图
自定义View之Paint和Canvas
setTextSize
void setTextSize (float textSize)
为绘制的文字设置大小, 参数textSize必须大于零

Canvas:
Canvas俗称画布,我们可以用Canvas绘制多种形状的图形,包括矩形,圆,圆弧,圆角矩形等

drawLine
void drawLine (float startX, float startY, float stopX, float stopY, Paint paint)
使用指定的绘图绘制一条从(startX,startY)到(stopX, stopY)的线段,由于一条线总是被“框住”,所以画笔中的风格会被忽略。

drawPoint
void drawPoint (float x, float y, Paint paint)
用于绘制单个点的drawPoints()的帮助器。

drawText
void drawText (String text, float x, float y, Paint paint)
使用指定的绘图在原点(x,y)处绘制文本text

drawRect
void drawRect (float left, float top, float right, float bottom, Paint paint)
void drawRect (Rect r, Paint paint)
void drawRect (RectF rect, Paint paint)
用于绘制矩形,Rect和RectF都是矩形类,一个是int初始化的矩形,一个是float初始化的矩形,left,top,right, bottom分别对应于矩形四条边到的一个相对位置

drawRoundRect
void drawRoundRect (RectF rect, float rx, float ry, Paint paint)
void drawRoundRect (float left, float top, float right, float bottom, float rx, float ry, Paint paint)
使用指定的画笔绘制指定的圆角,根据画笔中的风格,该圆形将被填充或框住。

drawCircle
void drawCircle (float cx, float cy, float radius, Paint paint)
使用指定的画笔绘制指定的圆,如果半径<= 0,则不会绘制任何内容,圆形将根据画笔中的样式进行填充或框定。

drawArc
void drawArc (float left, float top, float right, float bottom, float startAngle, float sweepAngle,
boolean useCenter, Paint paint)
void drawArc (RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)
绘制指定的弧,该弧将被缩放以适合指定的椭圆内。圆弧顺时针方向绘制。 0度的角度对应于0度的几何角度(手表上的3点钟)。

Paint和Canvas中还有好多方法,具体可以看API文档(https://www.apiref.com/android-zh/