• 用addOnGlobalLayoutListener获取View的宽高


    首先,我们在onCreate方法里调用getHeight()和 getWidth()是不能正确获取View的宽高的,因为onCreate方法执行完了,我们定义的控件才会被onMeasure()度量,所以我们在onCreate方法里面通过view.getHeight()获取控件的高度或者宽度肯定是0。因此我们想要获取View宽高的正确方法应该是这几种:

    方法一:

    int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED); 
    int h = View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED); 
    imageView.measure(w, h); 
    int height =imageView.getMeasuredHeight(); 
    int width =imageView.getMeasuredWidth(); 
    textView.append("
    "+height+","+width); 

    方法二:

    ViewTreeObserver vto = imageView.getViewTreeObserver(); 
    vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
        public boolean onPreDraw() { 
            int height = imageView.getMeasuredHeight(); 
            int width = imageView.getMeasuredWidth(); 
            textView.append("
    "+height+","+width); 
            return true; 
        } 
    }); 

    方法三:

    ViewTreeObserver vto2 = imageView.getViewTreeObserver();   
    vto2.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
        @Override   
        public void onGlobalLayout() { 
            imageView.getViewTreeObserver().removeGlobalOnLayoutListener(this);   
            textView.append("
    
    "+imageView.getHeight()+","+imageView.getWidth()); 
        }   
    });

    那么需要获取控件的宽高该用那个方法呢?

    方法一: 比其他的两个方法多了一次计算,也就是多调用了一次onMeasure()方法,该方法虽然看上去简单,但是如果要目标控件计算耗时比较大的话,不建议时使用,如listView等。 
    方法二,它的回调方法会调用很多次,并且滑动TextView的时候任然会调用,所以不建议使用。 
    方法三,比较合适。 
    当然,实际应用的时候需要根据实际情况而定。

  • 相关阅读:
    flume-agent实例
    Apache Ant在Windows下配置环境变量
    作业流程和优化
    使用MapReduce查询Hbase表指定列簇的全部数据输出到HDFS(一)
    使用MapReduce将HDFS数据导入到HBase(二)
    数据结构(一)线性表——顺序表
    Java类集综合练习——信息管理(增、删、改、查)
    MySQL数据库表的数据插入、修改、删除、查询操作及实例应用
    总结一下这几节Java课的...重点!!!
    文件I/O操作——File类
  • 原文地址:https://www.cnblogs.com/twodog/p/12140578.html
Copyright © 2020-2023  润新知