Android获取view高度

原创 2016年05月30日 23:17:14

getMeasuredHeight()与getHeight的区别

实际上在当屏幕可以包裹内容的时候,他们的值相等,
只有当view超出屏幕后,才能看出他们的区别:
getMeasuredHeight()是实际View的大小,与屏幕无关,
而getHeight的大小此时则是屏幕的大小。

当超出屏幕后,getMeasuredHeight()等于getHeight()加上屏幕之外没有显示的大小

具体方法

我们知道在oncreate中View.getWidth和View.getHeight无法获得一个view的高度和宽度,这是因为View组件 布局要在onResume回调后完成。

下面说三种方式

getViewTreeObserver

使用 getViewTreeObserver().addOnGlobalLayoutListener()来获得宽度或者高度。

OnGlobalLayoutListener 是ViewTreeObserver的内部类,当一个视图树的布局发生改变时,可以被ViewTreeObserver监听到,这是一个注册监听视图树的观察者(observer),在视图树的全局事件改变时得到通知。ViewTreeObserver不能直接实例化,而是通过getViewTreeObserver()获得。
除了OnGlobalLayoutListener ,ViewTreeObserver还有如下内部类:
interfaceViewTreeObserver.OnGlobalFocusChangeListener
当在一个视图树中的焦点状态发生改变时,所要调用的回调函数的接口类
interfaceViewTreeObserver.OnGlobalLayoutListener
当在一个视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变时,所要调用的回调函数的接口类
interfaceViewTreeObserver.OnPreDrawListener
当一个视图树将要绘制时,所要调用的回调函数的接口类
interfaceViewTreeObserver.OnScrollChangedListener
当一个视图树中的一些组件发生滚动时,所要调用的回调函数的接口类
interfaceViewTreeObserver.OnTouchModeChangeListener
当一个视图树的触摸模式发生改变时,所要调用的回调函数的接口类
其中,我们可以利用OnGlobalLayoutListener来获得一个视图的真实高度。

private int mHeaderViewHeight;
private View mHeaderView;
 
.....
 
mHeaderView.getViewTreeObserver().addOnGlobalLayoutListener(
    new OnGlobalLayoutListener() {
        @Override
        public void onGlobalLayout() {
                                                                                                                                                                                                                                  
            mHeaderViewHeight = mHeaderView.getHeight();
            mHeaderView.getViewTreeObserver()
                    .removeGlobalOnLayoutListener(this);
        }
});


但是需要注意的是OnGlobalLayoutListener可能会被多次触发,因此在得到了高度之后,要将OnGlobalLayoutListener注销掉。

View post事件中获取

还可以在VIew的post方法中获取

public class TestHeight extends Activity {
    TextView tv;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_activity_b);
         tv = (TextView) findViewById(R.id.textView);
        tv.post(new Runnable() {
            @Override
            public void run() {
               int height= tv.getHeight();
            }
        });
    }


}

直接测量计算

int intw=View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
int inth=View.MeasureSpec.makeMeasureSpec(0,View.MeasureSpec.UNSPECIFIED);
textView.measure(intw, inth);
int intwidth = textView.getMeasuredWidth();
int intheight = textView.getMeasuredHeight();




欢迎扫描二维码,关注公众账号



版权声明:本文为robert原创文章,未经博主允许不得转载。博客地址http://blog.csdn.net/robertcpp

浅谈自定义View的宽高获取

自定义View的时候经常少不了获取View的宽高信息,当然不一定是自定义View的时候才会需要获取宽高信息,其他情况下我们也会有这样的需求,获取方式和获取的时机也十分讲究.下面分别从这几个api讲起:...
  • mChenys
  • mChenys
  • 2016年11月25日 17:32
  • 12202

Android View未显示时获取其高度

很多时候,我们这样来获取一个View的高度int height = view.getHeight()这个view处于显示状态的时候,并没有什么问题。 然而,当View处于View.VISIBLE或者V...
  • u010886975
  • u010886975
  • 2016年11月02日 14:12
  • 1602

Android 获得view的宽和高

在oncreate()中利用view.getWidth()或是view.getHeiht()来获取view的宽和高,看似没有问题,其实他们去得值是0,并不是你想要的结果? 这是为什么呢? ...
  • yangdeli888
  • yangdeli888
  • 2014年05月09日 16:15
  • 54840

Activity中获取view的高度和宽度为0的原因以及解决方案

android 获取宽和高不为零的方法
  • nailsoul
  • nailsoul
  • 2014年05月15日 21:37
  • 35031

Android如何正确获得View的宽和高

前言在设置PopupWindow的showAsDropDown()方法时,想让它和相对控件的底部对齐,所以想在y的偏移设置成负的高度,但是在oncreate()中利用view.getWidth()或是...
  • aiynmimi
  • aiynmimi
  • 2016年07月13日 18:23
  • 3683

获取控件(布局或View)宽度或高度的方法

1.onCreate()/onCreateView()中是无法通过view.getHight()/getWidth()反法获取到控件的高度或宽度 因为此时控件的onMeasure()方法没有调用,本身...
  • u013252711
  • u013252711
  • 2015年11月21日 15:47
  • 3673

最简单也最难——如何获取到Android控件的高度

如何获取一个控件的长和高,相信很多朋友第一眼看见这个问题都会觉得很简单,直接调用...
  • x359981514
  • x359981514
  • 2014年10月08日 21:19
  • 12236

android中获取view在布局中的高度和宽度

有时需要在 onCreate() 方法中获取某个 View 组件的宽度和高度,而直接调用 getWidth()、getHeight()、getMeasuredWidth()、getMeasuredHe...
  • qq_33275597
  • qq_33275597
  • 2017年11月29日 17:44
  • 128

Android开发:获取屏幕宽和高的两种方法(px、dip、分辨率之间的关系及px与dip互相转化)

获取屏幕宽和高的两种方法,px、dip、分辨率之间的关系及px与dip互相转化。
  • yanzi1225627
  • yanzi1225627
  • 2013年12月08日 13:02
  • 67107

Android ViewTreeObserver使用总结及获得View高度的几种方法

ViewTreeObserver 注册一个观察者来监听视图树,当视图树的布局、视图树的焦点、视图树将要绘制、视图树滚动等发生改变时,ViewTreeObserver都会收到通知,ViewTreeObs...
  • u013700502
  • u013700502
  • 2017年04月19日 10:12
  • 471
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android获取view高度
举报原因:
原因补充:

(最多只允许输入30个字)