首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Android 自定义ViewonMeasure onLayout onDraw

正文 Android自定义View时常重写三个方法onMeasureonLayout以及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布局文件中使用

2.4K10
您找到你想要的搜索结果了吗?
是的
没有找到

【错误记录】Android Studio 布局文件报错 ( View with id -1: xx.MyView#onMeasure() did not set the measured dime )

或 ViewGroup onMeasure() 方法 中 没有调用 setMeasuredDimension() 方法导致 ; 实现 onMeasure() 方法时,需要 调用 setMeasuredDimension...() 来设置 View 或 ViewGroup 测量宽度高度。...以下是一个示例,在这个示例中,自定义 View onMeasure() 方法调用了 setMeasuredDimension() 来设置 View 测量宽度高度。...然后 , 使用一个固定宽高比(0.75f)计算出视图高度。 最后 , 调用 setMeasuredDimension() 方法来设置视图测量宽度高度。...实现 onMeasure() 方法时,必须在最后 调用 setMeasuredDimension() 来设置视图测量宽度高度。

58610

Android自定义View:getWidth()、getMeasuredWidth()获取宽高什么区别

前言 在自定义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:手把手教你写一个完整自定义

1.4K41

Android视图绘制流程完全解析,带你一步步深入了解View(二)

一. onMeasure() measure是测量意思,那么onMeasure()方法顾名思义就是用于测量视图大小。...View系统绘制流程会从ViewRootperformTraversals()方法中开始,在其内部调用Viewmeasure()方法。...()这个方法是final,因此我们无法在子类中去重写这个方法,说明Android是不允许我们改变Viewmeasure框架。...你已经知道,onMeasure()方法会在onLayout()方法之前调用,因此这里在onMeasure()方法中判断SimpleLayout中是否包含一个子视图,如果有的话就调用measureChild...说到这里,我相信很多朋友长久以来都会有一个疑问,getWidth()方法getMeasureWidth()方法到底什么区别呢?它们值好像永远都是相同

1.4K80

Carson带你学Android:手把手带你深入学习自定义View Measure过程

具体流程 源码分析 /** * 源码分析:measure() * 定义:Measure过程入口;属于View.java类 & final类型,即子类不能重写此方法 * 作用:基本测量逻辑判断...源码总结 对于单一View测量流程(Measure)各个方法说明如下所示。 测量宽高关键在于getDefaultSize(),该方法测量逻辑如下图所示。...* 注:ViewGroup = 一个抽象类 = 无重写ViewonMeasure(),需自身复写 **/ 根据上一小节可知,单一Viewmeasure过程对onMeasure()统一实现...宽/高测量值 ->>分析2 // 传入参数通过getDefaultSize()获得 ->>分析3 } 原因是:onMeasure()方法作用是测量View宽/高值,而不同ViewGroup...总结 测量流程(Measure)根据视图(View)类型分为两种情况:单一View视图组ViewGroup; 二者最大区别在于:单一Viewmeasure过程对onMeasure()作统一实现

28210

函数方法什么区别

下面的实例,定义一个函数方法,然后调用函数方法。...1、调用函数时,直接使用函数名即可(如果调用者被调用者都在同一个包名下);调用方法,需要实例化结构体,然后通过结构体方式去调用方法(结构体实例化多种,示例代码使用是字面量方式)。...使用指针 接下来,在函数方法中使用指针大佬修改值效果。...都能够修改原值,这一点不管是函数还是方法,都没是一样。 是否同名 接下来,通过下面的实例代码,来演示函数方法是否支持定义相同名称。...⽅法接受者,⽽函数⽆接受者 1、Go语⾔⽅法method是⼀种作⽤于特定类型变量函数,这种特定类型变量叫做Receiver(接受者、接收者、接收器); 2、接受者概念类似于传统⾯向对象语⾔中this

18720

Android自定义View:源码解析通过getWidth() 与 getMeasuredWidth()获取宽高区别

前言 在自定义View过程中,使用getMeasuredWidth() / getMeasuredHeight() 与 getWidth() / getHeight()都能获取View宽 / 高,但是二者什么区别呢...()与getMeasuredHeight()同理,下面只讲解getMeasuredWidth() 请务必先了解自定义ViewMeasure过程:自定义View Measure过程 - 最易懂自定义View...() -> 分析1 // } /** * 分析1:setMeasuredDimension() * 作用:存储测量后View宽 / 高 * 注:该方法即为我们重写onMeasure...measuredWidth 是从getDefaultSize()获得 // 在onMeasure()里调用 -> 分析2 /** * 分析2:onMeasure() * 作用:a....onWindowFocusChanged()时,View已经测量好了,即走完了Measure & Layout过程,所以选择在此方法中获取 实现代码 public class MainActivity

1.6K20

Android技能树 — View小结

因为这三个方法及后面的方法调用都差不多,我们以performMeasure为例,performMeasure会调用measure方法,而measure方法又会调用onMeasure方法(PS:是不是就发现了为啥我们平时都是重写...,然后又会在onMeasure方法里面去调用所有子Viewmeasure过程。 我们可以看到思维脑图中有提到顶级View就是DecorView,那DecorView是什么呢?...DecorView是一个FrameLayout,里面包含了一个竖向LinearLayout,一般来说这个LinearLayout是上下二部分(这里具体跟Android SDK主题有关): ?...,然后调用子Viewmeasure()传递进去(前面提过,measure()方法会调用onMeasure()方法。)...ViewLayoutParams传进来MeasureSpec, //把这二者通过getChildMeasureSpec方法获得一个新childMeasureSpec,然后传给child.measure

78320

call()方法apply()方法什么区别

call() apply() 都是 JavaScript 中用于调用函数方法,它们主要区别在于参数传递方式。...call() 方法: call() 方法是 JavaScript 函数原生方法之一,它允许你在指定作用域内调用函数,并且可以显式地设置函数 this 值传递参数列表。...apply() 方法: apply() 方法与 call() 方法类似,也是用于在指定作用域内调用函数,但它接受参数是以数组或类数组对象形式传递。...主要区别: call() 方法使用逗号分隔参数列表来传递参数,而 apply() 方法使用数组或类数组对象来传递参数。...总结,call() apply() 方法都允许你在指定作用域内调用函数,并设置函数 this 值,但参数传递方式不同。

14710

源代码分析:LayoutParamswrap_content, match_parent, 而详细价值观

概述: 带着困扰我问题,本文试图分析理解view measure 过程,在分析过程中重点分析了LayoutParams 中MATCH_PARENTMATCH_PARENT 相应关系。...讨论怎样重写onMeasure()方法。 LayoutParams 中MATCH_PARENTMATCH_PARENT 相应关系 为什么从perform 開始本文。...请见Android 动画animation 深入分析 在android.view.ViewRootImpl.performTraversals() 中開始measure过程...能够看到measure过程就是调用了 view onMeasure()方法。 就是假设要自己定义view的话须要重写onMeasure()方法。.... onMeasure() 方法是被用来计算宽高, 子类须要重写这种方法来提供更加准确高效计算方法

49520

安卓 View 工作流程

View 工作流程主要是指 measure、layout、draw 这三大流程,即测量、布局绘制,其中 measure 确定 View 测量宽/高,layout 确定 View 最终宽/高四个顶点位置...Viewmeasure过程Viewmeasure过程由其measure方法来完成,measure方法是一个final类型方法,这意味着子类不能重写此方法,在Viewmeasure方法中会去调用View...onMeasure方法,因此只需要看onMeasure实现即可,ViewonMeasure方法如下所示。...View不同是,ViewGroup是一个抽象类,因此它没有重写ViewonMeasure方法,但是它提供了一个叫measureChildren方法,如下所示。...Layout过程measure过程相比就简单多了,layout方法确定View本身位置,而onLayout方法则会确定所有子元素位置,先看Viewlayout方法

41020

自定义View Measure过程 - 最易懂自定义View原理系列(2)

其中,测量模式(Mode)类型3种:UNSPECIFIED、EXACTLY AT_MOST。具体如下: ?...下面我将一个个方法进行详细分析:入口 = measure() /** * 源码分析:measure() * 定义:Measure过程入口;属于View.java类 & final类型,即子类不能重写此方法...ViewonMeasure(),需自身复写 **/ 为什么ViewGroupmeasure过程不像单一Viewmeasure过程那样对onMeasure()做统一实现?...子类等)具备不同布局特性,这导致他们子View测量方法各有不同 而onMeasure()作用 = 测量View宽/高值 因此,ViewGroup无法对onMeasure()作统一实现。...(widthMeasure, heightMeasure); } // 从上可看出: // 复写onMeasure()三步,其中2步直接调用系统方法 // 需自身实现功能实际仅为步骤

86520

Activity 启动过程简单分析

上面介绍这些,只是执行完了 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 方法了。

43110

高级 UI 成长之路 (三) 理解 View 工作原理并带你入自定义 View

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

59840

一篇文章弄懂Android自定义viewgroup相关难点

view(不是viewgroup噢)来说一定在onMeasure方法中计算出自己尺寸并且保存下来 2.viewgroup实际上最终也是循环从上大小来调用子viewmeasure方法,注意子view...measure其实最终调用是子viewonMeasure 方法。...所以我们理解这个过程为: viewgroup循环遍历调用所有子viewonmeasure方法,利用onmeasure方法计算出来大小,来确定这些子view最终可以占用大小所处布局位置。...layoutonlayout是一样关系。 4.父view调用子viewlayout方法时候会把之前measure阶段确定位置大小都传递给子view。...onMeasure其实就是遍历自己view 对自己每一个子view进行measure,绝大多数时候对子viewmeasure都可以直接用 measureChild()这个方法来替代,简化我们写法

66230
领券