Android获取view高度的三种方式

本文为大家分享了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(); 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • android开发教程之view组件添加边框示例

    给TextureView添加边框(专业名词为描边),有三种解决方案: 1.设置一个9 patch 的,右边框,中间是空的PNG. 2.自定义一个View,用Canvas画个边框. 3.用Android提供的ShapeDrawable来定义一个边框. 个人比较建议采用第三种方式,原因是因为第三种只要写XML,速度快,占用资源小,代码编写量也少,便于维护. 使用方法如下: 1.定义一个background.xml文件. 复制代码 代码如下: <?xml version="1.0" e

  • android获得当前view在屏幕中坐标的方法

    本文实例讲述了android获得当前view在屏幕中坐标的方法.分享给大家供大家参考.具体如下: final int[] location = new int[2]; view.getLocationOnScreen(location); 这样就可以得到该视图在全局坐标系中的x,y值,(注意这个值是要从屏幕顶端算起,也就是说包括了通知栏的高度) //获取在当前屏幕内的绝对坐标 location[0] x坐标 location[1] y坐标 应用 ,我们可以用来记录上一次listview滚动到了那

  • Android View移动的六种方法小结

    在android开发中,经常会遇到一个view需要它能够支持滑动的需求.下面通过本篇文章给大家介绍android view移动的六种方法. layout() 如果你将滑动后的目标位置的坐标传递给layout(),这样子就会把view的位置给重新布置了一下,在视觉上就是view的一个滑动的效果. public class DragView extends View{ private int lastX; private int lastY; public DragView(Context cont

  • Android下拉刷新上拉加载控件(适用于所有View)

    前面写过一篇关于下拉刷新控件的文章下拉刷新控件终结者:PullToRefreshLayout,后来看到好多人还有上拉加载更多的需求,于是就在前面下拉刷新控件的基础上进行了改进,加了上拉加载的功能.不仅如此,我已经把它改成了对所有View都通用!可以随心所欲使用这两个功能~~ 我做了一个大集合的demo,实现了ListView.GridView.ExpandableListView.ScrollView.WebView.ImageView.TextView的下拉刷新和上拉加载.后面会提供demo的

  • Android获取屏幕或View宽度和高度的方法

    本文实例讲述了Android获取屏幕或View宽度和高度的方法.分享给大家供大家参考,具体如下: 在Activity中获取屏幕的高度和宽度 Display display=getWindowManager().getDefaultDisplay(); int width=display.getWidth(); int height=display.getHeight(); 在重写ViewGroup中获取屏幕的有效宽度和高度在OnMesure方法中 protected void onMeasure

  • Android中将View的内容保存为图像的简单实例

    原理:创建一个新的Bitmap,然后再根据它来创建一个Canvas,最后调用View的draw方法将View画到Canvas上,这样得到的Bitmap就是我们想要的.代码: 复制代码 代码如下: public Bitmap createViewBitmap(View v) {        Bitmap bitmap = Bitmap.createBitmap(v.getWidth(), v.getHeight(),        Bitmap.Config.ARGB_8888);       

  • Android View源码解读 DecorView与ViewRootImpl浅谈

    前言 对于Android开发者来说,View无疑是开发中经常接触的,包括它的事件分发机制.测量.布局.绘制流程等,如果要自定义一个View,那么应该对以上流程有所了解.研究.本系列文章将会为大家带来View的工作流程详细解析.在深入接触View的测量.布局.绘制这三个流程之前,我们从Activity入手,看看从Activity创建后到View的正式工作之前,所要经历的步骤.以下源码均取自Android API 21. 从setContentView说起 一般地,我们在Activity中,会在on

  • Android动态添加View的问题解决方法

    后台代码 复制代码 代码如下: private void ChangeView()    {        ly.removeAllViews();        LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);        View layout = inflater.inflate(R.layout.grid,null);        GridView gridview

  • Android加载View中Background详解

    对大多数Android的开发者来说,最经常的操作莫过于对界面进行布局,View中背景图片的加载是最经常做的.但是我们很少关注这个过程,这篇文章主要解析view中背景图片加载的流程.了解view中背景图片的加载(资源的加载)可以让我们对资源加载的过程进行一些优化,另外当需要进行整个应用的换肤时,也可以更得心应手. View图片的加载,我们最常见的就是通过在XML文件当中进行drawable的设置,然后让Android系统帮我们完成,或者手动写代码加载成Bitmap,然后加载到View上.这篇文章主

  • 4种Android获取View宽高的方式

    有时我们会有基于这样的需求,当Activity创建时,需要获取某个View的宽高,然后进行相应的操作,但是我们在onCreate,onStart中获取View的大小,获取到的值都是0,只是由于View的绘制工程还未完成,和在onCreate中弹出Dialog或者PopupWindow会报一个Activity not running原理类似. 接下来就为大家介绍几种获取View宽高的方法: 第一种方式:重写Activity中的onWindowFocusChanged,当Activity获取到焦点的

随机推荐