同时参考任玉刚的Android开发艺术探索
记录下自己不熟悉的地方。
一、.MotionEvent中 get 和 getRaw 的区别
event.getX()和event.getY() //触摸点相对于其所在组件坐标系的坐标,也就是相对于自身来说
event.getRawX()和event.getRawY; //触摸点相对于屏幕默认坐标系的坐标,相对于整个屏幕来说
以前不知道区分这两个概念,顺便把作者的图拿来了。相当直观。
二、角度和弧度
角度:两条射线从圆心向圆周射出,形成一个夹角和夹角正对的一段弧。当这段弧长正好等于圆周长的360分之一时,两条射线的夹角的大小为1度.(即将整个圆分为360份,夹角所对应的弧长所占的比例即为该夹角的角度)
弧度:两条射线从圆心向圆周射出,形成一个夹角和夹角正对的一段弧。当这段弧长正好等于圆的半径时,两条射线的夹角大小为1弧度.(圆弧长对半径的比值即为弧度,园转一圈是2π弧度.)
等价关系:360(角度) = 2π(弧度) ==> 180(角度) = π(弧度)
rad 是弧度, deg 是角度
rad = deg x π / 180
弧度=角度*π/180
deg = rad x 180 / π
角度=弧度x 180 / π
公式就是看着比较头疼啊。。。当年数学还是不错的。结果现在发现都快忘光了==、这次正好复习下
在默认的屏幕坐标系中左上为原点,角度增大方向为顺时针。
三、自定义View分类与流程
自定义View绘制流程函数调用链(简化版)
3.1自定义View的分类
1.自定义ViewGroup
1.1继承ViewGroup派生特殊的Layout
这种方法主要用于实现自定义的布局,即除了系统布局以外的布局,采用这种方式需要处理ViewGroup的测量、布局,还得处理子元素的测量和布局过程,比较麻烦。
1.2继承特定的ViewGroup
当需要某种效果看起来像几种View组合在一起的时候,可以采用这种方式实现,采用这种方式不要自己处理ViewGroup的测量和布局,一般来说上个方式能实现的这个也可以实现,不过上种方式更接近View的底层。
2.自定义View
2.1继承View重写onDraw方法
主要是重写onDraw方式,需要自己支持wrap_content和padding的处理。
2.2继承特定的View
直接继承已有的View,进行功能的拓展
3.2测量View大小(onMeasure)
在onMeasure方法中,参数为intwidthMeasureSpec, intheightMeasureSpec,但是这不是宽和高,而是由宽、高和各自方向上对应的测量模式来合成的一个值,(这句还是不太理解)
可以通过MeasureSpec.getSize(widthMeasureSpec);得到具体的宽高
注意:
如果对View的宽高进行修改了,不要调用super.onMeasure(widthMeasureSpec,heightMeasureSpec);要调用setMeasuredDimension(widthsize,heightsize);这个函数。
3.3.确定View大小(onSizeChanged)
onSizeChanged中的宽高就是最终的宽高