在Activity中测量控件宽高的三种方式

news/2024/9/24 18:05:14/文章来源:https://www.cnblogs.com/luqman/p/18429643

在进行Android开发时,有时需要测量控件的宽和高,常用的方式有以下三种:

(1)重写onWindowFocusChanged(hasFocus: Boolean)方法,在这个方法内获取控件的宽高

 这个方法在Activity的窗口焦点发生变化时调用,具体可以分为窗口获得焦点时和窗口失去焦点时。Activity的焦点发生变化时,相关的视图层次结构已经完成了测量,布局和绘制。

  • 获得焦点:当Activity的窗口从后台回到前台,或者从其他窗口中恢复。当获得焦点时,hasFocus传入true。
  • 失去焦点:当Activity的窗口被其他的窗口覆盖,或者用户按下home键使应用进入后台。当失去焦点时,hasFocus传入false。

(2)调用View的post(Runnable action)方法,在run方法中获取控件的宽高

  View的绘制过程包括onMesure(测量控件的宽高),onLayout(布局),onDraw(绘制)。post方法确保了所传递的Runnable对象会在视图树的测量,布局和绘制完成之后才运行,所以测试可以获取到控件的宽和高。

(3)观察者模式,给ViewTreeObserver添加监听器,在重写的方法onGlobalLayout()中获取控件的宽高

  ViewTreeObserver是一个监听视图树整体变化的类,它可以观察到视图树的各种全局事件。通过ViewTreeObserver,我们可以在视图树的布局过程完成之后获取到控件的宽高信息。

class MainActivity : AppCompatActivity() {private lateinit var tv: TextViewoverride fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)tv=findViewById(R.id.tv)tv.post(object:Runnable{//第一种方式
            override fun run() {val width=tv.widthval height=tv.heightLog.i("post","width=${width},height=${height}")}})tv.viewTreeObserver.addOnGlobalLayoutListener(object:ViewTreeObserver.OnGlobalLayoutListener{//第二种方式
            override fun onGlobalLayout() {val width=tv.widthval height=tv.heightLog.i("viewTreeObserver","width=${width},height=${height}")}})}override fun onWindowFocusChanged(hasFocus: Boolean) {//第三种方式super.onWindowFocusChanged(hasFocus)val width=tv.widthval height=tv.heightLog.i("onWindowFocusChanged","width=${width},height=${height}")}
}

 

  

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

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

相关文章

云栖3天,云原生+ AI 多场联动,新产品、新体验、新探索

云栖3天,云原生+ AI 多场联动,新产品、新体验、新探索,明天我们现场见云栖3天,云原生+ AI 20+场主题分享,三展互动,为开发者带来全新视听盛宴 2024.9.19-9.21 云栖大会 即将上演“云原生+AI”的全球盛会 展现最新的云计算技术发展与 AI技术融合之下的 “新探索” 一起来云…

11、Linux软件安装及使用

Windows软件安装流程安装检查: 检查系统是否满足软件的安装要求,包括操作系统版本、硬盘空间、内存要求等。 释放文件: 解压安装包中的文件到临时目录。 复制可执行文件: 将主要的可执行文件复制到指定的安装路径。 安装DLL动态链接库/安装服务: 根据需要安装动态链接库文件(…

Linux软件安装及使用

Windows软件安装流程安装检查: 检查系统是否满足软件的安装要求,包括操作系统版本、硬盘空间、内存要求等。 释放文件: 解压安装包中的文件到临时目录。 复制可执行文件: 将主要的可执行文件复制到指定的安装路径。 安装DLL动态链接库/安装服务: 根据需要安装动态链接库文件(…

降本 60%!小熊油耗使用阿里云 SAE 更加稳定可靠

在技术不断进步与市场竞争日益激烈的背景下,小熊油耗坚定地相信,通过持续优化和创新,定能在未来实现更大的发展与突破。感谢阿里云 SAE 为小熊油耗的成长与发展提供了强有力的支持。作者:赵世振、黛忻 把业务迁移到阿里云 SAE 之后,我们的产品更加稳定,用户体验更流畅,提…

吴辰曦的自我介绍

大家好!我是吴辰曦。我认为可以用乐观,活泼,慢热来形容我。 我性格乐观,总是能看到生活中的美好,相信无论遇到什么困难都能找到解决办法。我也很活泼,喜欢和朋友们一起玩耍、交流。不过呢,我还有点慢热,刚开始可能会比较安静,但一旦熟悉起来,就会展现出最真实的自己 …

Linux系统CentOS下挂载磁盘

1. 挂载磁盘步骤总结如下 1. 对磁盘进行分区 2. 对磁盘进行格式化 3. 将磁盘挂载到对应目录 4. 设置开机自动挂载磁盘 2. 对磁盘进行分区 2.1 查看系统设备信息 lsblk指令显示所有块设备信息:显示系统中所有的块设备信息,包括磁盘和分区 lsblk2.2 查看未挂载的磁盘 fdisk -l2…

【每周例题】蓝桥杯 C++ 生物芯片

生物芯片 题目 生物芯片题目分析 1.下面是亮灯规律,剩下的以此类推:我们可以看到,不亮灯的都是n的平方 2.所以亮灯的数目=该区间内所有灯的数量-不亮灯的数目(简而言之,所有不亮灯的号码开方后都是整数) 代码#include <iostream> #include <cmath> using…

CSDN文章导出md并迁移至博客园

一、获取所有文章地址 1.进csdn首页,点击自己的头像 2.在个人主页界面,按F12打开控制台,并找到network,找到get-business开头的请求,右键copy他的url3.选择console,输入一下代码,其中fetch里面的url是你刚才复制的地址,并把里面的size改为100(这个是返回的文章内容数,…

C#WinForm窗口或UserControl调用WPF的UserControl卡死!

辛辛苦苦的把WPF的界面弄好,但在VS中的的工具栏中把WPF的UserControl拖入到WinForm中时,VS会卡10分钟左右,然后就卡死。 最终找到原因:在定义的类整错了图中红色区域应该是Vm_Tjlx。而不是vm_Tjlx 查找原因的方法:1、在WinForm中可以用代码调用WPF。2、写一段代码就调试一…

【触想智能】工业显示器在智慧城市中的应用市场分析

随着智能技术的快速发展和智慧城市的不断兴起,工业显示器作为智慧城市基础设施的重要组成部分,正逐渐成为市场热点。触想工业显示器TPC-M200系列工业显示器不仅在监控、交通、能源等领域有着广泛应用,还在提升智慧城市管理和运营效率方面发挥着重要作用。下面触想智能小编将…

通讯异常——网卡高级设置建议

1.打开网卡高级设置 右击任务栏中网络图标出现如下菜单选项点击“打开‘网络和Internet’设置”,出现如下类似界面 鼠标点击“更改适配器选项”,出现如下界面: 右击堆栈设备所链接网络图标 鼠标点击“属性”选项,出现如下界面: 单击“配置”按钮,出现如下界面: 选择…