自定义View学习之路

学习自GcsSloop,链接地址;

同时参考任玉刚的Android开发艺术探索

记录下自己不熟悉的地方。

一、.MotionEvent中 get 和 getRaw 的区别

event.getX()和event.getY()       //触摸点相对于其所在组件坐标系的坐标,也就是相对于自身来说

event.getRawX()和event.getRawY;    //触摸点相对于屏幕默认坐标系的坐标,相对于整个屏幕来说

自定义View学习之路_第1张图片


以前不知道区分这两个概念,顺便把作者的图拿来了。相当直观。

二、角度和弧度

角度:两条射线从圆心向圆周射出,形成一个夹角和夹角正对的一段弧。当这段弧长正好等于圆周长的360分之一时,两条射线的夹角的大小为1度.(即将整个圆分为360份,夹角所对应的弧长所占的比例即为该夹角的角度)

弧度:两条射线从圆心向圆周射出,形成一个夹角和夹角正对的一段弧。当这段弧长正好等于圆的半径时,两条射线的夹角大小为1弧度.(圆弧长对半径的比值即为弧度,园转一圈是2π弧度.)

等价关系:360(角度) = 2π(弧度) ==> 180(角度) = π(弧度)

rad 是弧度, deg 是角度

rad = deg x π / 180  

弧度=角度*π/180

deg = rad x 180 / π

角度=弧度x 180 / π

公式就是看着比较头疼啊。。。当年数学还是不错的。结果现在发现都快忘光了==、这次正好复习下


在默认的屏幕坐标系中左上为原点,角度增大方向为顺时针。

三、自定义View分类与流程

                                                                        自定义View绘制流程函数调用链(简化版)


自定义View学习之路_第2张图片

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中的宽高就是最终的宽高

其他的都是实践为主了。。暂不记录了

你可能感兴趣的:(自定义View学习之路)