第四章 View的工作原理—学习笔记

这个文集中文章主要是自己在学习中记录的重要知识点,方便日后查阅。

ViewRoot

ViewRoot对应ViewRootImpl类,他是链接WindowManager和DecorView的纽带。View的绘制流程是从ViewRoot的performTraversals开始

DecorIView

这是一个FrameLayout,View层的事件都先经过DecorView,然后才传递给VIew。

MeasureSpec

MeassureSpec是一个32位int值,高两位代表SpecMode(测量模式),低30位代表SpecSize(某种测量模式下的规格大小)
测量的三种模式:
1、EXACTLY 精确模式,指定具体数值或者match_parent
2、AT_MOST 最大值模式,属性指定为warp_parent
3、UNSPECIFIED 不指定测量大小,一般在绘制定义视图时使用

View的工作流程

Measure

在某些情况下,onMeasure方法测量的宽高很可能不准,可以在onLayout方法中获取最终的宽高。
当在Activity启动时,获取一个View的宽高,在onCreate,onStart,onResume方法中都没有准确的获得,可以用一下四种方法来解决这个问题:
1.Activity/View#onWindowFocusChanged
2.view.post(runnable)
3.ViewTreeObserver OnGlobalLayoutListener
4.view.meaure(int widthMeasureSpec,int heightMeasureSpec)

Layout

layout方法确定的是View本身的问题,onLayout方法则确定的所有子元素的位置。
View测量宽高和最终宽高有什么区别,可以具体为View的getMeasureWidth和getWidth这两个方法的区别,他们的测量时机不一样,测量宽高在measure过程,最终宽高在layout过程。

Draw

1.绘制background.draw(canvas);
2.绘制自己(onDraw)
3.绘制children(dispatchDraw)
4.绘制装饰(onDrawScrollBars)

自定义View

分类

  1. 继承View重写onDraw
  2. 继承ViewGroup派生特殊的Layout
  3. 继承特定的View(如TextView)
  4. 继承特定的ViewGroup(Linerlayout等)

须知

  1. 让View支持wrap_content
  2. 如果需要让View支持Padding
  3. 尽量在View中不使用Handler,View内部本身就提供了post系列的方法
  4. View有线程或者动画,需要及时的停止
  5. View有滑动嵌套的时候,要处理好滑动冲突

你可能感兴趣的:(第四章 View的工作原理—学习笔记)