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

Android View的measure和onMeasure方法有什么区别?

Android View的measure和onMeasure方法是用于测量View的尺寸的两个重要方法。

  1. measure方法: measure方法是View的测量方法,用于测量View的宽度和高度。在measure方法中,View会根据父容器传递的MeasureSpec参数来确定自身的尺寸。MeasureSpec是由size和mode组成的32位整数,其中mode有三种取值:UNSPECIFIED、EXACTLY和AT_MOST。具体解释如下:
  • UNSPECIFIED:父容器对子View没有任何限制,子View可以任意取尺寸。
  • EXACTLY:父容器已经为子View指定了一个确切的尺寸,子View应当使用这个尺寸。
  • AT_MOST:子View可以根据自己的需要选择任意尺寸,但是尺寸不能超过父容器指定的最大尺寸。

在measure方法中,View会根据MeasureSpec参数计算出自身的尺寸,并通过setMeasuredDimension方法来保存测量结果。

  1. onMeasure方法: onMeasure方法是View的测量回调方法,用于实际计算View的尺寸。在onMeasure方法中,开发者可以根据需要自定义View的测量逻辑。通常情况下,我们会在onMeasure方法中调用measureChild或measureChildren方法来测量子View的尺寸,并根据子View的尺寸计算出自身的尺寸。

区别:

  • measure方法是View的测量方法,用于测量View的宽度和高度,而onMeasure方法是View的测量回调方法,用于实际计算View的尺寸。
  • measure方法中的MeasureSpec参数由父容器传递给子View,用于确定子View的尺寸限制,而onMeasure方法中可以自定义View的测量逻辑。
  • measure方法通过setMeasuredDimension方法保存测量结果,而onMeasure方法通过调用setMeasuredDimension方法来保存测量结果。

推荐的腾讯云相关产品和产品介绍链接地址: 腾讯云提供了丰富的云计算产品和服务,包括云服务器、云数据库、云存储等。具体推荐的产品和介绍链接如下:

  • 云服务器(CVM):提供弹性计算能力,支持多种操作系统,具有高性能、高可靠性和高安全性。详细介绍请参考:https://cloud.tencent.com/product/cvm
  • 云数据库MySQL版(CDB):提供高可用、高性能的MySQL数据库服务,支持自动备份、容灾和监控等功能。详细介绍请参考:https://cloud.tencent.com/product/cdb
  • 云对象存储(COS):提供安全可靠的对象存储服务,适用于存储和处理各种非结构化数据。详细介绍请参考:https://cloud.tencent.com/product/cos
  • 人工智能平台(AI Lab):提供丰富的人工智能服务,包括图像识别、语音识别、自然语言处理等。详细介绍请参考:https://cloud.tencent.com/product/ailab

请注意,以上推荐的产品和链接仅为示例,实际选择产品时应根据具体需求进行评估和选择。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android自定义View中的onMeasure、onLayout和onDraw方法解析

在Android开发中,我们经常需要自定义View来实现特定的界面效果。要实现一个自定义View,我们需要了解并掌握onLayout、onMeasure和onDraw这三个关键方法。...MeasureSpec有三种模式: EXACTLY:精确模式,对应于LayoutParams中的match_parent和具体的数值,表示父View希望子View的大小应该是一个确切的值。...在测量View的过程中,父View会根据自己的尺寸和子View的LayoutParams,计算出合适的widthMeasureSpec和heightMeasureSpec,然后通过onMeasure方法传递给子...然后根据这些信息,计算并设置View的宽度和高度。 总的来说,MeasureSpec是Android中测量View大小的一个重要机制,它帮助我们理解和处理View的测量过程。...四、总结 通过本文的介绍,我们了解了onLayout、onMeasure和onDraw这三个方法在自定义View和自定义ViewGroup中的作用和用法。

29910

Android经典面试题之View的invalidate方法和postInvalidate方法有什么区别

不过需要大家注意的是,面试官在问到View相关的问题时,就很有可能会问到postInvalidate方法,所以我们还是有必要来学习一下。...那invalidate方法和postInvalidate方法到底有什么区别呢?...invalidate方法和postInvalidate方法的区别 其实答案也很简单,就一句话: invalidate方法和postInvalidate方法都是用于进行View的刷新,invalidate...} } 在ViewGroup的invalidateChild方法中有一个循环,循环里面会一直调用父布局的invalidateChildInParent方法,而View和ViewGroup的最终父布局都是...ViewRootImpl 所以View中的invalidateInternal方法和ViewGroup中的invalidateChild方法最后殊途同归,都会调用到ViewRootImpl中的方法 public

11610
  • Android经典面试题之View的post方法和Handler的post方法有什么区别?

    在 Android 开发中,View.post(Runnable action) 和 Handler.post(Runnable r) 是两种常见的方法,用于在合适的时机将任务提交到主线程的消息队列中执行...尽管它们在很多情况下都能达到相似的效果,但它们的工作原理和使用场景有一些关键区别。...View.post(Runnable action) 1、 附加到视图的消息队列:View.post 方法会将任务附加到与该视图相关联的 Handler 的消息队列中执行。...view.post(new Runnable() { @Override public void run() { // 此时视图已经完成了测量和布局 view.setTranslationX...在处理视图相关的任务时,使用 View.post 可以确保视图已经完成布局和绘制。而在调度各种线程任务时,Handler.post 更加灵活和通用。选择哪一个方法取决于具体的需要和上下文。

    50910

    Android 自定义View中的onMeasure onLayout onDraw

    正文 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布局文件中使用

    2.6K10

    【错误记录】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() 来设置视图的测量宽度和高度。

    78410

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

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

    1.5K80

    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.7K41

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

    前言 在自定义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

    1.8K20

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

    具体流程 源码分析 /** * 源码分析: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()有作统一实现

    31910

    函数和方法有什么区别

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

    22920

    Android技能树 — View小结

    因为这三个方法及后面的方法调用都差不多,我们以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

    80620

    源代码分析:LayoutParams的wrap_content, match_parent, 而详细的价值观

    概述: 带着困扰我的问题,本文试图分析理解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() 方法是被用来计算宽高的, 子类须要重写这种方法来提供更加准确和高效的计算方法。

    57820

    高级 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

    83440

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

    其中,测量模式(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步直接调用系统方法 // 需自身实现的功能实际仅为步骤

    92020

    安卓 View 的工作流程

    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方法。

    43520

    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 方法了。

    46310
    领券