美文网首页Android艺术探索笔记
第四章 View 的工作原理

第四章 View 的工作原理

作者: ByteStefan | 来源:发表于2019-01-15 23:14 被阅读0次
    1. MeasureSpec
      MeasureSpec 代表一个 32 位 int 值,高 2 位代表 SpecMode,低 30 位代表 SpecSize。SpecMode 指测量模式,SpecSize 指再某种测量模式下的规格大小。
      SpecMode 三种模式:
      ① UNSPECOFOED:父容器不对 View 有任何限制,要多大给多大,一般用于系统内部。
      ② EXACTLY:父容器已经检测出 View 所需要的精确大小,这时候 View 的最终大小就是 SpecSize 所指定的值。对应于 LayoutParams 中的 match_parent 和具体数值两种模式。
      ③ AT_MOST:父容器制定了一个可用大小即 SpecSize,View 的大小不能大于这个值。对应于 LayoutParams 中的 wrap_content。

    2. 普通 View 的 MeasureSpec 的创建规则


      普通 View 的 MeasureSpec 的创建规则.png

      ① 当 View 采用固定宽/高的时候,不管父容器的 MeasureSpec 是什么,View 的 MeasureSpec 都是精准模式并且其大小遵循 Layoutparams 中的大小。
      ② 当 View 的宽/高是 match_parent 时,如果父容器的模式是精准模式,那么 View 也是精准模式并且其大小是父容器的剩余空间;如果父容器是最大模式,那么 View 也是最大模式并且其大小不会超过父容器的剩余空间。
      ③ 当 View 的宽/高是 wrap_content 时,不管父容器的模式是精准还是最大化,View 的模式总是最大化并且大小不能超过父容器的剩余空间。

    3. 获取 View 宽高的四种方式
      ① Activity/View#onWindowFocusChanged:View已经初始化完毕,宽高已准备好。该方法会在 Activity 的窗口得到和失去焦点时各被调用一次。如果频繁进行 onResume 和 onPause,那么该方法也会被频繁调用。
      ② view.post(runnable):通过 post 可以将一个 runnable 投递到消息队列的尾部,然后等待 Looper 调用此 runnable 的时候,View 已经初始化完毕。
      ③ ViewTreeObserver:使用 ViewTreeObserver 的众多回调可以实现 View 初始完毕后获取宽高。

    view.getViewTreeObserver().addOnGlobalLayoutListener(onGlobalLayoutListener)
    

    ④ view.measure( int widthMeasureSpec,int heightMeasureSpec):通过手动对 View 进行 measure 来得到 View 的宽高。

    1. 自定义 View 分类
      ① 继承 View 重写 onDraw 方法:采用该方式需要自己支持 wrap_content,并且 padding 也需要自己处理。
      ② 继承 ViewGroup 派生特殊的 Layout :采用该方式需要合适的处理 ViewGroup 的测量、布局过程,并同时处理子元素的测量和布局过程。
      ③ 继承特定的 View (比如 TextView):该方式不需要自己支持 wrap_content 和 padding。
      ④ 继承特定的 ViewGroup(比如 LinearLayout):该方式不需要自己处理 ViewGroup 的测量和布局过程。

    2. 自定义 View 注意事项
      ① 让 View 支持 wrap_content。在直接继承 View 或者 ViewGroup 时,如果不在 onMeasure 中对 wrap_content 做特殊处理,那么当外界在布局中使用 wrap_content 时就无法达到预期的效果。
      ② 如果有必要,让你的 View 支持 padding。直接继承 View 时,如果不在 draw 方法中处理 padding,那么 padding 属性是无法起作用。直接继承 ViewGroup 时,需要在 onMeasure 和 onLayout 中考虑 padding 和子元素的 margin。
      ③ 尽量不要在 View 中使用 Handler
      ④ View 中如果有线程或者动画,需要及时停止。可以在 View#onDetachedFromWindow 中停止线程和动画。
      ⑤ View 带有滑动嵌套时,需要处理好滑动冲突。

    相关文章

      网友评论

        本文标题:第四章 View 的工作原理

        本文链接:https://www.haomeiwen.com/subject/bmoudqtx.html