习惯了使用xml的布局方式,当动态布局的时候就有许多疑点,记录一下,帮助我这老头一样的记忆力.

网上也有许多解析这getLayoutParams().width,getWidth(),getMeasuredWidth();三种方式的获取区别,参考并理解了下:

getLayoutParams().width:

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

getLayoutParams().width获取的宽度是条件是你地xml中定义该view的时候,android:widt="150dp",就是固定值, 注意:返回的值都是px单位.

如果你设置了"match_parent","wrap_content",返回的值是-1,其实是定义的常量:

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实际绘画的宽度.怎么说呢,其实应该是接近实际宽度.

getWidth()

getWidth()大多人使用的时候返回都是0,因为在oncreat()中view还没被绘制的,在制onWindowFocusChanged()开始绘制的,getWidth()获取的就是该view的实际宽度.所以要想获取该高度在oncreat():
 ViewTreeObserver vto2 = firstAd.getViewTreeObserver();         vto2.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() {             @Override             public void onGlobalLayout() {                 firstAd.getViewTreeObserver().removeGlobalOnLayoutListener(this);                 RelativeLayout.LayoutParams lp= (RelativeLayout.LayoutParams) firstAd.getLayoutParams();

getMeasuredWidth()

在onMeasure()执行完后才会有值 ,该方法就是getLayoutParams().width所说的父容器寄给的最大宽度.
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后的不一样。 
FlexboxLayoutAndroid 上实现了类似 CSS Flexible Box Layout Module 效果的界面排版。示例代码:FlexboxLayout flexboxLayout = (FlexboxLayout) findViewById(R.id.flexbox_layout); flexboxLayout.setFlexDirection(FlexboxLayout.FLEX_DIRECTION_COLUMN); View view = flexboxLayout.getChildAt(0); FlexboxLayout.LayoutParams lp = (FlexboxLayout.LayoutParamsview.getLayoutParams(); lp.order = -1; lp.flexGrow = 2; view.setLayoutParams(lp);屏幕截图: 标签:谷歌  google  排版库 getLayoutParams方法抛出java.lang.NullPointerException: Attempt to write to field 'int android.view.ViewGroup$LayoutParams.width' on a null object reference;空指针异常? 自定义View一般都需要重写onMeasure()、onLayout()、onDraw()。但自定义ViewGroup更重要的是onMeasure()和onLayout(),因为作为容器,onDraw()方法显得没那么必要,即时你重写了此方法,它也不会调用,毕竟容器只需要关注自己内部view的摆放和约束其大小而已。 一、onMeasure如何测量child? 我们在重写完 onMeasure(int widthMeasureSpec, int heightMeasureSpec) 内部有width getLayoutParams().width可以在onMesure()方法中获取 。 若在xml文件中定义了该view的具体宽度,如android:layout_width="500dp",view.getLayoutParams().width就为500; 若定义为android:layout_width="match_parent",则v... 自己的笔记,对于Layoutparams.getLayoutParams 转载于他人……(好无耻啊…) android.view..getLayoutParams(); 接下来上文档Get the LayoutParams associated with this view. All views should have layout parameters. These supply paramet 前言上一篇文章,笔者主要讲述了DecorView以及ViewRootImpl相关的作用,这里回顾一下上一章所说的内容:DecorView是视图的顶级View,我们添加的布局文件是它的一个子布局,而ViewRootImpl则负责渲染视图,它调用了一个performTraveals方法使得ViewTree开始三大工作流程,然后使得View展现在我们面前。本篇文章主要内容是:详细讲述View的测量(Me... setLayoutParams和getLayoutParams都是当前view对象的parent对象的LayoutParams,不要以为是当前view对象的LayoutParams LinearLayout.getLayoutParams().width 对应xml的 layout_width LinearLayout.getWidth() 这个东西要在 onMeasure之后才会真正的值 而onMeasure 是根据 今天做项目的时候,碰到一个问题: 1、在onCreate的时候,我想设置View的大小的位置,我调用View.setLeft(),View.setRight(),View.setTop(),View.setBottom()等属性,结果不起作用。。。。 2、回来改变它的LayoutParamsLayoutParams.widthLayoutParams.height = height,Lay LayoutParams继承于Android.View.ViewGroup.LayoutParams. LayoutParams相当于一个Layout的信息包,它封装了Layout的位置、高、宽等信息。假设在屏幕上一块区域是由一个Layout占领的,如果将一个View添加到一个Layout中,最好告诉Layout用户期望的布局方式,也就是将一个认可的layoutParams传递进去。 view.getlayoutparams()不改变在xml里布局好的view的位置,比如view居中,如果用layoutparams param= new layoutparams()再设置view。setlayouparams(param)那么在xml里设置的view的属性就没有用了 他会... setLayoutParams不生效,请大家指点大家好,我想实现能改变menu_layout的位置,使用如下代码实现,但运行没有效果,请大家指导下,谢谢。protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_mai... LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) textview.getLayoutParams(); lp.leftMargin = 0; textview.setLayoutParams(lp); 二、实际应用实例:控件随手指移动。 1、布局文件文件RelativeLayout中有个ImageVIew,id是code。 2、首先我们要给控件设置触摸... 项目链接:点击打开链接前段时间和同事一起写了一个下拉刷新和上拉加载的控件。该控件实现的功能的功能还是挺多的。支持自定义头部和底布局,同时还处理了NestScrolling机制的嵌套滑动的一些东西。我们先来看下效果图吧。1.主页面布局展示2.支持RecycleView的刷新和加载效果。3.支持listView的刷新和加载效果。4.支持ScrollView的刷新和加载效果5.支持NestScrolli... topBg.layoutParams.height=130 //重新设置背景框高度 topBg.layoutParams.width=130 //重新设置背景框宽度 注意:topBg是控件的id,此时130的单位是px。 2、用Kotlin编写单位转换的方法 //根据手机的分辨率从 dp 的单位 转成为 px(像素) fun dip2px(context: Context, dpValue: Int): Int { val scale = c