正文 Android自定义View时常重写三个方法onMeasure和onLayout以及onDraw。...他们的作用 onMeasure 计算当前View的宽高 onLayout 处理子View的布局 onDraw 绘制当前View 调用的顺序为onMeasure–>onLayout–>onDraw...其中setMeasuredDimension()方法,设置了measure过程中View的宽高 getSuggestedMinimumWidth()返回View的最小Width,Height也有对应的方法...这里对比两个方法 getMeasuredHeight() 获取测量的高度 可能和View真实的高度不一样 如果我们不调用requestLayout重新layout的话 getHeight()获取的一直会是之前的高度...有了三个构造方法需要我们重写,这里介绍下三个方法会被调用的场景: 第一个方法,一般我们这样使用时会被调用:View view = new View(context) 第二个方法,当我们在xml布局文件中使用
Android布局文件中的“@+id”和“@id”有什么区别?..."@+id/myview" android:layout_below="@id/btn_handle_myview" .../> 但需要注意的是在布局文件中,被引用的id...解决方法: 方法一:将引用id的位置改成+id,意思也就是说先将此id新增到工程的R文件中,如下: <?xml version="1.0" encoding="utf-8"?...="@+id/btn_handle_myview"这行代码已经使用+id新增了btn_handle_myview这个id,下面再为Button指定id时用+id或者id都可以,因为此时R文件中已经有btn_handle_myview...方法二:将引用id的代码放在+id的下面位置,如下: <?xml version="1.0" encoding="utf-8"?
或 ViewGroup 的 onMeasure() 方法 中 没有调用 setMeasuredDimension() 方法导致的 ; 实现 onMeasure() 方法时,需要 调用 setMeasuredDimension...() 来设置 View 或 ViewGroup 的测量宽度和高度。...以下是一个示例,在这个示例中,自定义 View 的 onMeasure() 方法调用了 setMeasuredDimension() 来设置 View 的测量宽度和高度。...然后 , 使用一个固定的宽高比(0.75f)计算出视图的高度。 最后 , 调用 setMeasuredDimension() 方法来设置视图的测量宽度和高度。...实现 onMeasure() 方法时,必须在最后 调用 setMeasuredDimension() 来设置视图的测量宽度和高度。
前言 在自定义View的过程中,使用getMeasuredWidth() / getMeasuredHeight() 与 getWidth() / getHeight()都能获取View的宽 / 高,但是二者有什么区别呢...Android:自定义View Measure过程 Carson带你学Android:自定义View Layout过程 Carson带你学Android:自定义View Draw过程 Carson...() -> 分析1 // } /** * 分析1:setMeasuredDimension() * 作用:存储测量后的View宽 / 高 * 注:该方法即为我们重写onMeasure...onWindowFocusChanged()时,View已经测量好了,即走完了Measure & Layout过程,所以选择在此方法中获取 实现代码 public class MainActivity...Measure过程 Carson带你学Android:自定义View Layout过程 Carson带你学Android:自定义View Draw过程 Carson带你学Android:手把手教你写一个完整的自定义
一. onMeasure() measure是测量的意思,那么onMeasure()方法顾名思义就是用于测量视图的大小的。...View系统的绘制流程会从ViewRoot的performTraversals()方法中开始,在其内部调用View的measure()方法。...()这个方法是final的,因此我们无法在子类中去重写这个方法,说明Android是不允许我们改变View的measure框架的。...你已经知道,onMeasure()方法会在onLayout()方法之前调用,因此这里在onMeasure()方法中判断SimpleLayout中是否有包含一个子视图,如果有的话就调用measureChild...说到这里,我相信很多朋友长久以来都会有一个疑问,getWidth()方法和getMeasureWidth()方法到底有什么区别呢?它们的值好像永远都是相同的。
具体流程 源码分析 /** * 源码分析:measure() * 定义:Measure过程的入口;属于View.java类 & final类型,即子类不能重写此方法 * 作用:基本测量逻辑的判断...源码总结 对于单一View的测量流程(Measure)各个方法说明如下所示。 测量宽高的关键在于getDefaultSize(),该方法的测量逻辑如下图所示。...* 注:ViewGroup = 一个抽象类 = 无重写View的onMeasure(),需自身复写 **/ 根据上一小节可知,单一View的measure过程对onMeasure()有统一的实现...宽/高的测量值 ->>分析2 // 传入的参数通过getDefaultSize()获得 ->>分析3 } 原因是:onMeasure()方法的作用是测量View的宽/高值,而不同的ViewGroup...总结 测量流程(Measure)根据视图(View)的类型分为两种情况:单一View和视图组ViewGroup; 二者最大的区别在于:单一View的measure过程对onMeasure()有作统一实现
下面的实例,定义一个函数和方法,然后调用函数和方法。...1、调用函数时,直接使用函数名即可(如果调用者和被调用者都在同一个包名下);调用方法,需要实例化结构体,然后通过结构体的方式去调用方法(结构体实例化有多种,示例代码使用的是字面量的方式)。...使用指针 接下来,在函数和方法中使用指针大佬修改值的效果。...都能够修改原值,这一点不管是函数还是方法,都没是一样的。 是否同名 接下来,通过下面的实例代码,来演示函数和方法是否支持定义相同的名称。...⽅法有接受者,⽽函数⽆接受者 1、Go语⾔的⽅法method是⼀种作⽤于特定类型变量的函数,这种特定类型变量叫做Receiver(接受者、接收者、接收器); 2、接受者的概念类似于传统⾯向对象语⾔中的this
前言 在自定义View的过程中,使用getMeasuredWidth() / getMeasuredHeight() 与 getWidth() / getHeight()都能获取View的宽 / 高,但是二者有什么区别呢...()与getMeasuredHeight()同理,下面只讲解getMeasuredWidth() 请务必先了解自定义View的Measure过程:自定义View Measure过程 - 最易懂的自定义View...() -> 分析1 // } /** * 分析1:setMeasuredDimension() * 作用:存储测量后的View宽 / 高 * 注:该方法即为我们重写onMeasure...measuredWidth 是从getDefaultSize()获得的 // 在onMeasure()里调用 -> 分析2 /** * 分析2:onMeasure() * 作用:a....onWindowFocusChanged()时,View已经测量好了,即走完了Measure & Layout过程,所以选择在此方法中获取 实现代码 public class MainActivity
因为这三个方法及后面的方法调用都差不多,我们以performMeasure为例,performMeasure会调用measure方法,而measure方法又会调用onMeasure方法(PS:是不是就发现了为啥我们平时都是重写...,然后又会在onMeasure方法里面去调用所有子View的measure过程。 我们可以看到思维脑图中有提到顶级View就是DecorView,那DecorView是什么呢?...DecorView是一个FrameLayout,里面包含了一个竖向的LinearLayout,一般来说这个LinearLayout是有上下二部分(这里具体跟Android SDK和主题有关): ?...,然后调用子View的measure()传递进去的(前面提过,measure()方法会调用onMeasure()方法。)...View的LayoutParams和传进来的MeasureSpec, //把这二者通过getChildMeasureSpec方法获得一个新的childMeasureSpec,然后传给child.measure
call() 和 apply() 都是 JavaScript 中用于调用函数的方法,它们的主要区别在于参数的传递方式。...call() 方法: call() 方法是 JavaScript 函数的原生方法之一,它允许你在指定的作用域内调用函数,并且可以显式地设置函数的 this 值和传递参数列表。...apply() 方法: apply() 方法与 call() 方法类似,也是用于在指定的作用域内调用函数,但它接受的参数是以数组或类数组对象的形式传递。...主要区别: call() 方法使用逗号分隔的参数列表来传递参数,而 apply() 方法使用数组或类数组对象来传递参数。...总结,call() 和 apply() 方法都允许你在指定的作用域内调用函数,并设置函数的 this 值,但参数的传递方式不同。
概述: 带着困扰我的问题,本文试图分析理解view 的measure 的过程,在分析过程中重点分析了LayoutParams 中MATCH_PARENT和MATCH_PARENT 的相应关系。...讨论怎样重写onMeasure()方法。 LayoutParams 中MATCH_PARENT和MATCH_PARENT 的相应关系 为什么从perform 開始本文。...请见Android 动画animation 深入分析 在android.view.ViewRootImpl.performTraversals() 中開始measure的过程...能够看到measure的过程就是调用了 view 的onMeasure()方法。 就是假设要自己定义view的话须要重写的onMeasure()方法。.... onMeasure() 方法是被用来计算宽高的, 子类须要重写这种方法来提供更加准确和高效的计算方法。
在继承ViewGroup类时,需要重写两个方法,分别是onMeasure和onLayout。...2,在方法onMeasure中调用孩子的measure方法 void android.view.View.measure(int widthMeasureSpec, int heightMeasureSpec...父view使用width参数和height参数来提供constraint信息。实际上,view的测量工作在onMeasure(int, int)方法中完成。...这个方法在measure(int, int)中被调用,必须被重写来精确和有效的测量view的内容。...参数说明:参数changed表示view有新的尺寸或位置;参数l表示相对于父view的Left位置;参数t表示相对于父view的Top位置;参数r表示相对于父view的Right位置;参数b表示相对于父
View 的工作流程主要是指 measure、layout、draw 这三大流程,即测量、布局和绘制,其中 measure 确定 View 的测量宽/高,layout 确定 View 的最终宽/高和四个顶点的位置...View的measure过程View的measure过程由其measure方法来完成,measure方法是一个final类型的方法,这意味着子类不能重写此方法,在View的measure方法中会去调用View...的onMeasure方法,因此只需要看onMeasure的实现即可,View的onMeasure方法如下所示。...和View不同的是,ViewGroup是一个抽象类,因此它没有重写View的onMeasure方法,但是它提供了一个叫measureChildren的方法,如下所示。...Layout过程和measure过程相比就简单多了,layout方法确定View本身的位置,而onLayout方法则会确定所有子元素的位置,先看View的layout方法。
其中,测量模式(Mode)的类型有3种:UNSPECIFIED、EXACTLY 和 AT_MOST。具体如下: ?...下面我将一个个方法进行详细分析:入口 = measure() /** * 源码分析:measure() * 定义:Measure过程的入口;属于View.java类 & final类型,即子类不能重写此方法...View的onMeasure(),需自身复写 **/ 为什么ViewGroup的measure过程不像单一View的measure过程那样对onMeasure()做统一的实现?...子类等)具备不同的布局特性,这导致他们子View的测量方法各有不同 而onMeasure()的作用 = 测量View的宽/高值 因此,ViewGroup无法对onMeasure()作统一实现。...(widthMeasure, heightMeasure); } // 从上可看出: // 复写onMeasure()有三步,其中2步直接调用系统方法 // 需自身实现的功能实际仅为步骤
上面介绍的这些,只是执行完了 installDecor() 方法,这个时候,PhoneWindow 有了 DecorView,DecorView 有了自己的样式,有了 Title 和 ContentParent...heightMeasureSpec); .......; } 该方法又调用了onMeasure 方法: // 仅仅是 View 里面的 onMeasure 方法,不同的 View 子类有不同的实现内容...其中最关键的一步就是对 View 的两个成员变量进行了赋值(在 setMeasuredDimensionRaw()) 方法中实现的 // 这个方法必须在 onMeasure() 方法中被调用用来储存测量出的宽度和高度..._1 的 onMeasure 方法,在 onMeasure 方法里面调用 tv_child_1.measure ,tv_child_1 没有孩子了,直接设置自己的大小。...和 measure 不同的是 onLayout 方法是给自己的子 View 来布局的,如果不是 ViewGroup 就不需要重写 onLayout 方法了。
Android绘制链图: 网上很多讲Android view的绘制流程往往只讲到了Measure - Layout - Draw。...我们看一下完整的绘制流程,直接上一张图,或许更能说明这个意思: 到这里,系统会调用我们之前的比较熟悉的几个方法:Measure - Layout - Draw Measure Measure过程是计算视图大小...,View中视图measure过程相关的方法主要有三个 public final void measure(int widthMeasureSpec, int heightMeasureSpec)...方法 4,使用的dispatchDraw方法 View或ViewGroup的子类不用再重载ViewGroup中该方法,因为它已经有了默认而且标准的view系统流程。...有兴趣的可以看看onDraw的源码。
如果使用Activity的startActivity方法,不会有任何限制,而如果使用Context的startActivity方法的话,就需要开启一个新的task,遇到上面那个异常的,都是因为使用了Context...的startActivity方法。...(ListView.java:1478) 09-24 13:19:06.850: E/AndroidRuntime(12237): at android.view.View.measure(View.java...ViewPager.java:1488) 09-24 13:19:06.850: E/AndroidRuntime(12237): at android.view.View.measure(View.java...$DecorView.onMeasure(PhoneWindow.java:2547) 09-24 13:19:06.850: E/AndroidRuntime(12237): at android.view.View.measure
onMeasure 测量举例 ,通过上图我们知道在 performMeasure 中会调用 measure 方法,在 measure 方法中又会调用 onMeasure 方法,在 onMeasure...View 的 measure 方法,各个子元素在递归去执行这个流程(有子 View 的情况),下面针对这两种情况分别讨论。...onMeasure(widthMeasureSpec, heightMeasureSpec); .... } View 的 measure 过程由其 measure 方法来完成...,通过 View#measure 源码可以知道 它是被 final 修饰的,那么就代表了子类不能重写,通过上面源码我们知道在 View#measure 内部又会去调用 onMeasure 方法,我们接着看它的源码实现...,和 View 不同的是 ViewGroup 是一个抽象类,因此它没有重写 View 的 onMeasure 方法,但是它定义了一个 measureChild 方法,代码如下: //ViewGroup.java
view(不是viewgroup噢)来说一定在onMeasure方法中计算出自己的尺寸并且保存下来 2.viewgroup实际上最终也是循环从上大小来调用子view的measure方法,注意子view...的measure其实最终调用的是子view的onMeasure 方法。...所以我们理解这个过程为: viewgroup循环遍历调用所有子view的onmeasure方法,利用onmeasure方法计算出来的大小,来确定这些子view最终可以占用的大小和所处的布局的位置。...layout和onlayout是一样的关系。 4.父view调用子view的layout方法的时候会把之前measure阶段确定的位置和大小都传递给子view。...onMeasure其实就是遍历自己的view 对自己的每一个子view进行measure,绝大多数时候对子view的measure都可以直接用 measureChild()这个方法来替代,简化我们的写法
领取专属 10元无门槛券
手把手带您无忧上云