getLayoutParams().width/getMeasuredWidth()/getWidth()
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的区别详解
上一篇: VC操作数据库技术
下一篇: PHP 第二节 数据类型之数值型
推荐阅读
-
Android之View的知识(getWidth() 和getMeasuredWidth区别 如何在oncreate获取宽高)
-
View的getWidth/getHeight与getMeasuredWidth/getMeasuredHeight的区别
-
【转】Android getWidth和getMeasuredWidth
-
getMeasuredWidth, getWidth 有什么区别?
-
Android自定义View5--getWidth()和getMeasuredWidth()区别, view.post(Runnable)引发内存泄漏的原因和解决
-
getLayoutParams().width/getMeasuredWidth()/getWidth()
-
自定义View(一) getMeasuredWidth和getWidth区别
-
getWidth()和getMeasuredWidth()的区别
-
getMeasuredWidth, getWidth 有什么区别?
-
Android自定义View5--getWidth()和getMeasuredWidth()区别, view.post(Runnable)引发内存泄漏的原因和解决