自定义View 笔记

一.自定义View绘制流程

1.首先通过构造函数(view初始化)

2.在通过onMeasure() 进行view的大小测量

3.onSizeChanged() 确定view大小

4.onLayout() 确定子布局 包含子view时调用

5.通过onDraw 实际绘制内容. 

6.通过 invalidate() 函数调用可重新 调用 onDraw() 函数绘制内容.

7.通过调用函数requestLayout() 会重新调用 onMeasure() or onLayout() 重新定义view大小和位置. 但不会调用onDraw()重新绘制.


自定义View 笔记_第1张图片
View绘制流程图

二.自定义View分类理解

1.继承自 android.view.View 类 实现自己绘制View 的全自定义 (不包含子View)

2.继承自 ViewGroup 如集成线性布局或者其他布局 实现的自定义组合view (包含子View)

3.继承自原控件 通过修改控件 添加功能或效果 的自定义view


三.自定义View基础控件 Print(画笔) 和 Canvas(画布)

Print: 画笔基础使用方式

1.设置画笔颜色 setColor();

2.设置画笔填充方式 setStyle();

3.设置画笔宽度 setStrokeWidth(10f);

4.设置画笔抗锯齿效果 setAntiAlias();

Canvas:画布基础使用方式:Canvas 是在onDraw(Canvas canvas); 

自定义View 笔记_第2张图片
Canvas绘制图形速查表

Canvas操作函数

(1) tanslate(float x,float y) 位移 ->

     位移是相对于当前位置 如同时使用2次  

     第二次会在第一次位移的坐标上继续位移

     实际就是修改坐标原点的位置 :tanslate(300,400) 就如同 坐标原点从 0,0 平移到了 300,400的位置 再次使用则从 300,400的位置开始计算平移.

(2) scale(float x,float y) or scale(float x,float y,float px,float py) 缩放 ->

     第一个函数 默认缩放的中心就是 坐标原点,第二个函数可以自己给予缩放的中心点.

     缩放也可以像位移一样重复叠加 达到 德罗斯特 的效果
     坐标轴在中心位置时 可以通过 scale(1,-1); 反转Y轴上下位置

(3) rotate(float degress) or rotate(float degress,float px,float py) 旋转 ->

    第一个函数 默认旋转中心就是 坐标原点 , 第二个函数可以自己设置缩放中心点.

(4) skew(folat sx,folat sy) 切错 ->

    skew(1,0) 水平切磋 正方形 斜角45度 切面


四.自定义view中 绘制图片

1.Picture 图像存储器

(1) 使用函数: 

getWidth();  获取存储图像宽度

getHeight();  获取存储图像高度

beginRecording(int width,int height); 开始录制图像 -> 使用该函数后可以开始使用画笔绘制图像

endRecording() 结束图像录制

draw(Canvas canvas) 使用该函数将 图像绘制到view上去

(2) 绘制方法

通过 picture.draw(Canvas canvas)函数绘制,对Canvas状态有影响、且可操作性低.

通过 canvas.drawPicture(Picture picture)函数绘制 , 对Canvas状态无影响,操作性高.

通过 将Picture转换成 PictureDrawable -> 使用 drawable.draw(canvas) 来绘制性能与前者相同.

2.drawBitmap 图形加载器

(1) 通过BitmapFactory 获取Bitmap文件

(2) 加载方式

方法一: 通过画布 canvas.drawBitmap(bitmap,new Matrix(),mPaint); 基于坐标系 0,0 的位置

方法二: 通过画布 canvas.drawBitmap(bitmap,300,300,mPaint); 基于坐标系 0,0 偏移 300,300                位置进行设置.

方法三: 首先设置绘制图像区域 和 图形截取区域

canvas.translate(width/2,height/2);//首先将坐标轴定位到 中心点

canvas.drawCircle(5f,5f,30f,mPaint);

//指定图片绘制区域(左上角四分之一)

Rect src =newRect(0,0,bitmap.getWidth() /2,bitmap.getHeight() /2);

//指定图片在屏幕上的绘制区域

Rect dst =newRect(0,0,200,400);

canvas.drawBitmap(bitmap,src,dst, null);


五.自定义view中 绘制文字

自定义View 笔记_第3张图片
绘制文字画笔 函数表

 绘制方法

  (1) canvas.drawText(str,x,y,mPaint);

  (2) //参数分别为 (字符串 开始截取位置 结束截取位置 基线x 基线y 画笔)  canvas.drawText(str,1,3,200,500,textPaint);


六.自定义View 之 Path 操作

自定义View 笔记_第4张图片
Path常用方法表

操作函数 创建 Path path = new Path(); 对象

(1) path.lineTo(float,float y); 初始位置为 坐标系原点0,0 的位置 连接一条线至 lineTo(float x,float y); 再次使用 起始位置为 上一个path操作结束为止开始.

(2) path.moveTo(float x,float y); 将下次path 的起始位置 行动到 当前坐标系

(3) path.setLastPoint(float x,float y);  改变上一次path 的实际绘制位置

(4) path.close(); 连接最后一个点 和起始点 形成一个封闭图形, 如果无法成为封闭图形,将不做绘制操作.

(5) path.addRect(float left,float top,float rigth,float bottom,Direction.CW); 顾名思义 就是在当前Path下 添加一个矩形, 最后一个参数 是当前形状绘制流程的 顺逆时针. CW/CCW,其他 几个也是相似的添加图形: addRoundRect(); addCircle();

(6) path.addPath(Path src,float fx,float fy); 在原有的Path上添加一个 Path图形 多变叠加效果
    参数1: 为Path对象 参数2: 在x轴下平移 参数3: 在y轴下平移.

(7) path.addArc(RectF rectF,float startAngle,float endAngle); 添加圆弧,  参数2: 起始 度 参数3: 结束 度 例子 addArc(rectF,0,360);  添加圆弧 从0度绘制到 360度

(8) path.arcTo(RectF rectF,float startAngle,float endAngle); 添加圆弧 , 同上述方法一样 只是最后会连接 path最后操作点 和圆弧最后操作点

(9) path 工具方法:
    isEmpty(); 判断 path中是否包含内容.
    isRect();    判断 path当前是否是矩形.
    set(Path path);        将新的 path 覆盖到当前 path 对象中.
    offset (floatdx,floatdy); 平移视图 只作用于path 非画布操作.


七.自定义View 之 PathMeasure Path测量类使用

构造方法
自定义View 笔记_第5张图片
公共方法

无参构造函数:

PathMeasure()

用这个构造函数可创建一个空的 PathMeasure,但是使用之前需要先调用 setPath 方法来与 Path 进行关联。被关联的 Path 必须是已经创建好的,如果关联之后 Path 内容进行了更改,则需要使用 setPath 方法重新关联。

有参构造函数:

PathMeasure(Pathpath,booleanforceClosed)

用这个构造函数是创建一个 PathMeasure 并关联一个 Path, 其实和创建一个空的 PathMeasure 后调用 setPath 进行关联效果是一样的,同样,被关联的 Path 也必须是已经创建好的,如果关联之后 Path 内容进行了更改,则需要使用 setPath 方法重新关联。

该方法有两个参数,第一个参数自然就是被关联的 Path 了,第二个参数是用来确保 Path 闭合,如果设置为 true, 则不论之前Path是否闭合,都会自动闭合该 Path(如果Path可以闭合的话)。

你可能感兴趣的:(自定义View 笔记)