自从十月份来到这家公司,大概有三个多月没更新博客了,主要是太忙,996的工作节奏着实让人没有太多的空闲时间去整理学习,其实也不想抱怨太多,既来之则安之吧。
公司是做股票财经类软件的,对自定义View这一块要求比较多吧。所以这一系列文章想对自定义View做一个学习总结,从绘制流程,事件分发机制,绘图,自定义ViewGroup,自定义分时K线图做一个整体的整理和学习。本篇从View的绘制流程开始整理,这些知识点是自定义View的基础。
View的绘制流程
-
View的生命周期
onAttachedToWindow:View onDraw方法之前调用,但只会调用一次onDetachedFromWindow:view被remove或者view的activity退回时调用
-
ViewRoot和DecorView
①ViewRoot对应ViewRootImpl类,是连接WindowManager和DecorView(顶级View)的纽带。View的三大流程均是通过ViewRoot来完成的
③View的绘制过程是从ViewRoot的performTraversals方法开始的,performTraversals方法会依次调用performMeasure,performLayout,performDraw三个方法,这三个方法分别完层DecorView的measure(决定下一层View的宽高),layout(决定下一层View的位置),draw这三大流程。接着子元素会重复父容器的三大流程
View的绘制主要由Measure,layout,draw三大流程完成
-
Measure过程
(1)MeasureSpec(测量模式)三种模式:
-
EXACTLY:表示设置了精度的值,一般但childView的的宽、高为精确值或者match_parent时,ViewGroup会将childView的测量模式设置为EXACTLY
-
AT_MOST:表示子布局被限制在一个最大值内,一般当childView设置其宽、高为wrap_content时,ViewGroup会将其设置为AT_MOST;
-
UNSPECIFIED:表示子布局想要多大就多大,一般出现在AadapterView的item的heightMode中、ScrollView的childView的heightMode中,比较少见。
(2)childView的MeasureSpec如何确定?
ViewGroup会根据子View的宽高跟ViewGroup本身的测量模式确定子View的测量模式: ①当子View采用固定宽高的时候,不管父ViewGroup本身的MeasureSpec是什么,View的MeasureSpec都是EXACTLY,并且其大小遵循LayoutParams中的大小 ②当子View的宽高是match_parent时 -如果父ViewGroup是EXACTLY精准模式,View也是EXACTLY精准模式,并且其大小是父容器的剩余空间 -如果父ViewGroup是AT_MOST,View也是AT_MOST最大模式,并且其大小是不能超过父容器的剩余空间 ③当View的宽高是wrap_content时,不管父容器的模式是精准还是最大化,子View的模式总是AT_MOST (即view的宽高等于当前父容器剩余的大小,并且大小不能超过父容器的剩余空间)
(3)重写onMeasure()
- <
-