自定义view总结
一个高级Android工程师除了要会使用Google原生的view,必须会根据实际项目的酷炫效果自己去写一些自定义view来解决问题,自定义view已经写了不少了,今天来给大家带来一些自定义view总结
自定义view速查表
Canvas常用操作速查表
操作分类 | 相关API | 备注 |
---|---|---|
绘制颜色 | drawColor, drawRGB, drawARGB | 使用单一颜色填充整个画布 |
绘制基本形状 | drawPoint, drawPoints, drawLine, drawLines, drawRect, drawRoundRect, drawOval, drawCircle, drawArc | 依次为 点、线、矩形、圆角矩形、椭圆、圆、圆弧 |
绘制图片 | drawBitmap, drawPicture | 绘制位图和图片) |
绘制文本 | drawText, drawPosText, drawTextOnPath | 依次为 绘制文字、绘制文字时指定每个文字位置、根据路径绘制文字 |
绘制路径 | drawPath | 绘制路径,绘制贝塞尔曲线时也需要用到该函数 |
顶点操作 | drawVertices, drawBitmapMesh | 通过对顶点操作可以使图像形变,drawVertices直接对画布作用、 drawBitmapMesh只对绘制的Bitmap作用 |
画布剪裁 | clipPath, clipRect | 设置画布的显示区域 |
画布快照 | save, restore, saveLayerXxx, restoreToCount, getSaveCount | 依次为 保存当前状态、 回滚到上一次保存的状态、 保存图层状态、 会滚到指定状态、 获取保存次数 |
画布变换 | translate, scale, rotate, skew | 依次为 位移、缩放、 旋转、错切 |
Matrix(矩阵) | getMatrix, setMatrix, concat | 实际画布的位移,缩放等操作的都是图像矩阵Matrix,只不过Matrix比较难以理解和使用,故封装了一些常用的方法。 |
操作类型 | 相关API | 备注 |
---|---|---|
基础方法 | getDensity, getWidth, getHeight,getDrawFilter,isHardwareAccelerated(API 11),getMaximumBitmapWidth,getMaximumBitmapHeight,getDensity,quickReject,isOpaque,setBitmap,setDrawFilter | 使用单一颜色填充画布 |
绘制颜色 | drawColor, drawRGB, drawARGB,drawPaint | 使用单一颜色填充画布 |
绘制基本形状 | drawPoint, drawPoints, drawLine, drawLines, drawRect, drawRoundRect, drawOval, drawCircle, drawArc | 依次为 点、线、矩形、圆角矩形、椭圆、圆、圆弧 |
绘制图片 | drawBitmap, drawPicture | 绘制位图和图片 |
绘制文本 | drawText, drawPosText, drawTextOnPath | 依次为 绘制文字、绘制文字时指定每个文字位置、根据路径绘制文字 |
绘制路径 | drawPath | 绘制路径,绘制贝塞尔曲线时也需要用到该函数 |
顶点操作 | drawVertices, drawBitmapMesh | 通过对顶点操作可以使图像形变,drawVertices直接对画布作用、 drawBitmapMesh只对绘制的Bitmap作用 |
画布剪裁 | clipPath, clipRect, clipRegion,getClipBounds | 画布剪裁相关方法 |
画布快照 | save, restore, saveLayer, saveLayerXxx, restoreToCount, getSaveCount | 依次为 保存当前状态、 回滚到上一次保存的状态、 保存图层状态、 回滚到指定状态、 获取保存次数 |
画布变换 | translate, scale, rotate, skew | 依次为 位移、缩放、 旋转、错切 |
Matrix(矩阵) | getMatrix, setMatrix, concat | 实际画布的位移,缩放等操作的都是图像矩阵Matrix,只不过Matrix比较难以理解和使用,故封装了一些常用的方法。 |
Path常用操作速查表
API21以上,很不爽,得吐槽
作用 | 相关API | 备注 |
---|---|---|
移动起点 | moveTo | 移动下一次操作的起点位置 |
设置终点 | setLastPoint | 重置当前path中最后一个点位置,如果在绘制之前调用,效果和moveTo相同 |
连接直线 | lineTo | 添加上一个点到当前点之间的直线到Path |
闭合路径 | close | 连接第一个点连接到最后一个点,形成一个闭合区域 |
添加内容 | addRect, addRoundRect, addOval, addCircle, addPath, addArc, arcTo | 添加(矩形, 圆角矩形, 椭圆, 圆, 路径, 圆弧) 到当前Path (注意addArc和arcTo的区别) |
是否为空 | isEmpty | 判断Path是否为空 |
是否为矩形 | isRect | 判断path是否是一个矩形 |
替换路径 | set | 用新的路径替换到当前路径所有内容 |
偏移路径 | offset | 对当前路径之前的操作进行偏移(不会影响之后的操作) |
贝塞尔曲线 | quadTo, cubicTo | 分别为二次和三次贝塞尔曲线的方法 |
rXxx方法 | rMoveTo, rLineTo, rQuadTo, rCubicTo | 不带r的方法是基于原点的坐标系(偏移量), rXxx方法是基于当前点坐标系(偏移量) |
填充模式 | setFillType, getFillType, isInverseFillType, toggleInverseFillType | 设置,获取,判断和切换填充模式 |
提示方法 | incReserve | 提示Path还有多少个点等待加入(这个方法貌似会让Path优化存储结构) |
布尔操作(API19) | op | 对两个Path进行布尔运算(即取交集、并集等操作) |
计算边界 | computeBounds | 计算Path的边界 |
重置路径 | reset, rewind | 清除Path中的内容 reset不保留内部数据结构,但会保留FillType. rewind会保留内部的数据结构,但不保留FillType |
矩阵操作 | transform | 矩阵变换 |
Matrix常用操作速查表
方法类别 | 相关API | 备注 |
---|---|---|
基本方法 | equals hashCode toString toShortString | 比较、 获取哈希值、 转换为字符串 |
数值操作 | set reset setValues getValues | 设置、 重置、 设置数值、 获取数值 |
数值计算 | mapPoints mapRadius mapRect mapVectors | 计算变换后的数值 |
设置(set) | setConcat setRotate setScale setSkew setTranslate | 设置变换 |
前乘(pre) | preConcat preRotate preScale preSkew preTranslate | 前乘变换 |
后乘(post) | postConcat postRotate postScale postSkew postTranslate | 后乘变换 |
特殊方法 | setPolyToPoly setRectToRect rectStaysRect setSinCos | 一些特殊操作 |
矩阵相关 | invert isAffine(API21) isIdentity | 求逆矩阵、 是否为仿射矩阵、 是否为单位矩阵 … |
贝塞尔曲线常用操作速查表
表格中演示动画均来自维基百科
贝塞尔曲线 | 对应的方法 | 演示动画 |
---|---|---|
一阶曲线 (线性曲线) |
lineTo | |
二阶曲线 | quadTo | |
三阶曲线 | cubicTo | |
四阶曲线 | 无 |
自定义view进阶参考资料
绘制机制
先好好的理解一下绘制流程 公共技术点之 View 绘制流程
GcsSloop—自定义View系列自定义
- 基础篇
- 进阶篇
- 安卓自定义View进阶 - 分类和流程
- 安卓自定义View进阶 - 绘制基本图形
- 安卓自定义View进阶 - 画布操作
- 安卓自定义View进阶 - 图片文字
- 安卓自定义View进阶 - Path基本操作
- 安卓自定义View进阶 - 贝塞尔曲线
- 安卓自定义View进阶 - Path完结篇(伪)
- 安卓自定义View进阶 - Path玩出花样(PathMeasure)
- 安卓自定义View进阶 - Matrix原理
- 安卓自定义View进阶 - Matrix详解
- 安卓自定义View进阶 - Matrix Camera
- 安卓自定义View进阶 - 事件分发机制原理
- 安卓自定义View进阶 - 事件分发机制详解
- 安卓自定义View进阶 - MotionEvent详解
- 安卓自定义View进阶 - 特殊形状控件事件处理方案
- 安卓自定义View进阶 - 多点触控详解
- 安卓自定义View进阶 - 手势检测(GestureDetector)
爱哥的—自定义View其实很简单
- 自定义控件其实很简单1/12
- 自定义控件其实很简单1/6
- 自定义控件其实很简单1/4
- 自定义控件其实很简单1/3
- 自定义控件其实很简单5/12
- 自定义控件其实很简单1/2
- 自定义控件其实很简单7/12
- 自定义控件其实很简单2/3
- 自定义控件其实很简单3/4
刘某人程序员—Android绘图机制
- Android绘图机制(一)——自定义View的基础属性和方法
- Android绘图机制(二)——自定义View绘制形, 圆形, 三角形, 扇形, 椭圆, 曲线,文字和图片的坐标讲解
- Android绘图机制(三)——自定义View的实现方式以及半弧圆新控件
- Android绘图机制(四)——使用HelloCharts开源框架搭建一系列炫酷图表,柱形图,折线图,饼状图和动画特效,抽丝剥茧带你认识图表之美
Carson_Ho
- Canvas类的最全面详解 - 自定义View应用系列
- Path类的最全面详解 - 自定义View应用系列
- 自定义View基础 - 最易懂的自定义View原理系列(1)
- 自定义View Measure过程 - 最易懂的自定义View原理系列(2)
- 自定义View Layout过程 - 最易懂的自定义View原理系列(3)
- 自定义View Draw过程- 最易懂的自定义View原理系列(4)
- 手把手教你写一个完整的自定义View
- 最易懂的自定义View—自定义view讲解集合
事件传递机制
还是先来理解事件传递机制公共技术点之 View 事件传递
- Carson_Ho Android事件分发机制详解:史上最全面、最易懂
- Kelin 图解 Android 事件分发机制
- milter 可能是讲解Android事件分发最好的文章
- Idtk 更简单的学习Android事件分发
- 希尔瓦娜斯女神 Android View事件机制 21问21答
属性动画
把动画基础了解好来,差不多就出师了公共技术点之 Android 动画基础
自定义view简短篇
教你步步为营掌握自定义View
自定义View,有这一篇就够了
自定义view开源项目练习
NumberProgressBar(代码家)
这个项目可以熟练掌握如何控制view在界面中的位子SmallChart
项目包括折线图、曲线图(可填充)、柱状图、扇形图、雷达图的绘制,让你熟练使用draw()相关类。CircleImageView
一个圆形的ImageViewPhotoView
对ImageView支持各种手势操作,缩放、移动、旋转…熟练掌握手势操作。MPAndroidChart
MPAndroidChart是一款基于Android的开源图表库,MPAndroidChart不仅可以在android设备上绘制各种统计图表,而且可以对图表进行拖动和缩放操作,应用起来非常灵活。MPAndroidChart同样拥有常用的图表类型:线型图、饼图、柱状图和散点图。Side-Menu.Android
分类侧滑菜单,吊炸天的效果WilliamChart
绘制图表的库,支持LineChartView、BarChartView和StackBarChartView三中图表类型circular-progress-button
带进度显示的Button,让操作更炫酷Context-Menu.Android
可以方便快速集成漂亮带有动画效果的上下文菜单ToggleButton
状态切换的 Button,类似 iOS,用 View 实现InstaMaterial
Instagram的一组Material 风格的概念设计sweet-alert-dialog
一个带动画效果的自定义对话框样式刷新控件集合 适合好好coding一遍
把这些coding好了,做一个自己专属的刷新控件指日可待以上开源项目选择不同类型的撸一个,有空撸个遍,以后觉得是自定义view的大神
建议
参考写现在很火的开源项目的自定义view时,先看看他的效果,然后再自己动脑动手去写,每一个问题都有多种解决方案,开源出来的并不一定是最好的,用自己的思路去写再和别人开源的做对比,取长补短,然后在自定义view这块的造诣将会更深。
简单来说:看效果—>动脑动手写—>对比取长补短