欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

getLayoutParams().width/getMeasuredWidth()/getWidth()

程序员文章站 2022-05-04 23:37:13
...

1.getLayoutParams().width

getLayoutParams().width可以在onMesure()方法中获取 。
若在xml文件中定义了该view的具体宽度,如android:layout_width="500dp",view.getLayoutParams().width就为500;
若定义为android:layout_width="match_parent",则view.getLayoutParams().width就为-1;
若定义为android:layout_width="wrap_content",则view.getLayoutParams().width就为-2;

public static final int FILL_PARENT = -1;
public static final int MATCH_PARENT = -1;
public static final int WRAP_CONTENT = -2;

getLayoutParams().width返回的是该view向父view请求的最大宽度,应该是接近实际宽度,可能不是view实际绘画的宽度。

ps:

1). getLayoutParams()方法的调用必须要有父控件,否则返回的就是null对象。该方法返回的是该控件的LayoutParams对象。

    /**
     * Get the LayoutParams associated with this view. All views should have
     * layout parameters. These supply parameters to the <i>parent</i> of this
     * view specifying how it should be arranged. There are many subclasses of
     * ViewGroup.LayoutParams, and these correspond to the different subclasses
     * of ViewGroup that are responsible for arranging their children.
     *
     * This method may return null if this View is not attached to a parent
     * ViewGroup or {@link #setLayoutParams(android.view.ViewGroup.LayoutParams)}
     * was not invoked successfully. When a View is attached to a parent
     * ViewGroup, this method must not return null.
     *
     * @return The LayoutParams associated with this view, or null if no
     *         parameters have been set yet
     */
    @ViewDebug.ExportedProperty(deepExport = true, prefix = "layout_")
    public ViewGroup.LayoutParams getLayoutParams() {
        return mLayoutParams;
    }

2). 每个view都需要一个LayoutParams,告诉父容器的一些规则和方式,这时候该view的LayoutParams要与父容器的LayoutParam相相对应,比如该view的父容器使用的LinearLayout.LayoutParam,该view的布局类型也要对应着LinearLayout.LayoutParam,不然的话回报类型转换错误。

2. getMeasuredWidth()

getMeasuredWidth()获取的是view原始的大小,也就是这个view在XML文件中配置或者是代码中设置的大小。getMeasuredWidth()在onMeasure()执行完后才会有值 ,该方法就是 getLayoutParams().width所说的父容器寄给的最大宽度

    /**
     * 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;
    }

3. getWidth()

getWidth()获取的是这个view最终显示的大小,这个大小有可能等于原始的大小也有可能不等于原始大小。

getWidth()在layout()执行完后才能获取宽度,在onMeasure()方法中是拿不到的;

4.

View的大小由width和height决定,一个View实际上同时有两种width和height值 
第一种是measure width和measure height。他们定义了view想要在父View中占用多少width和height(详情见Layout)。measured height和width可以通过getMeasuredWidth() 和 getMeasuredHeight()获得。 
第二种是width和height,有时候也叫做drawing width和drawing height。这些值定义了view在屏幕上绘制和Layout完成后的实际大小。这些值有可能跟measure width和height不同。width和height可以通过getWidth()和getHeight()获得。这两个方法所获取的width和height可能跟实际draw后的不一样。

5. requeLayout()/invalidate()/layout()

1). requeLayout():控件会重新执行onMesure()/onLayout(),比如 ScrollView中有LinearLaout,LinearLayout里面有纵向排列的ImageView和TextView,那么假如ImageView的长宽发生了变化,而要立即在手机上显示这个变化的话,就可调用 imageView.requestLayout();,这样的话ScrollView会重新执行onMesure()这个方法会确定控件的大小,然后在确定出自己的宽高,最后在执行onLayout(),这个方法是对所有的子控件进行定位的。

只要调用addView()/setVisbility()/setText()方法,就会重新调用requestLayout(),重新执行view的绘制流程。
2). invalidate():是自定义View 的时候,重新执行onDraw()方法。
3). layout():对控件进行重新定位执行onLayout()这个方法,比如要做一个可回弹的ScrollView,思路就是随着手势的滑动子控件滑动,那么我们可以将ScrollView的子控件调用layout(l,t,r,b)这个方法就行了。

6.参考:

Viw.getLayoutParams().width 和 getMeasuredWidth() 和getWidth()区别 

RequestLayout() , Invalidate() , layout()之间的区别

Android 关于view的getLayoutParams().width,getWidth(),getMeasuredWidth();

getWidth(),getMeasuredWidth(),View.getLayoutParams.width的区别详解

相关标签: android width