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

Android 自定义View中的onMeasure onLayout onDraw

正文 Android自定义View时常重写三个方法onMeasure和onLayout以及onDraw。...他们的作用 onMeasure 计算当前View的宽高 onLayout 处理子View的布局 onDraw 绘制当前View 调用的顺序为onMeasure–>onLayout–>onDraw...View中还有三个比较重要的方法 requestLayout View重新调用一次layout过程。...如果我们的自定义View内容变了 但大小位置不变的话。只需要调用invalidate. 如果我们的自定义View内容变了 大小位置也变的话。...getHeight() 获取真实的高度 自定义属性 在values文件夹下,打开attrs.xml,其实这个文件名称可以是任意的,写在这里更规范一点 假设我们用到了两个属性一个宽度,一个颜色值的属性

2.6K10

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

在Android开发中,我们经常需要自定义View来实现特定的界面效果。要实现一个自定义View,我们需要了解并掌握onLayout、onMeasure和onDraw这三个关键方法。...在布局文件中使用这个自定义View,就可以看到一个带有边框的蓝色圆形。 通过这个案例,我们可以看到,onMeasure、onLayout和onDraw这三个方法在自定义View中的重要作用。...方法 在CustomLayout类中,重写onMeasure方法,根据MeasureSpec来计算并设置ViewGroup的宽高。...通过这个案例,我们可以看到,onLayout方法在自定义ViewGroup中的重要作用。它用于确定子View的位置,根据子View的测量宽高来进行布局。...四、总结 通过本文的介绍,我们了解了onLayout、onMeasure和onDraw这三个方法在自定义View和自定义ViewGroup中的作用和用法。

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

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

    前言 自定义View是Android开发者必须了解的基础 网上有大量关于自定义View原理的文章,但存在一些问题:内容不全、思路不清晰、无源码分析、简单问题复杂化 等 今天,我将全面总结自定义View...原理中的measure过程,我能保证这是市面上的最全面、最清晰、最易懂的 目录 1....中的默认Style // 且只有在明确调用的时候才会生效, } public DIY_View(Context context,AttributeSet attrs,int defStyleAttr...为了让大家更好地理解ViewGroup的measure过程(特别是复写onMeasure()),下面,我将用ViewGroup的子类LinearLayout来分析下ViewGroup的measure过程...,而ViewGroup的Measuer过程没有; 具体测量流程总结如下所示 Carson带你学Android自定义View文章系列: Carson带你学Android:自定义View基础 Carson

    31910

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

    一、报错信息 在 ConstraintLayout 约束布局中 , 引入了自定义 View 后 , 整个 Design 图形化操作界面没了 , 报错信息如下 : java.lang.IllegalStateException...自定义 View 或 ViewGroup 的 onMeasure() 方法 中 没有调用 setMeasuredDimension() 方法导致的 ; 实现 onMeasure() 方法时,需要 调用...以下是一个示例,在这个示例中,自定义 View 的 onMeasure() 方法调用了 setMeasuredDimension() 来设置 View 的测量宽度和高度。...实现 onMeasure() 方法时,必须在最后 调用 setMeasuredDimension() 来设置视图的测量宽度和高度。...在本案例中 , 源码如下 : import android.content.Context import android.util.AttributeSet import android.view.LayoutInflater

    78010

    Android自定义View-入门(明白自定义View和自定义ViewGroup)

    > 然后在我们自定义View里面吧我们自定义的属性值取出来,在构造函数中,有个AttributeSet的属性,我们需要用它来帮我们把布局里面的属性取出来。...文件中的标签 //即属性集合的标签,在R 文件中名称为 R,styleable+name TypedArray a=context.obtainStyledAttributes...文件中的标签 //即属性集合的标签,在R 文件中名称为 R,styleable+name TypedArray a=context.obtainStyledAttributes...ViewGroup 自定义View的过程简单,其实也就那几步,可自定义ViewGroup 可就比较麻烦了,因为不仅要管好自己,还要兼顾子View。...更多Android开发知识请访问—— Android开发日常笔记,欢迎Star,你的小小点赞,是对我的莫大鼓励。

    1.2K30

    Android技能树 — View小结

    有些人可能会说那我肯定不会的,我也不用看这个总结文章了,没关系,我这次写的很简单,基本大家都能理解。看完后,大家应该都会自己写效果不复杂的自定义View和自定义ViewGroup。 PS: 非广告。...总结起来就是一句话:在测量过程中,系统会将View的LayoutParams根据父容器ViewGroup所施加的规则下,转换得出相对应的MeasureSpec,然后根据这个MeasureSpec来测量出...我们并没有用到我们前面学到的MeasureSpec的知识,因为super.onMeasure()中已经帮我们把MeasureSpec处理好了。 2....ViewGroup的测量 在讲ViewGroup的测量前面,我要提问个问题,大家应该知道了某个View的MeasureSpec在是在onMeasure()方法的参数里面传进来的。我们是直接拿来用了。...,但是每次都要写上面一大段的代码, 我不想写自定义ViewGroup了。

    80620

    长谈:关于 View Measure 测量机制,让我一次把话说完

    你不但对自定义 View 没有问题,对于自定义 ViewGroup 也不在话下,你明白 Android 给出的 3 种测量模式的含义,但是你还是没有来得及去思考,3 种测量模式本身是什么。...我们可以看到在自定义 View 的 TestView 代码中,我们并没有做测量有关的工作,因为我们根本就没有复写它的 onMeasure() 方法。...我个人觉得,尝试自己动手去实现一个流式标签控件,对于提高自定义 ViewGroup 的能力是有很大的提高,因为只有在自己实践的时候,你都会思考,在思考和实验的过程你才会深刻的理解测量机制的用途。...针对问题 1: 我们在自定义 TestViewGroup 的时候,在 onMeasure() 方法中,通过了一个 API 对子元素进行了测量,这个 API 就是 measureChildren()。...是 ViewGroup 中的 onMeasure() 调用了 View.measure() 而 View.measure() 调用了 View.onMeasure()。 ? 于是,我们终于明白了。

    75220

    Android之自定义View的死亡三部曲之Measure

    我们在上一章节Android之View的诞生之谜中分析了系统从启动actiivty到调用setContentView加载我们的xml布局文件,但是此时我们的View是不可见的,因为我们还没有对其进行如下操作...从上面我们看到,里面调用了onMeasure方法,这里要注意了: 我们的ViewGroup并没有重写View的onMeasure方法,而但是我们android开发中的四大布局 FrameLayout、LinearLayout...所以我们可以分两种情况来看待:1、布局类控件;2、一般展示类控件; 自定义控件过程中,一般情况下我们也需要通过重写onMeasure来做一些特殊处理。...不要打我,我可没骗你哦 那么,我们实际开发中肯定要处理这个情况,所以我们在自定义直接继承View来实现的控件时,一定要自己处理这两种情况哦。...至此,View的三围已经测出来了,本篇略长,测量在android的死亡三部曲中是第一部,也是里面最复杂、重要的一部,快看下你的三围是多少吧!

    37030

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

    前言 自定义View是Android开发者必须了解的基础 网上有大量关于自定义View原理的文章,但存在一些问题:内容不全、思路不清晰、无源码分析、简单问题复杂化 等 今天,我将全面总结自定义View...接下来,我将详细分析这两种measure过程 3.1 单一View的measure过程 应用场景 在无现成的控件View满足需求、需自己实现时,则使用自定义单一View 如:制作一个支持加载网络图片的...下面我将一个个方法进行详细分析:入口 = measure() 若需进行自定义ViewGroup,则需重写onMeasure(),下文会提到 /** * 源码分析:measure() * 作用...即 单一View measure过程的onMeasure()具有统一实现,而ViewGroup则没有 注:其实,在单一View measure过程中,getDefaultSize()只是简单的测量了宽高值...所以有时候也需重写onMeasure() 在自定义ViewGroup中,关键在于:根据需求复写onMeasure()从而实现你的子View测量逻辑。

    91920

    自定义View | 基础概述 & 自定义TextView实战 & 基于源码分析自定义View继承自ViewGroup时无法正常绘制的问题

    android:layout_width=""等,是系统的自定义属性; 在res下的values目录下新建一个attrs.xml文件: 【系统已经定义的属性,不能重新自定义(注意自定义属性的命名)】...--style="@style/cstyle" />--> 在Java逻辑中,编写自定义View的逻辑: 【注意三个构造函数的调用技巧, 把前两个改成this,使得始终调用第三个构造函数...默认没有设置背景时不会画出来(调用onDraw()),下面究其原因 我们自定义TextView的时候是extends View去做的, 如果extends LinearLayout等ViewGroup...、 且没有设置自定义TextView的background的话,【有background还是可以绘制】 自定义TextView就无法正常绘制【不会调用onDraw()方法】; 由下面源码, /...(); 重新计算了相关的Flags; 并调用invalidate(true);重绘; 使得ViewGroup得以显示; 解决问题——使得ViewGroup没有设置背景也能正常画出来 思路1 —

    1.1K30

    重新复习Android View的绘制流程

    开始:DecorView被加载到Window中 1.Activity里的PhoneWindow创建是在Activity的attach方法中,这个方法是Activity在ActivityThread被创建之后调用...draw方法中通过dispatchDraw来实现的,不过这并没有本质区别。...); ... } // 不同的ViewGroup子类有不同的布局特性,这导致它们的测量细节各不相同,如果需要自定义测量过程,则子类可以重写这个方法 protected void onMeasure...onMeasure进行测量,onMeasure在view之中有默认的实现,一般继承ViewGroup的类会重写这个方法来改变测量的规则, view的onMeasure会调用getDefaultSize来测量尺寸...intrinsicWidth : 0; } 如果View没有设置背景,那么返回android:minWidth这个属性所指定的值,这个值可以为0;如果View设置了背景,则返回android:minWidth

    42020

    android 自定义控件那些事

    概述 在android应用开发过程中,固定的一些控件和属性可能满足不了开发的需求,所以在一些特殊情况下,我们需要自定义控件与属性。而自定义控件通常有两种:自定义View和自定义ViewGroup。...类型布局子视图用的,在View中这个函数为空函数。...自定义ViewGroup 在讲解如何操作自定义ViewGroup之前我们来看看自定义ViewGroup的流程图: ?...在自定义ViewGroup中尝尝需要覆写onMeasure()和onLayout()等方法,这里不做过多解释,这里说一下其他的一些常用方法。...requestLayout() 当布局变化的时候,比如方向变化,尺寸的变化,会调用该方法,在自定义的视图中,如果某些情况下希望重新测量尺寸大小,应该手动去调用该方法,它会触发measure()和layout

    71180

    自定义View必备知识-View绘制流程

    而现在的Android手机几乎都没有键盘了,因此基本上只可以使用requestFocus()这个办法来让视图获得焦点了。...ViewGroup,若不重写,就会执行和单子View中相同逻辑,不会测量子View。一般会重写onMeasure()方法,循环测量子View。...onDraw()方法:无论单一View,或者ViewGroup都需要实现该方法,因其是个空方法 自定义View优化策略 为了加速你的view,对于频繁调用的方法,需要尽量减少不必要的代码。...如果可能的话,尽量调用含有4个参数的invalidate()方法而不是没有参数的invalidate()。没有参数的invalidate会强制重绘整个view。...如果你有一个复杂的UI,你应该考虑写一个自定义的ViewGroup来执行他的layout操作。

    1.7K30

    自定义View二篇,如何自定义一个规范的ViewGroup

    前言 在自定义View开篇,必须跨过的一道坎儿 中,我们介绍了自定义View的几种方式,以及如何实现一个规范的自定义View,上文中也说了,实现一个规范的自定义ViewGroup是一件比较困难的事情,因为要考虑的情况包含...的情况,在onMeasure中处理如下,同自定义View处理一样,不同的是我们需要计算子View宽高,代码如下所示: @Override protected void onMeasure(int widthMeasureSpec...在布局文件中 引用这个ViewGroup,并且添加两个子View,代码如下所示: <com.support.hlq.layout.LinerLayoutView android:layout_width...考虑ViewGroup的padding问题 上面代码,已经实现了最简单的垂直排列,我们给LinerLayoutView设置大小为40的边距,发现边距并没有生效,所以我们需要在onMeasure以及onLayout...这样一来,我们就定义了一个比较规范的ViewGroup,加上我们上篇文章讲的自定义属性,相信大家都掌握了自定义View的方法了。

    47210

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

    onMeasure 测量举例 ,通过上图我们知道在 performMeasure 中会调用 measure 方法,在 measure 方法中又会调用 onMeasure 方法,在 onMeasure...,和 View 不同的是 ViewGroup 是一个抽象类,因此它没有重写 View 的 onMeasure 方法,但是它定义了一个 measureChild 方法,代码如下: //ViewGroup.java...这是因为直接继承 View 或者 ViewGroup 的控件,如果不在 onMeasure 中对 wrap\_content 做特殊处理,那么当外界在布局中使用 wrap\_content 属性时就无法达到预期的效果...padding 结果根本没有无效,这就是我们在前面提到的直接继承自 View 和 ViewGroup 的控件,padding 是默认无法生效的,需要自己处理,我们在将其宽度设置为 wrap\_content...布局中声明自定义属性的空间,在根布局中添加如下属性 xmlns:app="http://schemas.android.com/apk/res-auto" //4.

    83440

    Android开发之漫漫长途 番外篇——自定义View的各种姿势2

    注:我真是给自己挖了个大坑,关于自定义ViewGroup的实例我想了好久也找了好久。...自定义ViewGroup(重点) 上面我们已经得到了一个布局文件达到了我们流式布局中的子View的显示效果。那我们下面就来自定义ViewGroup来实现上述的流式布局。...中调用如下语句 //MyTagFlowLayout使我们自定义的ViewGroup,目前该类还是默认实现 mGuseeYourLoveFlowLayout = (MyTagFlowLayout) findViewById...而且关于View的事件问题,我找了好久实在找不出好的例子来这里分享给大家,如果大家有好的想法,请在评论区砸我吧,最好是把View的绘制体系和事件体系完美结合、简单明了、“活血化瘀”自定义ViewGroup...最后附上这一篇以及上一篇自定义View的全部源码Github传送门 ---- 下篇预告 如果有人提供想法,那么下一篇我们还是来自定义ViewGroup,如果没有,(我的博客貌似一直很少人评论),我们就来稍微歇歇

    56230
    领券