【Android】getwidth和getmeasuredwidth的区别以及两者的使用场景

首先,看getWidth()的官方说明:

public final int getWidth ()

Added in API level 1

Return the width of the your view.

Returns
  • The width of your view, in pixels.

返回view的宽度,说的不详细,再看getWidth源码:

<span style="font-size:18px;">    /**
     * Return the width of the your view.
     *
     * @return The width of your view, in pixels.
     */
    @ViewDebug.ExportedProperty(category = "layout")
    public final int getWidth() {
        return mRight - mLeft;
    }</span>

从源码可以看出,getwidth返回的是右边坐标减轻坐标减去左边坐标,这要在布局之后才能确定它们的坐标,也就是说在布局后才能调用getwidth来获取。所以getWidth()获得的宽度是View在设定好布局后整个View的宽度。

而对于getmeasuredwidth,

public final int getMeasuredWidthAndState ()

Added in API level 11

Return the full width measurement information for this view as computed by the most recent call to measure(int,
int)
. This result is a bit mask as defined byMEASURED_SIZE_MASK and MEASURED_STATE_TOO_SMALL.
This should be used during measurement and layout calculations only. Use getWidth() to
see how wide a view is after layout.

Returns
  • The measured width of this view as a bit mask.

得到的是最近一次调用measure()方法测量后得到的是View的宽度,它应该仅仅用在测量和Layout的计算中。再看源码:

    /**
     * Like {@link #getMeasuredWidthAndState()}, but only returns the
     * raw width component (that is the result is masked by
     * {@link #MEASURED_SIZE_MASK}).
     *
     * @return The raw measured width of this view.
     */
    public final int getMeasuredWidth() {
        return mMeasuredWidth & MEASURED_SIZE_MASK;
    }

return The raw measured width of this view 获得的是原始的测量宽度。所以说getMeasuredWidth()是对View上的内容进行测量后得到的View内容占据的宽度。前提是你必须在父布局的onLayout()方法或者此View的onDraw()方法里调用measure(0,0);(measure中的参数的值你自己可以定义),否则你得到的结果和getWidth()得到的结果是一样的。

两者的使用场合:

getMeasuredWidth:在自定义view重写onLayout时、在我们用layoutinflater动态加载view后想获得view的原始宽度时。

getWidth:一般在view已经布局后呈现出来了,想获取宽度时

时间: 2024-10-11 06:56:12

【Android】getwidth和getmeasuredwidth的区别以及两者的使用场景的相关文章

getwidth和getmeasuredwidth的区别以及两者的使用场景

getWidth()获得的宽度是View在设定好布局后整个View的宽度 getMeasuredWidth()是对View上的内容进行测量后得到的View内容占据的宽度. getWidth得到是某个view的实际尺寸. getMeasuredWidth是得到某view想要在parent view里面占的大小. 两者的使用场合: getMeasuredWidth:在自定义view重写onLayout时.在我们用layoutinflater动态加载view后想获得view的原始宽度时. getWid

Android中View窗体getWidth和getMeasuredWidth的区别

今天在研究自定义listview的下拉刷新的效果,想移植到项目需求中,再看自定义源码时发现了一个问题就是getWidth和getMeasuredWidth两个方法有什么区别,求教万能的百度,经调研发现这两个方法的不同点是,getWidth获得的是当前View的可视的宽度,但是向下拉刷新这样的需求,那个头部提示的View是隐藏起来的这样用getWidth就获取不到View的宽度了,所以采取getMeasuredWidth的方式获得.getMeasuredWidth的方法代表了可以获取View的可视

Android getWidth和getMeasuredWidth

1. 在一个类初始化时,即在构造函数当中我们是得不到View的实际大小的.感兴趣的朋友可以试一下,getWidth()和getMeasuredWidth()得到的结果都是0.但是我们可以从onDraw()方法里面的到控件的大小. 2.这两个所得到的结果的单位是像素即pixel. getWidth(): 得到的是view在父Layout中布局好后的宽度值,如果没有父布局,那么默认的父布局就是整个屏幕. getMeasuredWidth():先看一下API里面是怎么说的.The width of t

Android中View窗口getWidth和getMeasuredWidth的差别

今天在研究自己定义listview的下拉刷新的效果.想移植到项目需求中,再看自己定义源代码时发现了一个问题就是getWidth和getMeasuredWidth两个方法有什么差别,求教万能的百度,经调研发现这两个方法的不同点是,getWidth获得的是当前View的可视的宽度,可是向下拉刷新这种需求,那个头部提示的View是隐藏起来的这样用getWidth就获取不到View的宽度了.所以採取getMeasuredWidth的方式获得. getMeasuredWidth的方法代表了能够获取View

android 适配器simpleadapter和baseadapter区别

android 适配器 simpleadapter 和 baseadapter 设计网络程序或者数据处理显示程序的时候,常常会使用 simpleadapter 和baseadapter 来实现. adapter 是适配器模式,是数据和界面之间的桥梁.baseadapter 是一个抽象的类,要使用必需为其定义子类并实现相关方法.simpleadapter 派生于 baseadapter ,已经实现了相关的方法,所以可以直接使用.二者在使用效果上没有太大的区别,两者可以设计出几乎一模一样的界面.但在

Android getMeasuredHeight()与getHeight()的区别

public final int getMeasuredHeight () Added in API level 1 Like getMeasuredHeightAndState(), but only returns the raw width component (that is the result is masked by MEASURED_SIZE_MASK). Returns The raw measured height of this view. public final int

java的String和android的String有什么区别?

这是今天阿里电话面试被问到的,在之前确实没有想过(一直以为是一样的),于是面试完之后,我马上打开了源码,对这两个String类进行了比较,下面是我的发现. 首先我观察了这两个String类所导入的包,发现两者有些差异: 这是android版本: import java.io.Serializable; import java.io.UnsupportedEncodingException; import java.nio.ByteBuffer; import java.nio.CharBuffe

Android Message和obtainMessage的区别

前几天需要实现一个以太网功能就看了以太网的源码部分,看见了源码部分在消息处理时,发现有一些不同的地方: 平时我在处理消息时: 1.首先创建Handler对象: private Handler handler = new Handler(){ public void handleMessage(Message msg) { switch (msg.what) { case 0: break; default: break; } }; }; 2.然后是消息处理: private void TestH

Android中@id与@+id区别

近日升级adt21+后,在输出apk时碰到编译layout异常,看了下是因为有人在layout引用一个不存在的resID时用了 @+id/xxx,而不是@id/xxx,导致debug编译器没显示错误,而在打包时的编译器出现错误,adt21-则没有此问题. 附上配图说明: Android中@id与@+id区别 : Android中的组件需要用一个int类型的值来表示,这个值也就是组件标签中的id属性值. id属性只能接受资源类型的值,也就是必须以@开头的值,例如,@id/abc.@+id/xyz等