自定义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进阶 - 绘制基本图形
    • 安卓自定义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)
  • ViewSupport - 自定义View工具包

爱哥的---自定义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 动画基础

  • DylanAndroid Android属性动画上手实现各种动画效果,自定义动画,抛物线等
  • MrXI Android全套动画使用技巧
  • IAM四十二 Android 动画总结

自定义view简短篇

教你步步为营掌握自定义View
自定义View,有这一篇就够了

自定义view开源项目练习

  1. NumberProgressBar(代码家)
    这个项目可以熟练掌握如何控制view在界面中的位子

  2. SmallChart
    项目包括折线图、曲线图(可填充)、柱状图、扇形图、雷达图的绘制,让你熟练使用draw()相关类。

  3. CircleImageView
    一个圆形的ImageView

  4. PhotoView
    对ImageView支持各种手势操作,缩放、移动、旋转...熟练掌握手势操作。

  5. AndroidSwipeLayout
    综合

  6. MPAndroidChart
    MPAndroidChart是一款基于Android的开源图表库,MPAndroidChart不仅可以在android设备上绘制各种统计图表,而且可以对图表进行拖动和缩放操作,应用起来非常灵活。MPAndroidChart同样拥有常用的图表类型:线型图、饼图、柱状图和散点图。

  7. Side-Menu.Android
    分类侧滑菜单,吊炸天的效果

  8. WilliamChart
    绘制图表的库,支持LineChartView、BarChartView和StackBarChartView三中图表类型

  9. circular-progress-button
    带进度显示的Button,让操作更炫酷

  10. Context-Menu.Android
    可以方便快速集成漂亮带有动画效果的上下文菜单

  11. ToggleButton
    状态切换的 Button,类似 iOS,用 View 实现

  12. InstaMaterial
    Instagram的一组Material 风格的概念设计

  13. sweet-alert-dialog
    一个带动画效果的自定义对话框样式

  14. 刷新控件集合 适合好好coding一遍
    把这些coding好了,做一个自己专属的刷新控件指日可待

    以上开源项目选择不同类型的撸一个,有空撸个遍,以后觉得是自定义view的大神

建议

参考写现在很火的开源项目的自定义view时,先看看他的效果,然后再自己动脑动手去写,每一个问题都有多种解决方案,开源出来的并不一定是最好的,用自己的思路去写再和别人开源的做对比,取长补短,然后在自定义view这块的造诣将会更深。

简单来说:看效果--->动脑动手写--->对比取长补短

个人博客

github

你可能感兴趣的:(自定义view总结)