view系列-简解自定义view绘制

508 阅读3分钟

自定义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()的深度剖析