主要用于记录自身学习UI方面心得,该学习笔记主要从以下几个方面着手:
##1.基本控件的学习
无论是学习控件还是自定义View,首先都需要掌握View的生命周期,尽管很少地方涉及,但周期的确很重要:  如果想觉得这个周期不是很清楚,想关注更多细节,可以通读此文[自定义View](http://chen-wei.me/2017/02/16/%E6%95%B4%E4%B8%AA%E8%87%AA%E5%AE%9A%E4%B9%89View/)
##2.自定义View的学习
进入自定义View,必须清楚以下基本点:
1.在数学中常见坐标系与屏幕默认坐标系的区别
2.View的坐标系是相对于父控件而言的,即(getTop(),getLeft(),getBottom(),getRight())
3.MotionEvent中getX() & getY()与getRawX & getRawY区别
4.角度和弧度的区别 rad(弧度)°(角度) rad=deg\*pi/180 deg = rad*180/pi 屏幕坐标中角度增大方向是顺时针而数学系则反之
5.颜色,ARGB(四通道,透明,红,绿,蓝,值从0x00-0xff表示透明到不透明,色值从浅值深)dst表示canvas原有的内容 src表示新的内容 **自定义View基本流程**
step1: View初始化(构造函数)
step2: 测量View的大小(onMeasure)
step3: 确定View大小(onSizeChanged)
step4: 确定View布局位置(onLayout,通常存在子View才需要)
step5: 实际绘制(onDraw)
step6: 控制View或监听View的某些状态(如:onTouchEvent,onClickListener)
绘制的时候最重要的东西就Canvas(画布),Paint(画笔)以及图层
理解图层状态栈的意义,理解save和restore & saveLayer*** & restoreToCount & saveFlags等
采用Canvas绘制图片时,一般使用两个方法drawPicture(矢量图) & drawBitmap(位图)
1.drawPicture就好比录制,一般采用beginRecording和endRecording方法,方法成对出现,相当于把该区间内的绘制动作录下来,后面就可以重复该操作了,省时省力,建议使用canvas.drawPicture执行录制的东西,该方法不影响canvas状态 (但该方法使用需要关闭硬件加速)
2.drawBitmap,bitmap就是问题的根源,什么OOM都很容易导致,至于这个方法大家都很熟悉不记录了,不过做帧动画的不妨尝试下这个方法
绘制文字主要分三类:
1.只能指定文本基线位置;
2.可以指定每个文字的位置,但必须每个文字的位置都要指定,否则crash,且该方法性能不佳
3.指定一个路径,根据路径绘制文字
现在登场的是Path,为了避免没必要的问题,请关闭硬件加速
第一组方法:moveTo & setLastPoint & lineTo & close
第二组方法:addXxx & arcTo,主要在path上添加基本图形
demo中RadaView就是对save和Path的具体实战
PathMeasure使用
在使用PathMeasure之前,先确定其与一个Path相关联,如果后续对Path进行了更改,需重新调用setpath更新。
*重要方法*:
setPath:是PathMeasure与Path关联的重要方法
isClosed:用于判断Path是否闭合
getLength用于获取Path的总长度
getSegment:用于获取Path的一个片段
nextContour:用于跳转到下一条曲线,如果跳成功则返回true;
getPosTan:用于获取路径上某个长度的位置以及该位置正切值
getMatrix:得到某一长度的位置以及该位置的正切值的矩阵
关于PathMeasure的实践可以参考PathMeasureView和SearchView
**Matrix的学习**
首先明白一点就是内容坐标和屏幕坐标相差一个通知栏+标题栏的距离 也就是说通知栏高度为20,标题栏高度为40的话,那么内容的左上角坐标为(0,60)
Matrix的四个基本变换:translate,scale,rotate,skew
重点理解像素点坐标列矩阵以及元矩阵
理解pre,post,set三类操作前置的意义 pre矩阵右乘 M *T post矩阵左乘 T *M,在图像处理中,越靠近右边的矩阵越先执行,所以给人就是post后执行,pre先执行
重要方法:toShortString(),reset & set,setValues(大于9个数据)
特殊方法:setPolyToPoly & setRectToRect不要小瞧这个东西,用好了可以得到意想不到的效果
Matrix使用技巧:
1.获取View在屏幕上的绝对位置,canvas.getMatrix(loc)当然你通过getLocationOnScreen也可以
2.利用Matrix的setPolyToPoly到达折叠效果,可以参考demo PolyView 也可以参考[大神博文](http://blog.csdn.net/lmj623565791/article/details/44278417)
2.1 继承View
2.2 继承ViewGroup
需要定义ViewGroup,如果对getMeasuredWidth和getWidth分别在何时调用不太清楚,可以看下这个文章
2.3 继承现有的控件View
##3.学习自己干兴趣的View以及自己觉得有意思的View
##4.动画的基本学习
##5.framework层对View的基本原理
##资料大汇总
[杂七杂八一堆](http://www.jianshu.com/p/a5b1e778744f )
[android自定义View系列教程](http://www.gcssloop.com/customview/CustomViewIndex)