自定义view
1.布局相关方法
onMeasure(): 测量布局大小,且修改大小。
注意 :测量模式可完全参考 MeasureSpec的真正意义与View大小控制,写的非常好。
onlayout(): 如果改变view在父view的位置。
onSizeChanged(): 布局发生变化的时的回调函数
2.绘制
onDraw(): 如果要改变view绘制的图像,重写此方法
3.事件处理
onKeyDown():
onKeyUp():
onTouchEvent():
4.刷新
invalidate(): 整个view刷新
invalidate(int l,int t,int r, int b): 局部刷新
inivalidate(Rect rect): 刷新一个矩形区域
invalidateDrawable(Drawable): 刷新一个特定的drawable
注意: 函数的主要作用是请求view树的重绘,该函数可以由应用程序调用,或者由系统函数间接调用,如setEnable()、setSeletced()、setVisisblity()都会调用到invalidate()来更新view树的显示。
paint的用法
1.方法
setARGB(): 设置颜色
setAlpha(): 设置透明度
setAntiAlias(): 设置是否抗锯齿
setColor(): 设置颜色
setPathEffect(): 设置绘制路径的路径效果
setShader(): 设置画笔填充的效果(主要是给图形着色)
setShadowLayer(): 设置阴影
setStrokeWidth(): 设置画笔宽度
setStyle(): 设置画笔填充风格
setTextAlign(): 设置文字对齐方式
setStrokeCap(): 设置画笔的形状(比如圆形)
setStrokeJoin(): 设置画笔转弯处的连接风格
canvas绘制
1.绘制几何图形
canvas.drawArc(扇形) canvas.drawCicle(圆) canvas.drawLine(线) canvas.drawPoint(点) canvas.drawRoundRect(圆角矩形) canvas.drawVertices(顶点) canvas.drawPath(路径)
2.绘制图片
canvas.drawBitmap(位图) canvas.drawPicture(图片)
3.文本
canvas.drawText()
canvas的变换操作(如果没有调用restore()方法会一直生效)
canvas.rorate(): 旋转画布
canvas.scale(): 缩放画布
canvas.trasnlate(): 平移画布坐标
canvas.skew(): 扭曲画布,skew详解
canvas的保存与回滚
最简单的理解就是保存(save())可以看作是入栈,回滚(restore())可以看作是出栈,不过一点点区别的是先save了,再进行一系列操作后,接着调用了restore(),会处于save()后那一刻的状态,需要再次调用restore(),才会save()出栈。还有就是save()也好,restore()也好 不会对已经绘制好了的东西生效。
canvas的其他功能补充
path.cubicTo():贝塞尔曲线 参考Android贝塞尔曲线
canvas.clipRect()只会显示被裁剪的区域,之外的区域将不会显示,(这里面最后一个参数很关键,参考canvas.clipRect()的参数
canvas.drawText():绘制文案
Paint.reset(): 重置画笔
例子
--------------------------------------------
//开始绘制文字
mPaint.setStyle(Paint.Style.FILL);
mPaint.setTextAlign(Paint.Align.LEFT);
mPaint.setTextSize(Utils.dp2px(50));
Paint.FontMetrics fontMetrics = new Paint.FontMetrics();
mPaint.getFontMetrics(fontMetrics);
float offsety2 = (fontMetrics.ascent + fontMetrics.descent)/2;
float offsety1 = (rect1.top + rect1.bottom)/2;
canvas.drawText("aaaa",Utils.dp2px(320),mCy - offsety2,mPaint);
canvas所有使用可参考自定义控件之绘图篇(四):canvas变换与操作
文字绘制
1.基准点是baseline
2.Ascent是baseline之上到最字符最高处的距离
3.Descent是baseline之下到字符最低处的距离
4.leading是上一行字符的descent到下一行的ascent之间的距离
5.Top指的是最高字符到baseline的值
6.bottom是最下字符到baseline的值
注意: baseline是基线,baseline以上是负值,baseline以下是正值,因此ascent和top都是负值,descent和bottom都是正值。
可参考 Android绘制文本基本概念之- top, bottom, ascent, descent, baseline
drawText()的深度剖析