(面试)获取View宽高的几种方式
Android 中获取 View 宽高的几种方式,以及它们的适用场景和注意事项:
1. View.getWidth()
和 View.getHeight()
-
原理: 直接从 View 对象中获取已经计算好的宽度和高度。
-
优点: 简单直接。
-
缺点: 在
onCreate()
、onStart()
等生命周期方法中,View 可能还没有完成测量,此时获取到的值可能是 0。 通常在onResume()
之后才能保证获取到正确的值。
问题本质:
onCreate()
:setContentView()
仅加载布局,未开始测量。onStart()
/onResume()
:界面可见,但测量可能仍未完成(尤其是复杂布局或异步数据加载时)。
-
适用场景: 在 View 已经完成布局之后,需要获取其宽高时使用。例如,在用户交互事件(如点击事件)中,或者在
onWindowFocusChanged(boolean hasFocus)
方法中。 -
代码示例:
@Override protected void onResume() {super.onResume();int width = myView.getWidth();int height = myView.getHeight();Log.d("ViewSize", "Width: " + width + ", Height: " + height); }
2.
View.getMeasuredWidth()
和View.getMeasuredHeight()
-
原理: 获取 View 的测量宽度和测量高度。 View 在布局过程中会经过测量阶段,
getMeasuredWidth()
和getMeasuredHeight()
返回的就是测量阶段计算出的宽高。 -
优点: 比
getWidth()
和getHeight()
更早获取到 View 的宽高信息。 -
缺点: 测量宽高可能与最终显示的宽高不同。 例如,如果 View 的
layout_width
或layout_height
设置为wrap_content
,并且父容器对其进行了限制,那么测量宽高可能只是一个预估值。 此外,如果 View 进行了重新测量,getMeasuredWidth()
和getMeasuredHeight()
的值也会发生变化。 -
适用场景: 在 View 还没有完全布局完成,但需要提前知道其大致宽高信息时使用。例如,在自定义 View 的
onMeasure()
方法中。 -
代码示例:
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);int measuredWidth = getMeasuredWidth();int measuredHeight = getMeasuredHeight();Log.d("ViewSize", "Measured Width: " + measuredWidth + ", Measured Height: " + measuredHeight); }
3.
ViewTreeObserver.OnGlobalLayoutListener
-
ViewTreeObserver.OnGlobalLayoutListener
是 Android 中用于监听 视图树(ViewTree)全局布局变化 的接口,常用于在 View 完成测量和布局后 获取其宽高、位置等属性。 -
优点: 可以保证在 View 已经完成布局之后获取到正确的宽高值。 即使 View 的宽高在布局过程中发生了变化,也能及时获取到最新的值。
-
缺点: 需要注册监听器,并且在获取到宽高后需要移除监听器,否则会造成性能问题。
-
适用场景: 需要在 View 布局完成后立即获取其宽高,并且需要保证获取到的值是准确的。
-
代码示例:
@Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);myView = findViewById(R.id.my_view);ViewTreeObserver vto = myView.getViewTreeObserver();vto.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {@Overridepublic void onGlobalLayout() {myView.getViewTreeObserver().removeOnGlobalLayoutListener(this);int width = myView.getWidth();int height = myView.getHeight();Log.d("ViewSize", "Width: " + width + ", Height: " + height);}}); }
4.
View.post(Runnable)
-
原理: 将一个 Runnable 对象添加到 View 的消息队列中,该 Runnable 对象会在 View 布局完成后执行。
-
优点: 可以保证在 View 已经完成布局之后获取到正确的宽高值,并且代码简洁。
-
缺点: 相对于
OnGlobalLayoutListener
,可能稍微延迟一点执行。 -
适用场景: 需要在 View 布局完成后立即获取其宽高,并且对执行时间要求不高。
-
代码示例:
@Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);myView = findViewById(R.id.my_view);myView.post(new Runnable() {@Overridepublic void run() {int width = myView.getWidth();int height = myView.getHeight();Log.d("ViewSize", "Width: " + width + ", Height: " + height);}}); }
5.
View.addOnLayoutChangeListener(OnLayoutChangeListener)
(API Level 11+) -
原理: 监听 View 的布局变化。 当 View 的布局发生改变时,
onLayoutChange()
方法会被调用。 -
优点: 可以监听 View 的布局变化,并在布局变化后获取最新的宽高值。
-
缺点: 只在 API Level 11 及以上可用。
-
适用场景: 需要在 View 布局变化后立即获取其宽高,并且需要监听 View 的布局变化。
-
代码示例:
@Override protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);myView = findViewById(R.id.my_view);myView.addOnLayoutChangeListener(new View.OnLayoutChangeListener() {@Overridepublic void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) {int width = myView.getWidth();int height = myView.getHeight();Log.d("ViewSize", "Width: " + width + ", Height: " + height);}}); }
相关文章:
(面试)获取View宽高的几种方式
Android 中获取 View 宽高的几种方式,以及它们的适用场景和注意事项: 1. View.getWidth() 和 View.getHeight() 原理: 直接从 View 对象中获取已经计算好的宽度和高度。 优点: 简单直接。 缺点: 在 onCreate()、onStart() 等生命周期方法中࿰…...

【Linux】进程地址空间揭秘(初步认识)
10.进程地址空间(初步认识) 文章目录 10.进程地址空间(初步认识)一、进程地址空间的实验现象解析二、进程地址空间三、虚拟内存管理补充:数据的写时拷贝(浅谈)补充:页表(…...

设计模式——备忘录设计模式(行为型)
摘要 备忘录设计模式是一种行为型设计模式,用于在不破坏封装性的前提下,捕获对象的内部状态并在需要时恢复。它包含三个关键角色:原发器(Originator)、备忘录(Memento)和负责人(Car…...
吴恩达:构建自动化评估并不需要大量投入,从一些简单快速的示例入手,然后逐步迭代!
吴恩达老师又来信了。 这次他分享了一个重要观点:构建自动化评估并不需要大量投入。从一些简单快速的示例入手,然后逐步迭代! 以下是我对原文的翻译: 亲爱的朋友们: 我注意到,许多生成式 AI 应用项目在系…...
鸿蒙OSUniApp内存管理优化实战:从入门到精通#三方框架 #Uniapp
UniApp内存管理优化实战:从入门到精通 在开发 UniApp 应用时,特别是针对鸿蒙设备的开发过程中,内存管理往往成为影响应用性能的关键因素。本文将结合实际项目经验,深入探讨 UniApp 应用的内存优化策略,帮助开发者构建…...
Vue-5-基于JavaScript和plotly.js绘制数据分析类图表
文章目录 1 折线图示例1.1 网页基本结构1.2 绘图流程1.2.1 type图表类型1.2.2 mode显示方式1.2.3 marker数据点的样式1.3 横坐标为时间戳1.3.1 xaxis.type坐标值类型1.3.2 xaxis.tickformat格式1.4 悬停时展示毫秒数2 一个变量2.1 箱线图2.2 小提琴图2.3 直方图3 两个变量3.1 折…...

UI自动化测试的革新,新一代AI工具MidScene.js实测!
前言 AI已经越来越深入地走入我们的实际工作,在软件测试领域,和AI相关的新测试工具、方法也层出不穷。在之前我们介绍过结合 mcp server 实现 AI 驱动测试的案例,本文我们将介绍一个近期崭露头角的国产AI测试工具 Midscene.js Midscene.js简介 MidScene.js 是由字节跳动 w…...
StarRocks的几种表模型
## 一、引言:OLAP场景下的表模型挑战 在实时分析领域,数据表的设计直接影响查询性能、存储效率和更新灵活性。StarRocks作为新一代极速全场景MPP数据库,针对不同的业务场景提供了多样化的表模型解决方案。每种模型通过独特的存储结构和预计算…...

4. Qt对话框(2)
在上节中已经学习了对话框的确认和取消,本节内容继续接上节完成登录对话框实例并得到登录信息。 本文部分ppt、视频截图原链接:[萌马工作室的个人空间-萌马工作室个人主页-哔哩哔哩视频] 1 实现登录对话框 1.1 功能需要 得到登录信息,需要…...
2025-5-31-C++ 学习 字符串(终)
字符串 2025-5-31-C 学习 字符串(终)P1200 [USACO1.1] 你的飞碟在这儿 Your Ride Is Here题目描述输入格式输出格式输入输出样例 #1输入 #1输出 #1 输入输出样例 #2输入 #2输出 #2 说明/提示题解代码 P1597 语句解析题目背景题目描述输入格式输出格式输入…...

Android Studio 2022.2.1.20 汉化教程
查看Android Studio 版本 Android Studio Flamingo | 2022.2.1 Patch 2 下载:https://plugins.jetbrains.com/plugin/13710-chinese-simplified-language-pack----/versions/stable...
第17讲、odoo18可视化操作代码生成模块
1. 模块概述 代码框架生成模块是一个专为Odoo开发者设计的工具,旨在简化模块开发过程中的重复性工作。该模块允许开发者通过定义模型名称和字段,自动生成相应的Python代码、XML视图和CSV权限配置文件,从而大幅提高开发效率。通过这种方式&am…...

golang -- slice 底层逻辑
目录 一、前言二、结构三、创建3.1 根据 make创建3.2 通过数组创建 四、内置append追加元素4.1 追加元素4.2 是否扩容4.2.1 不扩容4.2.2 扩容 总结 一、前言 前段时间学了go语言基础,过了一遍之后还是差很多,所以又结合几篇不同资料重新学习了一下相关…...

SOC-ESP32S3部分:26-物联网MQTT连云
飞书文档https://x509p6c8to.feishu.cn/wiki/IGCawAgqFibop7kO83KcsDFBnNb ESP-MQTT 是 MQTT 协议客户端的实现,MQTT 是一种基于发布/订阅模式的轻量级消息传输协议。ESP-MQTT 当前支持 MQTT v5.0。 特性 支持基于 TCP 的 MQTT、基于 Mbed TLS 的 SSL、基于 WebSo…...
从前端工程化角度解析 Vite 打包策略:为何选择 Rollup 而非 esbuild。
文章目录 前言一、esbuild 与 Rollup 的技术特性对比1、esbuild:极速开发利器,功能尚待完善2、Rollup:专业打包工具,功能全面强大 二、Vite 打包策略的工程化考量因素1、开发阶段与生产阶段的需求差异2、功能完整性与生态兼容性3、…...
三层架构 vs SOA vs 微服务:该选谁?
三层架构 vs SOA vs 微服务:该选谁? 一、从单体到分布式:架构演进的必然性 最早的系统架构通常是单体架构(Monolithic Architecture),所有功能都打包在一个应用里,部署方便,但扩展性和灵活性有限。后来,为了让系统更具可维护性,三层架构成为主流。但当业务变得复杂…...

制造业的未来图景:超自动化与劳动力转型的双重革命
市场现状:传统制造业的转型阵痛 当前全球制造业正站在历史性变革的十字路口。埃森哲对552位工厂经理的全球调研显示,60%的受访者将劳动力转型视为首要战略任务,而63%的工厂正在加速部署自动化技术[1]。超过75%的工厂经理认为&…...
使用Haproxy搭建Web群集
一、基础环境准备 服务器规划 67 HAProxy调度器:1台 (2核4G,CentOS 7/8) Web服务器:至少2台(如Nginx/Apache,建议192.168.1.101-102) 客户端测试机:1台(Windows/Linux)…...

【Unity】相机 Cameras
1 前言 主要介绍官方文档中相机模块的内容。 关于“9动态分辨率”,这部分很多API文档只是提了一下,具体细节还需要自己深入API才行。 2 摄像机介绍 Unity 场景在三维空间中表示游戏对象。由于观察者的屏幕是二维屏幕,Unity 需要捕捉视图并将…...

如何在 Solana 上发币,并创建初始流动性让项目真正“动”起来?
在 Solana 上发行代币如今已不再是技术门槛,而是市场策略和执行效率的较量。如果你只是简单发了一个代币,却没为它建立流动性和市场机制,那么它就只是一个“死币”。 本文将带你一步步理解,如何从发币到建立流动性池,…...
C++.凸包算法
C.凸包算法 1. 凸包算法概述1.1 凸包的定义1.2 凸包算法的应用场景 2. Graham扫描算法2.1 算法原理2.2 C代码实现2.3 示例分析Mermaid图示 3. Andrew算法3.1 算法原理3.2 C代码实现3.3 示例分析Mermaid图示 4. 算法性能比较4.1 时间复杂度分析Graham扫描算法Andrew算法性能对比…...
C++ 游戏开发详细流程
🧠 第一阶段:项目规划与架构设计 关键词:系统性、模块化、可扩展性 1.1 目标明确 游戏类型:2D / 2.5D / 3D / VR平台选择:PC、主机、移动设备多人/单人:是否含网络模块(决定是否使用 socket、U…...

核心机制:滑动窗口
TCP 协议 1.确认应答 可靠传输的核心机制 2.超时重传 可靠传输的核心机制 3.连接管理 TCP/网络 最高的面试题 三次握手,建立连接(必须是 三次) 四次挥手,断开连接(可能是 三次) 核心机制四:滑动窗口 算法中的"滑动窗口" 出自 TCP 前面的三个…...

苹果电脑深度清理,让老旧Mac重焕新生
在日常使用苹果电脑的过程中,随着时间推移,系统内会积累大量冗余数据,导致电脑运行速度变慢、磁盘空间紧张。想要让设备恢复流畅,苹果电脑深度清理必不可少。那么,如何进行苹果电脑深度清理呢?接下来为你详…...
Hadoop复习(一)
初识Hadoop 分别从选择题、大题和复习Linux命令来复习 选择题 问题 1 单项选择难度级别 3 2 分 下面哪一个不属于Google的三驾马车? 答案选项组 GFS NDFS BigTable MapReduce 问题 2 单项选择难度级别 3 2 分 Hadoop 3.x版本支持最低的JDK版本是&#x…...

微服务面试(分布式事务、注册中心、远程调用、服务保护)
1.分布式事务 分布式事务,就是指不是在单个服务或单个数据库架构下,产生的事务,例如: 跨数据源的分布式事务跨服务的分布式事务综合情况 我们之前解决分布式事务问题是直接使用Seata框架的AT模式,但是解决分布式事务…...

高性能MYSQL(三):性能剖析
一、性能剖析概述 (一)关于性能优化 1.什么是性能? 我们将性能定义为完成某件任务所需要的时间度量,换句话说,性能即响应时间,这是一个非常重要的原则。 我们通过任务和时间而不是资源来测量性能。数据…...
Go 语言中的 panic 详解
Go 语言中的 panic 详解 在 Go 语言中,panic 是一种用于处理不可恢复错误的机制。当程序遇到无法继续执行的严重错误时,会自动或手动触发 panic,终止当前函数的执行,并开始进行堆栈展开(stack unwind…...

mysql(十四)
目录 多表查询 1.准备工作 2--创建表格 3--插入数据 2.笛卡尔积查询 3.内连接查询 1--隐式内连接 格式 查询 2--显示内连接(Inner join .. on ) 格式 查询 4.外连接查询 1--左外连接查询(LEFT OUTER JOIN .. ON ) 格式 查询 2-- 右…...

工业物联网中的事件驱动采样架构及优化
论文标题 Event-Based Sampling Architecture and Optimization for Industrial Internet of Things 工业物联网中的事件驱动采样架构及优化 作者信息 Tejas Thosani Process Control Systems, Micron Technology Inc., Manassas, USA tthosanimicron.com Andres Prado Esp…...