首页 > 其他分享 >Android 子菜单

Android 子菜单

时间:2022-12-08 23:01:17浏览次数:45  
标签:ViewGroup 菜单 dispatchTouchEvent 视图 调用 Android 绘制 View

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 的滚动条进行绘制。

                                                             

 

 

           

标签:ViewGroup,菜单,dispatchTouchEvent,视图,调用,Android,绘制,View
From: https://www.cnblogs.com/xiamaocheng/p/16967673.html

相关文章

  • Freeline - Android平台上的秒级编译方案
    FreeLine是什么?Freeline是蚂蚁金服旗下一站式理财平台​​蚂蚁聚宝​​团队15年10月在Android平台上的量身定做的一个基于动态替换的编译方案,5月阿里集团内部开源,稳定性方面......
  • Android自定义View和Canvas绘图解析
    自定义view的流程分为measure、layout、draw三个主要步骤,今天我们通过源码来分下下measure的过程我们从顶级view开始,顶级view即DecorView,view的事件都是先经过这个DecorVi......
  • android中使用heap分析工具导出到MAT
    android中可以使用heap分析工具导出到MAT,方法为1)在ECLIPSE工具栏中,选择如下图2要将dalvik的导出到java格式的MAT,可以这样 hprof-convdump.......
  • (15) WPF 菜单控件
    一、 ​​ContextMenu​​ 二、 ​​Menu​​ 三、​​ToolBar​​......
  • 百度 Android 直播秒开体验优化
    作者|任雪龙导读网络直播功能作为一项互联网基本能力已经越来越重要,手机中的直播功能也越来越完善,电商直播、新闻直播、娱乐直播等多种直播类型为用户提供了丰富的直播内......
  • 您上传的 APK 或 Android App Bundle 内含活动、活动别名、服务或广播接收器,这些项目
    您上传的APK或AndroidAppBundle内含活动、活动别名、服务或广播接收器,这些项目有intent过滤器,但没有“android:exported”属性设置。此文件无法在Android12或更......
  • Java 8 Stream实现菜单树工具类
    TreeUtils:packagecom.ruoyi.common.core.utils.GuavaUtils.TreeUtils;importcom.alibaba.fastjson.JSON;importjava.util.Arrays;importjava.util.List;importjava.uti......
  • android 服务
      1.创建服务 Exported:是否允许除了当前程序之外的其他程序访问这个服务Enable:是否启用这个服务 点击完成后自动生成importandroid.app.Service;importandroid.conte......
  • android build.gradle
    现在android开发SDK一般选择用最新的SDK版本,这是Google官方强烈建议的。app能运行的Android版本不是由SDK决定的,是由每一个项目的minSDK决定的。SDK都是向下兼容的。SDK......
  • android studio AndroidManifest
     一、目录结构 1.AndroidManifest.xml它是一个清单文件,提供应用的基本信息<?xmlversion="1.0"encoding="utf-8"?><!--package是android应用程序的包名,相当工程的id--......