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有大小的模式,分为以下三种:
- 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=""