Android获取view高度

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();

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

时间: 2024-10-08 11:21:38

Android获取view高度的相关文章

android获取view高度方法

直接用view.getheightMesure获取不到(因为还没绘制出来) 用这个 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.getMeasure

Android 获取View宽度

/***************************************************************************** * Android 获取View宽度 * 说明: * 在View默认的构造函数里无法获取到View的宽高,需要采用另外的方式获取. * * 2016-6-15 深圳 南山平山村 曽剑锋 ****************************************************************************/

android获取view宽高的几种方法

在onCreate方法中我们通过mView.getWidth()和mView.getHeight()获取到的view的宽高都是0,那么下面几种方法就可以在onCreate方法中获取到view的宽高. 1. int w = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); int h = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED

Android 获取View绘制前的高度

在Android开发过程中,我们可能需要获取View绘制前的高度或者宽度,一种的可能情形是我们初始化的时候让某个View是Visible = Gone的,当我们触发某个事件的时候需要它显示并且希望有一些动画效果.这时候我们就要获取这个View显示前即绘制前的宽度或者高度.原理很简单,我们知道,View的绘制过程发生之前,会先执行onMeasure方法.那么我们就可以利用反射来或者我们需要的值.下面给出获取高度的代码,宽度同理. private int getTargetHeight(View v

Android获取actionbar高度和StatusBar高度的方法

ActionBar: getActionBar().getHeight(); StatusBar: /** * 获取状态栏高度 * * @return */ public static int getStatusBarHeight(Context context) { Class<?> c = null; Object obj = null; java.lang.reflect.Field field = null; int x = 0; int statusBarHeight = 0; tr

android——获取view的宽高

在activity生命周期方法:onCreate(),onStart(),onResume()中调用View.getWidth()和View.getHeight()方法获取View的高度是不可行的,因为此时布局没有加载是不可见状态. 还有当view的可见状态为:GONE,时获取的宽高也是0: 2. 解决办法: (1)直接测量: private void first() { int width = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSp

android获取状态栏高度

获取android屏幕上状态栏的高度方法网上很多这里不再敖述,只举一个例子 Rect rect = new Rect();getWindow().getDecorView().getWindowVisibleDisplayFrame(rect); rect.top便是状态栏的高度. 但是在响应的布局文件中,如果最外层的layout或者View 长宽设置为fill_parent时,上面的rect.top就为0了.

Android -- 获取View宽高

在activity中可以调用View.getWidth.View.getHeight().View.getMeasuredWidth() .View.getgetMeasuredHeight()来获得某个view的宽度或高度,但是在onCreate().onStrart().onResume()方法中会返回0,这是应为当前activity所代表的界面还没显示出来没有添加到WindowPhone的DecorView上或要获取的view没有被添加到DecorView上或者该View的visibili

Android 获取View中的组件

可以把这个view强转成ViewGroup对象,再通过getChildAt(0),getChildAt(1) 获取之后AddView可能会报错:IllegalStateException: The specified child already has a parent问题解决办法 最近遇到一个很让人头疼的问题,使用viewpager动态添加页面或者删除页面时出现了问题(java.lang.IllegalStateException: The specified child already ha