讲师中心 微信公众号
AI工具推荐 视频效率加速

获取两个视图在绘制完成后的精确宽度(Android 教程)

大宇小哥_9461

大宇小哥_9461

发布时间:2026-01-30 22:13:01

|

949人浏览过

|

来源于php中文网

原创

获取两个视图在绘制完成后的精确宽度(Android 教程)

在 android 中,若需在布局绘制完成后同步获取两个 view 的真实宽度并用于联合计算(如设置其他控件的 margin),应避免在 `oncreate()` 中直接调用 `getwidth()`,而推荐在 `onstart()` 或更稳妥的 `view.post(runnable)` 中统一读取——后者能确保测量与布局流程彻底结束。

在 Android 视图生命周期中,onCreate() 仅完成布局资源加载和 setContentView() 调用,此时 View 尚未经过测量(measure)、布局(layout)和绘制(draw)三阶段,因此 getWidth() 和 getHeight() 返回值为 0(除非 View 已被强制测量,但不可靠)。你提到已通过 setMargins() 动态修改了 view1 和 view2 的布局参数,这会触发后续的重新测量与布局,但该过程异步发生且不保证在 onCreate() 返回前完成——因此直接读取宽度必然不准。

虽然你观察到两种 post() 写法均“有效”,但存在关键差异:

  • ✅ 推荐方式:单次 post() 统一读取

    @Override
    protected void onStart() {
        super.onStart();
        // 更简洁、更可靠:利用 onStart() 时机(绘制已完成)
        int width1 = view1.getWidth();
        int width2 = view2.getWidth();
        formula(width1, width2);
    }

    根据 Android Activity 生命周期文档,onStart() 被调用时,Activity 已进入前台,其窗口已附加(window attached),所有 View 至少已完成首次完整测量与布局。此时调用 getWidth() 是安全且高效的。

  • ⚠️ 可接受但非最优:单个 post() 内读取双 View

    Android SMS Gateway
    Android SMS Gateway

    自托管短信服务,使用 Android 手机作为网关提供 HTTP API,支持发送/接收短信,兼容主流短信网关。

    下载
    view1.post(() -> {
        int width1 = view1.getWidth(); // 此时 view1 已布局
        int width2 = view2.getWidth(); // view2 同样已完成布局(同一轮遍历)
        formula(width1, width2);
    });

    因为 post() 将任务加入主线程消息队列末尾,待当前帧绘制完成后执行,此时整个 View 树已完成 layout 阶段,两个 View 的尺寸均已确定。无需嵌套 post()——view2.post(...) 不仅冗余,还可能因两次调度引入微小延迟或竞态风险(尤其在复杂 UI 下)。

  • ❌ 不推荐:分离 post() + 异步读取

    view1.post(() -> width1 = view1.getWidth());
    view2.post(() -> width2 = view2.getWidth()); // width2 可能先于 width1 赋值!

    无法保证执行顺序,formula() 若在外部调用将面临变量未就绪问题;若强行加锁或标志位,反而增加复杂度与出错概率。

? 注意事项:

  • 若你的 Activity 启动后立即进入后台(如被电话打断),onStart() 可能被跳过或延迟,此时 post() 更鲁棒。通用最佳实践是:优先尝试 onStart();若逻辑依赖绝对绘制完成(如涉及动画起始、截图、自定义测量适配),则统一使用 view1.post(...)。
  • getWidth() 返回的是 px 单位整数,确保 formula() 中的数学运算(如 x + y)符合预期;若需 dp 转换,请使用 TypedValue.applyDimension()。
  • 对于 ConstraintLayout,setMargins() 修改后必须调用 setLayoutParams() 触发重布局,你已在 onCreate() 中正确执行,这是前提。

✅ 总结:

使用 onStart() 是最简洁、高效且符合生命周期语义的方案;若需 100% 确保绘制完成(例如兼容某些定制 ROM 或特殊启动场景),则采用 单次 post() 统一读取双 View 尺寸。永远避免嵌套 post() 或分离读取——它们徒增复杂性,无实际收益。

热门AI工具

更多
VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

Lovart
Lovart Hot

一款面向视觉设计创作的AI设计平台,可通过智能体和画布工作流辅助制作海报、Logo、网页、PPT及其他视觉内容。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

讯飞智作

讯飞智作是一款AI视频创作工具,AI文本配音工具,数字人课程、营销视频制作。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

4358

2023.08.10

margin在css中是啥意思
margin在css中是啥意思

在CSS中,margin是一个用于设置元素外边距的属性。想了解更多margin的相关内容,可以阅读本专题下面的文章。

857

2023.12.18

android开发三大框架
android开发三大框架

android开发三大框架是XUtil框架、volley框架、ImageLoader框架。本专题为大家提供android开发三大框架相关的各种文章、以及下载和课程。

902

2023.08.14

android是什么系统
android是什么系统

Android是一种功能强大、灵活可定制、应用丰富、多任务处理能力强、兼容性好、网络连接能力强的操作系统。本专题为大家提供android相关的文章、下载、课程内容,供大家免费下载体验。

2707

2023.08.22

android权限限制怎么解开
android权限限制怎么解开

android权限限制可以使用Root权限、第三方权限管理应用程序、ADB命令和Xposed框架解开。详细介绍:1、Root权限,通过获取Root权限,用户可以解锁所有权限,并对系统进行自定义和修改;2、第三方权限管理应用程序,用户可以轻松地控制和管理应用程序的权限;3、ADB命令,用户可以在设备上执行各种操作,包括解锁权限;4、Xposed框架,用户可以在不修改系统文件的情况下修改应用程序的行为和权限。

5277

2023.09.19

android重启应用的方法有哪些
android重启应用的方法有哪些

android重启应用有通过Intent、PendingIntent、系统服务、Runtime等方法。本专题为大家提供Android相关的文章、下载、课程内容,供大家免费下载体验。

685

2023.10.18

Android语音播放功能实现方法
Android语音播放功能实现方法

实现方法有使用MediaPlayer实现、使用SoundPool实现两种。可以根据具体的需求选择适合的方法进行实现。想了解更多语音播放的相关内容,可以阅读本专题下面的文章。

964

2024.03.01

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

60

2026.10.22

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

40

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Excel 教程
Excel 教程

共162课时 | 44.7万人学习

Java 教程
Java 教程

共578课时 | 193.9万人学习

Uniapp从零开始实现新闻资讯应用
Uniapp从零开始实现新闻资讯应用

共64课时 | 9.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn