2016年起,开始源码的整个学习过程.从事安卓开发2年有余。对于源码的认识,感觉还是很皮毛,之前做项目,只注重功能的实现,而并不注重原理。打算从现在开始,每天研究下源码的实现, 及其相关的设计模式。一来是提高下自己对安卓的深入了解,同时,算是对自己的提升吧。

14个周期


1、onFinishInflate() 当View中所有的子控件均被映射成xml后触发 。

2、onMeasure( int , int ) 确定所有子元素的大小 。

3、onLayout( boolean , int , int , int , int ) 当View分配所有的子元素的大小和位置时触发 。

4、onSizeChanged( int , int , int , int ) 当view的大小发生变化时触发 。

5、onDraw(Canvas) view渲染内容的细节。 

6、onKeyDown( int , KeyEvent) 有按键按下后触发 。

7、onKeyUp( int , KeyEvent) 有按键按下后弹起时触发 。

8、onTrackballEvent(MotionEvent) 轨迹球事件 。 

9、onTouchEvent(MotionEvent) 触屏事件 。

10、onFocusChanged( boolean , int , Rect) 当View获取或失去焦点时触发 。

11、onWindowFocusChanged( boolean ) 当窗口包含的view获取或失去焦点时触发 。

12、onAttachedToWindow() 当view被附着到一个窗口时触发 。

13、onDetachedFromWindow() 当view离开附着的窗口时触发,该方法和 onAttachedToWindow() 是相反的。 

14、onWindowVisibilityChanged( int ) 当窗口中包含的可见的view发生变化时触发。 

Layout

有两个过程,1测量 2布局

测量:measure(int, int)方法。且是自上而下的,测量的最后,view会存储测量数据。执行不止一次。测量相关的类为MeasureSpec和LayoutParams。

MeasureSpec有大小的模式,分为以下三种:

  1. EXACTLY精确模式:在这种模式下,尺寸的值是多少,那么这个组件的长或宽就是多少。如:match_parent、或者具体的大小
  • AT_MOST最大模式:这个也就是父组件,能够给出的最大的空间,当前组件的长或宽最大只能为这么大,当然也可以比这个小。如:wrap_content
  • UNSPECIFIED未指定模式:不受到父view的限制,可以设置为任意值。基本上不用到。

LayoutParams负责宽高尺寸,可以设置为精确值,还有MATCH_PARENT,WRAP_CONTENT。(ViewGroup的子类还有其他个性化的属性值)。

布局:layout(int,int,int,int)方法。也是自上而下。在此方法中,根据measure()方法获取的值,来计算子控件位置及大小。

注:所有子控件宽高的测量值,必须受到父控件的约束。

绘制


区域改变,会调用requestLayout();执行父控件及自身的measure(),layout(),以及draw()


外观改变,会调用invalidate();只执行draw()


整个视图树是单线程的,视图内部方法,必须全部在ui线程中调用.


  • 处理焦点

nextFocusDown
nextFocusLeft
nextFocusRight
nextFocusUp

在xml布局中设置下一个焦点控件.

Button不会获取焦点,只会触发touch事件,如onClick()

  • View动画

从3.0之后开始支持,基于Animator,改变视图的实际属性如alpha何tranlationX。会影响子视图。framework会不断重绘,知道动画完成。


  • 其它知识点:

View可以通过setTag(Object o)和getTag()设置获取绑定的数据.

可以设置主题android:theme=""