一、前言
这篇文章主要是对自己看过的自定义view的一些知识进行一些汇总,不会对一些api的细节进行讲解,所以篇幅不会太长,主要是帮助大家对自定义view进行了解,以及学习自定义view需要从哪些地方入手。
二、预备
1.为什么要自定义view
1)现有的view满足不了我们的需求,界面的一些元素需要我们自己去绘制。
2)现有的view可以满足我们的需求,自定义view只是为了抽象,为这个自定义view提供若干方法,可以将我们的一些内部逻辑封装到里面,方便调用,说简单点就是提高代码的复用率。
2.自定义view的好处
1)我们可以实现一些系统控件无法实现的绚丽效果,为应用增色。
2)将一些比较通用的交互效果提取成自定义view,方便复用,减少不必要的重复劳动。
3)将控件的一些内部逻辑封装到自定义view中,也能够便于应用解耦,我们在使用的时候不必关心它的内部实现。
三、正题
1.自定义view分类
其实简单的来分的话,自定义view我们可以分成两大种:组合控件和完全自定义控件。再细分一下,我们还可以分成四种:直接继承view,直接继承viewgroup,继承特定view,继承特定viewgroup。当然分类的标准并不统一,进行分类只是帮助我们在进行自定义的时候更加明确自己的方向,所以不用纠结到底该怎么去分类。
2.自定义view基础
要想随心所欲的去自定义view,我们首先需要了解一些基础知识:
1)view的位置参数,即top、left、right、bottom,当然你必须也要知道view是按什么标准来定义坐标系的。
2)MotionEvent和TouchSlop
3)VelocityTracker、GestureDetector和Scroller
4)Configuration和ViewConfiguration(提供了一些标砖常量)
5)ViewDragHelper(实现一些拖拽效果)
6)View、SurfaceView、TextureView的区别
3.自定义view的流程
为了让大家可以更加形象的了解,先贴一张图:
- Constructors
- onMeasure
- onLayout
- onSizeChanged
- onDraw
4.自定义view的精髓
上面我也说道了onDraw是自定义view最重要的一部分,在这里你可以自由发挥你的创造力和想象力,这时你就需要了解一些细节了。
Canvas常用方法
绘制图形(点、线、矩形、椭圆、圆等)
绘制文本(文本的居中问题,需要Paint知识)
画布的基本变化(平移、缩放、旋转、倾斜)
画布的裁剪
画布的保存
Paint常用方法
颜色
类型(填充、描边)
字体大小
宽度
对齐方式
文字位置属性测量
文字宽度测量
笔锋
Path常用方法
添加路径
移动起点
贝塞尔(二阶、三阶)
逻辑运算
重置路径
PathEffect
Matrix
PathMeasure
5.自定义view的拓展
如果上面的内容你都已经掌握了,那么你应该是可以绘制出丰富多彩的自定义view了。但是这还不够,这就好比一幅画,虽已具形态,但是还差点睛之笔让它活起来。我们给自定义view duang~duang~duang添加特效自然离不开动画,这里强烈推荐的是属性动画,不要问我为什么-_-。
属性动画需要掌握的,标星的是重点!!!
ObjectAnimator
ValueAnimator
AnimatorSet
AnimatorListener和AnimatorListenerAdapter
※插值器(Interpolator)
※估值器(TypeEvaluator)
好了,现在我的自定义view也已经动起来了,是不是就大功告成了啊。NO,还不够,我们还需要交互啊。so,看下面
View事件分发
dispatchTouchEventonInterceptTouchEvent
onTouchEvent
onTouchListener
onClick
onLongClick
滑动冲突
View的滑动
Scrollerinvalidate和requestLayout的传递(要明白两者之间的区别)
四、结束语
至此,文章的内容就结束了,上面主要是基于2D层面去介绍的,假如有兴趣,大家还可以研究一下OpenGl、Camera等用法,让你的自定义view效果看起来更绚丽。在这里也给大家一些建议,千万别一言不合就自定义,能够用系统基础的控件去实现的尽量用系统的,因为系统自带效率会更高一些(谷歌进行优化过了),而且自定义view需要耗费较长的时间,又不一定能保证有系统控件的那么高的效率。
假如有什么遗漏的,欢迎大家补充。