博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何获取view的大小
阅读量:6620 次
发布时间:2019-06-25

本文共 1758 字,大约阅读时间需要 5 分钟。

 

很多初学者都会犯一个错误 ,就是在onCreate或者onStart里面去获取view的大小,然而这样获取到的宽高通常都是0,为什么呢?因为view的测量过程和activity的生命周期不是同步的,因此无法保证执行了onCreate、onStart、onResume的时候view已经测量完毕。如果还没测量完,那么获取到的宽高就会是0。

那么我们应该在哪里获取view的大小呢?以下有几种办法:

1、在onWindowFocusChanged里面获取。

这个方法是当Activity的窗口失去焦点或者获取焦点的时候就会调用,比如进行onResume或者onPause的时候,它就会被调用(因此它有可能被多次调用)。我们可以用下面的模板来获取view的宽高。

public void onWindowFocusChanged(boolean hasFocus){    super.onWindowFocusChanged(hasFocus);    if(hasFocus)    {      int width=view.getMeasuredWidth();      int height=view.getMeasuredHeight();    }}

 

2、使用view.post(runnable).

通过这个方法可以把一个runnable任务投递到消息队列的尾部。在该方法里面,会先获取view所在线程的handler(view所在的线程当然就是UI线程),然后将任务投递到handler所对应的消息队列的尾部,等待looper去获取,当looper获取到的时候,view已经初始化完毕,所以就能正确的获取它的宽高了。代码模板如下:

protected void onStart()    {        super.onStart();        view.post(new Runnable(){            @Override            public void run() {                int width=view.getMeasuredWidth();                int height=view.getMeasuredHeight();            }        });    }

3、使用ViewTreeObserver

ViewTreeObserve有许多回调接口,比如OnGlobalLayoutListener这个接口,当view树的状态发生改变的时候,或者view树内部view的可见性发生改变的时候,该接口里面的onGlobalLayout方法将被回调,可以在这个时候获取view的宽高。因此该方法可能会被多次调用,我们应当在获取到view的宽高之后把该接口监听移除。代码模板如下:

@Override    protected void onStart() {        super.onStart();        ViewTreeObserver observer=view.getViewTreeObserver();        observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {            @Override            public void onGlobalLayout() {                view.getViewTreeObserver().removeOnGlobalLayoutListener(this);                int width=view.getMeasuredWidth();                int height=view.getMeasuredHeight();            }        });    }

 

以上便是获取view大小的三种常用的方法。

 

转载于:https://www.cnblogs.com/tangZH/p/7045401.html

你可能感兴趣的文章
作为一名合格的JAVA架构师需要点亮哪些技能树?
查看>>
为什么短视频会让人刷不停?背后也许用了这套技术
查看>>
Kubernetes 在知乎上的应用
查看>>
读C#开发实战1200例子记录-2017年8月14日11:20:38获取汉字编码值
查看>>
Fescar 发布 0.3.1 版本, 支持 ZooKeeper 注册中心
查看>>
网站优化中四个常见的优化难题及解决方法!
查看>>
【死磕 Spring】----- IOC 之解析 bean 标签:BeanDefinition
查看>>
Java部署环境搭建(Linux)
查看>>
使用 will-change 来提升浏览器渲染效果
查看>>
Animation总结(差值器和估值器)
查看>>
Java数据结构与算法(十)-图
查看>>
4.1 在SELinux中客体类存在的目的
查看>>
如何用iPad运行Python代码?
查看>>
PHP学习3——数组
查看>>
E-HPC支持多队列管理和自动伸缩
查看>>
Maven的插件:命令行执行
查看>>
各种设备的CSS3MediaQuery整理及爽歪歪写法
查看>>
CVE-2017-8464远程命令执行漏洞(震网漏洞)复现
查看>>
Java 12 将于3月19日发布,8 个最终 JEP 一览
查看>>
基础为重,Python的基础,成就月薪过万
查看>>