最近在看Android底层代码的view绘制原理的时候讲到一个很有意思的事情,也是我几年前刚开始学习Android开发的时候比较纳闷的一个问题,如果你不理解Android的底层绘制,请看我之前一片文章对View绘制的简单分析点击打开链接

那么在onCreate()获取view的width和height会得到0呢,原因是Android的oncreate和onMesure是不同步的,我们在onCreate里面获取的width和height,控件还没有绘制完成呢。

针对上面的问题,网上提供了4种解决方案:

1,View.post()

此方法的思路是在onCreate里面执行一个线程,知道获取View的宽高属性。

view.getViewTreeObserver().addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
            mScrollView.post(new Runnable() {
                public void run() {
                    view.getHeight(); //height is ready
                }
            });
        }
});

2,ViewTreeObserver

ViewTreeObserver监听不同的界面绘制事件。一般来说OnGlobalLayoutListener就是可以让我们获得到view的width和height的地方

但是注意这个方法在每次有些view的Layout发生变化的时候被调用(比如某个View被设置为Invisible),所以在得到你想要的宽高后,记得移除onGlobleLayoutListener。

3,onWindowFocusChanged()

当Activity的当前Window获得或失去焦点时会被回调此方法。我们看一下其调用顺序为Activity.oncreate()→Activity.onResume()→

→TestImageView.onMeasure()→TestImageView.onLayout()→onGlobalLayoutListener()→Activity.onWidnowFocusChanged()→.....→

→TextImageView.onDraw()。

所以在onWindowFocusChanged获取的也是不为0的。

4,重写View的onLayout方法

我们知道Android的view绘制流程中是onMesure->onLayout()的顺序,所以在onLayout获取的也是真实的数据。

view = new View(this) {
    @Override
    protected void onLayout(boolean changed, int l, int t, int r, int b) {
        super.onLayout(changed, l, t, r, b);
        view.getHeight(); //height is ready
    }
};

最新文章

  1. 初识Java
  2. java文件上传和下载
  3. XMPP协议错误码
  4. Xaml/Xml 实现对象与存储分离
  5. [J2ME] 基本框架框架
  6. Ubuntu Server安装图形界面全过程
  7. 使用Spring的jdbcTemplate进一步简化JDBC操作
  8. no permissions fastboot
  9. Paxos算法(转)
  10. js购物时的放大镜效果
  11. Java中Timer和TimerTask的使用
  12. Java之路——环境配置与编译运行
  13. python学习日记(正则表达式)
  14. ActiveMQ的断线重连机制
  15. 五一培训 DAY1
  16. win10安装java
  17. Javascript htmldecode
  18. Python自动化编程-树莓派GPIO编程(二)
  19. Android常用学习网站
  20. curl 超时设置<转>

热门文章

  1. c++ 深入理解数组
  2. OpenSuSE Linux下安装Oracle10g的步骤
  3. 排序算法的C语言实现(上 比较类排序:插入排序、快速排序与归并排序)
  4. Spring统一返回Json工具类,带分页信息
  5. URL重定向漏洞,python打造URL重定向漏洞检测脚本
  6. 阿里巴巴Java开发规约插件
  7. OC基础之推荐一个旋转木马(跑马灯)效果的图片展示Demo
  8. Rails做rspec测试时出现bcrypt错误的解决
  9. WmS详解(二)之如何理解Window和窗口的关系?基于Android7.0源码
  10. JAVA面向对象-----匿名内部类