(面试)View相关知识

1、View绘制流程

  • onMeasure() 确定View的测量宽高。
  • onLayout() 确定View的最终宽高四个顶点的位置。
  • onDraw() 将View 绘制到屏幕上。

2、MeasureSpec有三种测量模式:

2.1. EXACTLY(精确模式)

  • 含义:父容器明确指定了子View的精确尺寸,子View必须使用该尺寸
  • 典型场景:
    • 布局中设置了固定值(如android:layout_width="100dp")。
    • View的宽/高设置为match_parent,且父容器有确定尺寸。
  • View行为:必须直接使用MeasureSpec中的size作为最终尺寸。

2.2. AT_MOST(最大模式)

  • 含义:父容器指定了子View的最大可用尺寸,子View的尺寸不能超过该值,但可以更小

  • 典型场景:

    • View的宽/高设置为wrap_content

    • 父容器为ScrollViewRecyclerView等可滚动的容器。

  • View行为:根据自身内容计算尺寸,但最终尺寸不能超过MeasureSpec中的size


2.3. UNSPECIFIED(未指定模式)

  • 含义:父容器对子View无任何约束,子View可以自由决定尺寸(通常根据自身逻辑或内容)
  • 典型场景:
    • 自定义ViewViewGroup需要多次测量(如ListView测量子View的高度)。
    • 系统内部测量(如ScrollView在测量子View的滚动范围时)。
  • View行为:完全由自身决定尺寸(可能使用默认值或内容所需尺寸)。

3、事件分发机制

3.1 事件分发:dispatchTouchEvent

用来进行事件的分发,如果事件能够传递给当前View,则该方法一定会被调用。返回结果受当前View的onTouchEvent和下级的dispatchTouchEvent的影响,表示是否消耗当前事件。

原型:public boolean dispatchTouchEvent(MotionEvent ev)

return:

  • ture:当前View消耗所有事件
  • false:停止分发,交由上层控件的onTouchEvent方法进行消费,如果本层控件是Activity,则事件将被系统消费,处理

3.2 事件拦截:onInterceptTouchEvent

需注意的是在Activity,ViewGroup,View中只有ViewGroup有这个方法。故一旦有点击事件传递给View,则View的onTouchEvent方法就会被调用

在dispatchTouchEvent内部使用,用来判断是否拦截事件。如果当前View拦截了某个事件,那么该事件序列的其它方法也由当前View处理,故该方法不会被再次调用,因为已经无须询问它是否要拦截该事件。

原型:public boolean onInterceptTouchEvent(MotionEvent ev)

return:

  • ture:对事件拦截,交给本层的onTouchEvent进行处理
  • false:不拦截,分发到子View,由子View的dispatchTouchEvent进行处理
  • super.onInterceptTouchEvent(ev):默认不拦截

3.3 事件处理:onTouchEvent

在dispatchTouchEvent中调用,用来处理点击事件,返回结果表示是否消耗当前事件,如果不消耗,则在同一事件序列中,当前View无法再接受到剩下的事件,并且事件将重新交给它的父元素处理,即父元素的onTouchEvent会被调用

原型:public boolean onTouchEvent(MotionEvent ev)

return:

  • true:表示onTouchEvent处理后消耗了当前事件
  • false:不响应事件,不断的传递给上层的onTouchEvent方法处理,直到某个View的onTouchEvent返回true,则认为该事件被消费,如果到最顶层View还是返回false,则该事件不消费,将交由Activity的onTouchEvent处理。
  • super.onTouchEvent(ev):默认消耗当前事件,与返回true一致。

事件分发机制总结:

在分析事件分发机制时,应该从事件分发的顺序入手一步一步解剖。从上文我们知道事件分发顺序为:Activity->Window->DecorView->ViewGroup->View。由于Window与DecorView可以看作是Activity->ViewGroup的过程,故这里将从三部分通过源码来分析事件分发机制:

  1. Activity对点击事件的分发机制
  2. ViewGroup对点击事件的分发机制
  3. View对点击事件的分发机制
  • 当一个点击事件发生后,总是先传递给当前的Activity,由Activity的dispatchTouchEvent进行分发,而Activity会将事件传递给Window,然后由Window的唯一实现类PhoneWindow将事件传递给DecorView,接着DecorView将事件传递给自己的父类ViewGroup,此时的ViewGroup就是通过setContentView所设置的View,故可以称为顶级View,这时候ViewGroup可能是自己处理该事件或者传递给子View,但是最终都会调用View的dispatchTouchEvent来处理事件。
  • 在View的dispatchTouchEvent中,如果设置了onTouchListener,会调用其onTouch方法,如果onTouch返回true,则不再调用onTouchEvent。如果有设置点击事件,则在onTouchEvent会调用onClick方法。如果子View的onTouchEvent返回了false,则表示不消耗事件,事件会回传给上一级的ViewGroup的onTouchEvent,如果所有的ViewGroup都没有返回true,则最终会回传到Activity的onTouchEvent。

4、requestLayout(), invalidate(), postInvalidate() 方法区别

requestLayout方法只会导致当前view的measure和layout,而draw不一定被执行,只有当view的位置发生改变才会执行draw方法,因此如果要使当前view重绘需要调用invalidate。

invalidate在UI线程中调用,postInvalidate在非UI线程中调用。因为android的UI线程是非线程安全的,所以在非UI线程中,需要使用postInvalidate来使View重绘。view调用invalidate将导致当前view的重绘(draw调用),view的父类将不会执行draw方法viewGroup调用invalidate会使viewGroup的子view调用draw,也就是viewGroup内部的子view进行重绘

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/80296.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数组名既可作为指针也可作为变量名

在C语言中,数组名在不同的上下文中既可以作为指向数组首个元素的指针,也可以代表整个数组,这是由C语言的设计和语法规则决定的,下面我来详细解释一下。 1. 数组名作为指向首元素的指针 在大多数情况下,当数组名出现在…

Java异常、泛型与集合框架实战:从基础到应用

在Java编程的世界里,异常处理、泛型和集合框架是构建高效、健壮应用的关键技术。通过掌握这些技术,我们可以更好地管理程序运行时的错误,提高代码的复用性和类型安全性。今天,我将通过一系列实验,分享如何在Java中使用…

Spring源码之解决循环依赖 三级缓存

目录 三级缓存核心原理 循环依赖的解决过程 1. Bean A创建过程中提前曝光工厂 2. Bean B创建时发现依赖A,从缓存获取 3. Bean A继续完成初始化 三级缓存的作用总结 二级缓存为何不够解决缓存依赖? 三级缓存如何解决? 为什么不直接在…

K8S Ingress 实现AB测试、蓝绿发布、金丝雀(灰度)发布

假设有如下三个节点的 K8S 集群: ​ k8s31master 是控制节点 k8s31node1、k8s31node2 是工作节点 容器运行时是 containerd 一、场景分析 阅读本文,默认您已经安装了 Ingress Nginx。 1)A/B 测试 A/B 测试基于用户请求的元信息将流量路由…

深入理解构造函数,析构函数

目录 1.引言 2.构造函数 1.概念 2.特性 3.析构函数 1.概念 2.特性 1.引言 如果一个类中什么都没有,叫作空类. class A {}; 那么我们这个类中真的是什么都没有吗?其实不是,如果我们类当中上面都不写.编译器会生成6个默认的成员函数。 默认成员函数:用户没有显…

Oracle 11.2.0.4 pre PSU Oct18 设置SSL连接

Oracle 11.2.0.4 pre PSU Oct18 设置SSL连接 1 说明2 客户端配置jdk环境3服务器检查oracle数据库补丁4设置ssla 服务器配置walletb 上传测试脚本和配置文件到客户端c 服务器修改数据库侦听和sqlnet.orad 修改客户端的sqlnet.ora和tnsnames.ora的连接符e 修改java代码的数据连接…

BrepGen中的几何特征组装与文件保存详解 deepwiki occwl OCC包装库

有这种好东西我怎么不知道 AutodeskAILab/occwl: Lightweight Pythonic wrapper around pythonocc 组装几何特征以创建B-rep模型 保存为STEP和STL文件细说 Fast 快速 Searched across samxuxiang/BrepGen Ill explain how BrepGen assembles geometric features to create B-r…

重庆 ICPC 比赛游记

2025.5.9 比赛前一天晚上,激动地睡不着觉,起来收拾了好多东西。(其实就四本书,剩下的全是零食……关键在于这四本书基本没用。) 2025.5.10 学校丧心病狂的让我们 6:20 到校门口集合坐车(据说是怕赶不上比…

0x08.Redis 支持事务吗?如何实现?

回答重点 Redis 支持事务,但它的事务与 MySQL 等关系型数据库的事务有着本质区别。MySQL 中的事务严格遵循 ACID 特性,而 Redis 中的事务主要保证的是命令执行的原子性和隔离性,即所有命令在一个不可分割的操作中顺序执行,不会被其他客户端的命令请求所打断。 最关键的区…

佰力博科技与您探讨表面电阻的测试方法及应用领域

表面电阻测试是一种用于测量材料表面电阻值的技术,广泛应用于评估材料的导电性能、静电防护性能以及绝缘性能。 1、表面电阻的测试测试方法: 表面电阻测试通常采用平行电极法、同心圆电极法和四探针法等方法进行。其中,平行电极法通过在试样…

数据库的规范化设计方法---3种范式

第一范式(1NF):确保表中的每个字段都是不可分割的基本数据项。 第二范式(2NF):在满足1NF的基础上,确保非主属性完全依赖于主键。 第三范式(3NF):在满足2NF的基…

产品经理入门(2)产品体验报告

产品体验报告大纲:重点在产品体验——优点。 1.产品概括 可以从各大平台搜产品介绍。 2.市场分析 按照产品方向分析各个指标——包括有效使用时间,市场规模等。 3. 用户分析——对用户通过各项指标画像。 4.产品体验——对各项功能与设计的体验。 5.报告总结

[Java][Leetcode simple] 13. 罗马数字转整数

一、自己想的 只有提到的六种情况是-&#xff0c;其他都是 public int romanToInt1(String s) {int res 0;int n s.length();Map<Character, Integer> map new HashMap<>();map.put(I, 1);map.put(V, 5);map.put(X, 10);map.put(L, 50);map.put(C, 100);map.pu…

如何在 CentOS 7 虚拟机上配置静态 IP 地址并保持重启后 SSH 连接

在使用 CentOS 7 的虚拟机时&#xff0c;我们通常需要配置静态 IP 地址&#xff0c;以确保在每次虚拟机重启后能够通过 SSH 连接。本文将介绍如何在 CentOS 7 系统中配置静态 IP 地址&#xff0c;并确保配置在系统重启后依然生效。 步骤 1&#xff1a;检查虚拟机网络接口 首先…

matlab求解问题

一、目的 掌握Matlab中函数求导、函数极值和极限问题的求解,能够借助Matlab工具对简单优化模型进行求解。 二、内容与设计思想 1、函数求导 1.1求解给定函数的一阶导数&#xff1a;diff(y, x)用于对变量x求y的导数。 1.2求解给定函数的二阶导数&#xff1a;在求出一阶导数的…

C语言斐波那契数列

斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又称黄金分割数列 、兔子数列。由意大利数学家莱昂纳多・斐波那契在 1202 年提出&#xff0c;源于其《算盘书》中一道兔子繁殖问题。定义&#xff1a;在数学上&#xff0c;该数列以递归形式定义。最常见的是…

AI浪潮:开启科技新纪元

AI 的多面应用​ AI 的影响力早已突破实验室的围墙&#xff0c;在众多领域落地生根&#xff0c;成为推动行业变革的重要力量。 在医疗领域&#xff0c;AI 宛如一位不知疲倦的助手&#xff0c;助力医生提升诊疗效率与准确性。通过对海量医学影像的深度学习&#xff0c;AI 能够快…

Ansys 计算刚柔耦合矩阵系数

Ansys 计算刚柔耦合系数矩阵 文章目录 Ansys 计算刚柔耦合系数矩阵卫星的刚柔耦合动力学模型采用 ANSYS 的 APDL 语言的计算方法系统转动惯量的求解方法参考文献 卫星的刚柔耦合动力学模型 柔性航天器的刚柔耦合动力学模型可以表示为 m v ˙ B t r a n η F J ω ˙ ω J…

算法题(148):排座椅

审题&#xff1a; 本题需要我们找到最佳的排座椅方案&#xff0c;并输出行&#xff0c;列方案 思路&#xff1a; 方法一&#xff1a;简单贪心 由于题目会告诉我们有哪几对的同学会交头接耳&#xff0c;所以我们可以记录下第几行/第几列上可以隔开的同学对数&#xff0c;而题目限…

企业级电商数据对接:1688 商品详情 API 接口开发与优化实践

在数字化浪潮席卷全球的当下&#xff0c;企业级电商平台之间的数据对接已成为提升运营效率、增强市场竞争力的关键环节。作为国内知名的 B2B 电商平台&#xff0c;1688 拥有海量商品资源&#xff0c;通过开发和优化商品详情 API 接口&#xff0c;企业能够快速获取商品信息&…