Android 子菜单

Android 的 UI 界面都是由 View 和 ViewGroup 及其派生类组合而成的。其中,View 是所有 UI 组件的基类,而 ViewGroup 是容纳 View 及其派生类的容器,ViewGroup 也是从 View 派生出来的。一般来说,开发 UI 界面都不会直接使用 View 和 ViewGroup(自定义控件的时候使用),而是使用其派生类。

        下图:UI布局的层次结构。

 

View 和 ViewGroup 的区别:

        可以从两方面来说:

        一.事件分发方面的区别;

        二.UI 绘制方面的区别;

 

        事件分发机制主要有三个方法:dispatchTouchEvent()、onInterceptTouchEvent()、onTouchEvent()

 

        2.触摸事件由 Action_Down、Action_Move、Action_Up 组成,一次完整的触摸事件,包含一个 Down 和 Up,以及若干个 Move(可以为0);

 

        3.在 Action_Down 的情况下,事件会先传递到最顶层的 ViewGroup,调用 ViewGroup 的 dispatchTouchEvent(),①如果 ViewGroup 的 onInterceptTouchEvent() 返回 false 不拦截该事件,则会分发给子 View,调用子 View 的 dispatchTouchEvent(),如果子 View 的 dispatchTouchEvent() 返回 true,则调用 View 的 onTouchEvent() 消费事件。②如果 ViewGroup的onInterceptTouchEvent() 返回 true 拦截该事件,则调用 ViewGroup 的 onTouchEvent() 消费事件,接下来的 Move 和 Up 事件将由该 ViewGroup 直接进行处理。

 

        4.当某个子 View 的 dispatchTouchEvent() 返回 true 时,会中止 Down 事件的分发,同时在 ViewGroup 中记录该子 View。接下来的 Move 和 Up 事件将由该子 View 直接进行处理。

 
   5.当 ViewGroup 中所有子 View 都不捕获 Down 事件时,将触发 ViewGroup 自身的 onTouch();触发的方式是调用 super.dispatchTouchEvent 函数,即父类 View 的 dispatchTouchEvent 方法。在所有子 View 都不处理的情况下,触发 Acitivity 的 onTouchEvent 方法。
 

UI绘制方面的区别:

 
 

        UI绘制主要有五个方法:onDraw(),onLayout(),onMeasure(),dispatchDraw(),drawChild()

 

        1.ViewGroup 包含这五个方法,而 View 只包含 onDraw(),onLayout(),onMeasure() 三个方法,不包含 dispatchDraw(),drawChild()。

 

        2.绘制流程:onMeasure(测量)——> onLayout(布局)——> onDraw(绘制)。

 

        3.绘制按照视图树的顺序执行,视图绘制时会先绘制子控件。如果视图的背景可见,视图会在调用 onDraw() 之前调用 drawBackGround() 绘制背景。强制重绘,可以使用 invalidate();

 

        4.如果发生视图的尺寸变化,则该视图会调用 requestLayou(),向父控件请求再次布局。如果发生视图的外观变化,则该视图会调用 invalidate(),强制重绘。如果 requestLayout() 或  invalidate() 有一个被调用,框架会对视图树进行相关的测量、布局和绘制。

 
 

        5.onLayout():对于 View 来说,onLayout() 只是一个空实现;而对于 ViewGroup 来说,onLayout() 使用了关键字 abstract 的修饰,要求其子类必须重载该方法,目的就是安排其 children 在父视图的具体位置。

 

        6.draw 过程:drawBackground() 绘制背景 ——> onDraw() 对 View 的内容进行绘制 ——> dispatchDraw() 对当前 View 的所有子 View 进行绘制 ——> onDrawScrollBars() 对 View 的滚动条进行绘制。

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

 

 
 
 
 
 
 
posted @ 2022-12-08 22:54  xiamaocheng  阅读(40)  评论(0)    收藏  举报