`
砺雪凝霜
  • 浏览: 156728 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

如何获取view的宽度和高度

阅读更多
ViewTreeObserver下有六个接口:

包含下面6个事件:

interface  ViewTreeObserver.OnDrawListener

挡在一个视图树绘制时,所要调用的回调函数的接口类(level 16)

interface          ViewTreeObserver.OnGlobalFocusChangeListener  
当在一个视图树中的焦点状态发生改变时,所要调用的回调函数的接口类

interface         ViewTreeObserver.OnGlobalLayoutListener
当在一个视图树中全局布局发生改变或者视图树中的某个视图的可视状态发生改变时,所要调用的回调函数的接口类

interface          ViewTreeObserver.OnPreDrawListener
当一个视图树将要绘制时,所要调用的回调函数的接口类

interface          ViewTreeObserver.OnScrollChangedListener
当一个视图树中的一些组件发生滚动时,所要调用的回调函数的接口类

interface         ViewTreeObserver.OnTouchModeChangeListener
当一个视图树的触摸模式发生改变时,所要调用的回调函数的接口类
----------------------------------------------------------------------------------
    oncreate()方法中获取控件的宽高,只会得到0,原因是oncreate()方法执行完成后控件才会被度量(measure),所以我们在onCreate方法里面通过view.getHeight()获取控件的高度或者宽度肯定是0,因为它自己还没有被度量,也就是说他自己都不知道自己有多高,而你这时候去获取它的尺寸,肯定是不行的.
解决方法:

//————————————————方法一
调用measure方法重新测量控件,从而获取宽度和高度
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("\n"+height+","+width); 
//———————————————–方法二
在画控件之前获取宽度和高度
ViewTreeObserver vto = imageView.getViewTreeObserver(); 
vto.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { 
    public boolean onPreDraw() { 
        int height = imageView.getMeasuredHeight(); 
        int width = imageView.getMeasuredWidth(); 
        textView.append("\n"+height+","+width); 
        return true; 
    } 
}); 
//———————————————–方法三
//控件的可视状态发生改变时,获取宽度和高度
ViewTreeObserver vto2 = imageView.getViewTreeObserver();   
vto2.addOnGlobalLayoutListener(new OnGlobalLayoutListener() { 
    @Override   
    public void onGlobalLayout() { 
        imageView.getViewTreeObserver().removeGlobalOnLayoutListener(this);   
        textView.append("\n\n"+imageView.getHeight()+","+imageView.getWidth()); 
    }   
});   
方法一: 比其他的两个方法多了一次计算,也就是多调用了一次onMeasure()方法,该方法虽然看上去简单,但是如果要目标控件计算耗时比较大的话(如listView等),不建议使用.
方法二,在绘制前执行回调方法,它的回调方法会调用很多次,并且滑动TextView的时候任然会调用,所以不建议使用.
方法三,当layout或控件的visibility被调用时,执行此回调

方法四:
    private void measureItem(View child) { 
         ViewGroup.LayoutParams p = child.getLayoutParams(); 
         if (p == null) { 
             p = new ViewGroup.LayoutParams( 
                     ViewGroup.LayoutParams.MATCH_PARENT, 
                     ViewGroup.LayoutParams.WRAP_CONTENT); 
         } 

         int childWidthSpec = ViewGroup.getChildMeasureSpec(mWidthMeasureSpec, 
                 mListPadding.left + mListPadding.right, p.width); 
         int lpHeight = p.height; 
         int childHeightSpec; 
         if (lpHeight > 0) { 
             childHeightSpec = MeasureSpec.makeMeasureSpec(lpHeight, MeasureSpec.EXACTLY); 
         } else { 
             childHeightSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); 
         } 
         child.measure(childWidthSpec, childHeightSpec); 
     } 
分享到:
评论

相关推荐

    微信小程序实现动态改变view标签宽度和高度的方法【附demo源码下载】

    本文实例讲述了微信小程序实现动态改变view标签宽度和高度的方法。分享给大家供大家参考,具体如下: 1、效果展示 2、关键代码 index.wxml文件 <view class=view xss=removed>我是view标签,我现在的宽度是{{view....

    android 获取屏幕宽度和高度的工具类

    ### Android 获取屏幕宽度和高度的工具类 在Android开发中,获取屏幕的宽度和高度是一项基本但非常重要的功能。这通常用于布局管理、适配不同屏幕尺寸的设备以及执行与屏幕大小相关的操作。本文将详细介绍如何通过...

    ImageView获取宽度和高度

    在Android开发中,ImageView是用于显示图像的常见...而BitmapFactory则用于处理图像资源,提供了解码和获取原始尺寸的功能。在实际开发中,结合这些知识点,我们可以更好地管理和操作图像,提高应用的性能和用户体验。

    jQuery 获取屏幕高度和宽度

    本文将详细讲解如何使用jQuery获取屏幕的高度和宽度,这对于创建响应式网页设计或者根据屏幕尺寸调整元素布局至关重要。 首先,我们需要了解什么是屏幕高度和宽度。屏幕高度是指浏览器窗口可视区域的垂直尺寸,而...

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

    在Android开发中,获取屏幕或View的宽度和高度是常见的需求,这有助于我们精确地布局UI元素或进行自定义视图的设计。以下将详细介绍几种不同的方法来获取这些信息。 首先,我们来了解一下如何在Activity中获取整个...

    android如何获取view在布局中的高度与宽度详解

    在 Android 开发中,获取 View 的宽度和高度是非常常见的需求。然而,很多开发者可能不知道如何正确地获取 View 的宽度和高度。今天,我们将详细介绍四种获取 View 在布局中的高度与宽度的方法。 一、使用 View....

    android代码中获取控件高,宽度并修改

    本文将详细讲解如何在代码中获取控件的高度和宽度,并且如何修改这些尺寸以达到预期的显示效果。 首先,我们来探讨如何获取控件的尺寸。在Android中,控件的尺寸分为两种:测量尺寸(measured dimensions)和实际...

    ImageView 宽度设定,高度按比例缩放

    总之,通过设定ImageView的宽度、`scaleType`和`layout_height`为`wrap_content`,我们可以轻松实现宽度固定、高度按比例缩放的效果。这有助于在各种设备上提供一致的视觉体验,同时避免图片变形或失真。在实际应用...

    FlowLayout是一种根据子view的宽度排列的流式布局.rar

    在实际应用中,FlowLayout可以配合动态数据加载和Adapter使用,例如在RecyclerView中,创建一个自定义的LayoutManager,继承自FlowLayout,这样就能实现根据子View宽度自动换行的列表效果。此外,还可以通过重写某些...

    swift-UIlabel根据文本字体获得label宽度;自适应宽高

    本教程将详细讲解如何根据文本内容和字体来计算UILabel的宽度,并实现其自适应宽高的功能。 首先,我们需要理解UILabel的工作原理。UILabel在iOS中是一个内置的视图类,它能够自动处理文本的排版,包括换行、截断...

    Android获取view高度的三种方式

    在Android开发中,获取View的高度是常见的需求,特别是在布局动态计算、自定义View或滚动事件处理中。本文将详细介绍三种获取View高度的方法。 1. 使用`getMeasuredHeight()`与`getHeight()`的区别 这两个方法在大...

    js获取Html元素的实际宽度高度的方法

    在Web开发中,经常需要获取HTML元素的实际宽度和...`等代码片段,它们演示了如何实际使用这些方法来获取特定元素的高度和宽度。通过这些基础的知识点,前端开发者可以更加灵活地在实际项目中处理布局和样式相关的问题。

    UIScrollView自适应高度或宽度

    以上就是使用Objective-C实现UIScrollView自适应高度或宽度的基本步骤和关键点。Swift开发者可以通过Swift的Auto Layout API来实现相同的功能,虽然语法不同,但基本思路是一致的。在实际项目中,可能需要结合特定...

    代码动态改变View大小

    2. `getWidth()`和`getHeight()`:这两个方法返回View当前的宽度和高度(不包括padding和margin)。 3. `setMeasuredDimension(int widthMeasureSpec, int heightMeasureSpec)`:这个方法在测量阶段被调用,用于...

    获取屏幕的像素数,密度,状态栏的高度等

    在Android中,可以使用DisplayMetrics类的widthPixels和heightPixels属性来获取屏幕的像素宽度和高度。 ```java DisplayMetrics displayMetrics = new DisplayMetrics(); getWindowManager().getDefaultDisplay()....

Global site tag (gtag.js) - Google Analytics