• 用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的时候任然会调用,所以不建议使用。 
    方法三,比较合适。 
    当然,实际应用的时候需要根据实际情况而定。

  • 相关阅读:
    Shell编程笔记
    Git学习笔记
    JavaScript+jQuery实现简单的动态菜单
    JSON表单提交(ajax异步刷新)
    Json简单实例
    jsp分页
    浅谈this关键字
    Servlet+Javabean+Html实现简单的查询.删除.修改.添加四个功能
    Tomcat的安装与在myeclips中的配置
    jsp页面实现增删修改和查询
  • 原文地址:https://www.cnblogs.com/twodog/p/12140576.html
Copyright © 2020-2023  润新知