Android艺术探索笔记

第四章 View 的工作原理

2019-01-15  本文已影响0人  ByteStefan
  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 带有滑动嵌套时,需要处理好滑动冲突。

上一篇下一篇

猜你喜欢

热点阅读