自定义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绘制流程图

二.自定义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); 

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中 绘制文字

绘制文字画笔 函数表

 绘制方法

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

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


六.自定义View 之 Path 操作

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测量类使用

构造方法
公共方法

无参构造函数:

PathMeasure()

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

有参构造函数:

PathMeasure(Pathpath,booleanforceClosed)

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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,402评论 6 499
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,377评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,483评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,165评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,176评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,146评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,032评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,896评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,311评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,536评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,696评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,413评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,008评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,815评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,698评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,592评论 2 353

推荐阅读更多精彩内容