自定义View--绘制

一、paint相关

paint.reset()  重置paint
paint.set(Paint src)  复制src全部属性
Paint.setStyle(Style style) 设置绘制模式:实心(FILL)、空心(STROKE)
Paint.setColor(int color) 设置颜色
Paint.setStrokeWidth(float width) 设置线条宽度
Paint.setStrokeCap(int cap)  设置端点样式:圆头 (ROUND)、平头 (BUTT) 和方头 (SQUARE)
Paint.setAntiAlias(boolean aa) 设置抗锯齿开关
paint.setDither(boolean dither)   设置图像抖动
paint.setTypeface(Typeface typeface)  设置字体
Paint.setTextSize(float textSize) 设置文字大小
paint.setLetterSpacing(float letterSpacing)   设置字符间距
paint.setWordSpacing(float wordSpacing)   设置字间距
paint.setTextScaleX(float scaleX)   X轴缩放
paint.setFakeBoldText(boolean fakeBoldText)  设置粗体
paint.setTextSkewX(float skewX)  设置文字倾斜度
paint.setTextAlign(Paint.Align align)  设置文字对齐方式
paint.setUnderlineText(boolean underlineText)  设置下划线
paint.setStrikeThruText(boolean strikeThruText)   设置删除线
paint.getFontSpacing()  获取推荐的行距
paint.getFontMetrics()  获取排版方面数值
paint.getTextBounds(String text, int start, int end, Rect bounds)  获取文字的显示范围
paint.measureText(String text)   测量文字宽度
paint.breakText(String text, boolean measureForwards, float maxWidth, float[] measuredWidth)  测量有宽度上限的文字宽度
paint.getTextWidths(String text, float[] widths)  获取字符串每个字符宽度
paint.hasGlyph(String string)  判断字符串是单独字型
paint.setShadowLayer(float radius, float dx, float dy, int shadowColor)  设置阴影

paint.setFilterBitmap(boolean filter)   设置是否使用双线性过滤绘制Bitmap
paint.setShader(Shader shader)  设置着色器,设置该值后setColor/ARGB()将失效
paint.setColorFilter(ColorFilter colorFilter)   设置颜色过滤
paint.setXfermode(Xfermode xfermode)  设置图层相交模式
paint.setPathEffect(PathEffect effect)  设置图形轮廓
paint.setMaskFilter(MaskFilter maskfilter)   设置遮罩滤镜

1、Shader着色相关
LinearGradient(float x0, float y0, float x1, float y1, int color0, int color1, Shader.TileMode tile) 线性渐变
RadialGradient(float centerX, float centerY, float radius, int centerColor, int edgeColor, TileMode tileMode)   辐射渐变
SweepGradient(float cx, float cy, int color0, int color1)  扫描渐变
BitmapShader(Bitmap bitmap, Shader.TileMode tileX, Shader.TileMode tileY) 图片着色
ComposeShader(Shader shaderA, Shader shaderB, PorterDuff.Mode mode)  混合着色,当shaderA和shaderB类型相同情况需要关闭硬件加速

2、ColorFilter颜色过滤相关
LightingColorFilter(int mul, int add)   光照色彩过滤器
PorterDuffColorFilter(int color, PorterDuff.Mode mode)  混排颜色过滤器
ColorMatrixColorFilter(ColorMatrix matrix)  矩阵颜色过滤器

3、PorterDuffXfermode(PorterDuff.Mode mode)图层相交模式相关

4、PathEffect轮廓相关
CornerPathEffect(float radius)  图形拐角设置成圆角
DiscretePathEffect(float segmentLength, float deviation)   图形随机偏移
DashPathEffect(float[] intervals, float phase)  虚线
PathDashPathEffect(Path shape, float advance, float phase, PathDashPathEffect.Style style)  带形状的虚线
SumPathEffect(PathEffect first, PathEffect second)  组合两种效果并同时存在
ComposePathEffect(PathEffect outerpe, PathEffect innerpe) 混合成一种效果

5、MaskFilter遮罩相关
BlurMaskFilter(float radius, BlurMaskFilter.Blur style)  模糊效果
EmbossMaskFilter(float[] direction, float ambient, float specular, float blurRadius)   浮雕效果

二、Canvas.drawXXX()相关
1、填充颜色
Canvas.drawColor(int color)
Canvas.drawRGB(int r, int g, int b) 
Canvas.drawARGB(int a, int r, int g, int b)

2、画圆
Canvas.drawCircle(float centerX, float centerY, float radius, Paint paint)

3、画矩形
Canvas.drawRect(float left, float top, float right, float bottom, Paint paint) 
Canvas.drawRect(RectF rect, Paint paint)
Canvas.drawRect(Rect rect, Paint paint)

4、画点
Canvas.drawPoint(float x, float y, Paint paint) 
Canvas.drawPoints(float[] pts, Paint paint)
Canvas.drawPoints(float[] pts, int offset, int count, Paint paint) 

5、画椭圆
Canvas.drawOval(float left, float top, float right, float bottom, Paint paint)
Canvas.drawOval(RectF rect, Paint paint)

6、画线
Canvas.drawLine(float startX, float startY, float stopX, float stopY, Paint paint)
Canvas.drawLines(float[] pts, Paint paint)
Canvas.drawLines(float[] pts, int offset, int count, Paint paint)

7、画圆角矩形
Canvas.drawRoundRect(float left, float top, float right, float bottom, float rx, float ry, Paint paint) 
Canvas.drawRoundRect(RectF rect, float rx, float ry, Paint paint)

8、画扇形
Canvas.drawArc(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean useCenter, Paint paint)  useCenter:是否连接圆心

9、画Bitmap
Canvas.drawBitmap(Bitmap bitmap, float left, float top, Paint paint)
Canvas.drawBitmap(Bitmap bitmap, Rect src, RectF dst, Paint paint) 
Canvas.drawBitmap(Bitmap bitmap, Rect src, Rect dst, Paint paint) 
Canvas.drawBitmap(Bitmap bitmap, Matrix matrix, Paint paint)

10、绘制文字
Canvas.drawText(String text, float x, float y, Paint paint)//无自动换行,不支持\n
Canvas.drawTextOnPath(String text, Path path, float hOffset, float vOffset, Paint paint)
StaticLayout(CharSequence source, TextPaint paint, int width, Layout.Alignment align, float spacingmult, float spacingadd, boolean includepad).draw(canvas)//可自动换行,支持\n

11、画自定义图形
Canvas.drawPath(Path path, Paint paint)

三、Path相关
1、Path.addXxx()相关
(1)添加圆
Path.addCircle(float x, float y, float radius, Direction dir)
(2)添加椭圆
Path.addOval(float left, float top, float right, float bottom, Direction dir)
Path.addOval(RectF oval, Direction dir) 
(3)添加矩形
Path.addRect(float left, float top, float right, float bottom, Direction dir)
Path.addRect(RectF rect, Direction dir) 
(4)添加圆角矩形
Path.addRoundRect(RectF rect, float rx, float ry, Direction dir)
Path.addRoundRect(float left, float top, float right, float bottom, float rx, float ry, Direction dir)
Path.addRoundRect(RectF rect, float[] radii, Direction dir)
Path.addRoundRect(float left, float top, float right, float bottom, float[] radii, Direction dir)
(5)添加另一个 Path
Path.addPath(Path path)
 
2、Path.xxxTo()相关
(1)画直线
Path.lineTo(float x, float y)  //相对(0, 0)
Path.rLineTo(float x, float y) //相对当前位置
(2)画二次贝塞尔曲线
Path.quadTo(float x1, float y1, float x2, float y2) 
Path.rQuadTo(float dx1, float dy1, float dx2, float dy2)
(3)画三次贝塞尔曲线
Path.cubicTo(float x1, float y1, float x2, float y2, float x3, float y3) 
Path.rCubicTo(float x1, float y1, float x2, float y2, float x3, float y3) 
(4)移动到目标位置
Path.moveTo(float x, float y) 
Path.rMoveTo(float x, float y)
(5)画弧形
Path.arcTo(RectF oval, float startAngle, float sweepAngle, boolean forceMoveTo) 
Path.arcTo(float left, float top, float right, float bottom, float startAngle, float sweepAngle, boolean forceMoveTo) 
Path.arcTo(RectF oval, float startAngle, float sweepAngle) 

3、其他
(1)封闭当前图形
Path.close() 
(2)设置填充方式:EVEN_ODD、WINDING (默认值)、INVERSE_EVEN_ODD、INVERSE_WINDING
Path.setFillType(Path.FillType ft) 

四、Canvas.ClipXxx()裁剪相关
1、Canvas.clipRect(float left, float top, float right, float bottom)   矩形裁剪
2、Canvas.clipPath(Path path)  自定义形状裁剪

五、几何变换相关
1、Canvas.translate(float dx, float dy) 平移
2、Canvas.rotate(float degrees, float px, float py) 旋转
3、Canvas.scale(float sx, float sy, float px, float py) 放缩
4、Canvas.skew(float sx, float sy) 错切
5、Canvas.concat(Matrix.setPolyToPoly(float[] src, int srcIndex, float[] dst, int dstIndex, int pointCount)) 用点对点映射的方式设置变换
6、Camera.rotateX(deg) Camera.applyToCanvas(canvas)  x轴三维旋转
7、Camera.rotateY(deg) Camera.applyToCanvas(canvas)  y轴三维旋转
8、Camera.rotateZ(deg) Camera.applyToCanvas(canvas)  z轴三维旋转
9、Camera.rotate(x, y, z) Camera.applyToCanvas(canvas)  三维旋转
10、Camera.setLocation(x, y, z) Camera.applyToCanvas(canvas)  设置虚拟相机的位置

六、绘制顺序

1、自定义ViewGroup中重写dispatchDraw()以外绘制方法,可能需要调用setWillNotDraw(false)
2、onDrawForeground()和android:foreground="@color/colorAccent"是Android6.0加入到View类中,对于6.0以下系统只有FrameLayout支持前景,继承其他View或ViewGroup自定义前景无效

猜你喜欢

转载自blog.csdn.net/yufumatou/article/details/108628777