自定义View包含什么?

布局:onLayout onMeasure / Layout : viewGroup

显示:onDraw / View:  canvas paint matrix clip rect animation path(贝塞尔) line

交互:onTouchEvent / 组合的viewGroup

自定义View如何分类?

1、自定义View

2、自定义ViewGroup

项目实战——流式布局

自定义View的绘制流程

核心思想:

自定义View主要是实现 onMeasure + onDraw

自定义ViewGroup主要是实现 onMeasure + onLayout

自定义View为什么存在3个构造方法

度量 onMeasure() 方法的执行

    @Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);}

到底是先测量自己还是先测量孩子,这个得看测量算法,一般来说都是先测量孩子,再测量自己,但是唯一特殊的就是 viewPager,他是先测量自己 再测量孩子。

所以,我们上面所说的流动布局中的onMeasure方法采用的就是先度量孩子,再度量自己。

代码实现逻辑

从上图代码中我们可以看出,其 难点 是 width 、 height、widthMeasureSpec、heightMeasureSpec 是从哪里来的。问题如下图所示:

LayoutParams是什么?与MeasureSepc有什么关系?

在此之前,我们得明白View的层次结构,树形结构,所以得遍历。

在遍历的过程中,我们使用了 递归算法 ,其运行流程图如下:

递归算法总结:

对于 ViewGroup:在执行他的 onMeasure 的时候,它会遍历子View,获取子View的LayoutParams,然后获取 childWidthMeasureSpec,然后执行 子View的 measure,最后调用 子View 的 onMeasure。如果这个子View是ViewGroup,那么递归执行以上步骤;如果这个子View是View,那么就测量自己并执行  setMeasuredDimension 保存自己的尺寸。这样别人就可以通过 getMeasuredHeight()、getMeasuredWidth()来获取宽高。

MeasureSpec是什么东西?

在 View.java 中定义的一个静态class

MeasureSpec 是一个int型 由4个字节 32 位组成 = 高2位 + 低30位

高2位代表 mode =》可以表示3个状态 分别代表 UNSPECIFIED、EXACTLY 及 AT_MOST

如何创建MeasureSpec

getChildMeasureSpec(int spec, int padding, int childDimension)spec:父亲的测量规则
padding: 父亲的padding
childDimension:自身的宽高

具体实现算法规则如下图

普通 View 的 MeasureSpec 的创建规则

Android高级UI系列教程(一)相关推荐

  1. Android高级UI系列教程(二)

    上期回顾 Android高级UI系列教程(一)_我想月薪过万的博客-CSDN博客https://blog.csdn.net/qq_41885673/article/details/121870917 ...

  2. Android 高级UI解密 (三) :Canvas裁剪 与 二维、三维Camera几何变换(图层Layer原理)

    Android的绘图机制是核心内容之一,无论是什么样的功能最终都是以图像的形式呈现给用户.因此掌握Android的绘图技巧,有助于Android理解层次的提高,在面对产品经理提出的idea时也更有底气 ...

  3. 你连《Android高级UI与FrameWork源码》都搞不懂学什么Android?还敢面试阿里P7!

    Android高级UI与FrameWork源码 重要性? 这块知识是现今使用者最多的,我们称之为Android2013~2016年的技术,但是,即使是这样的技术,Android开发者也往往因为网上Co ...

  4. Lance老师UI系列教程第三课-QQ登录注册界面的实现(android-2012最新版)

    分类: android UI教程2012-08-06 22:37 3731人阅读 评论(6) 收藏 举报 uiandroidqqlayoutbutton UI系列教程第三课:腾讯登录注册界面的实现 今 ...

  5. Android 高级UI解密 (四) :花式玩转贝塞尔曲线(波浪、轨迹变换动画)

    讲解此UI系列必然少不了一个奇妙数学曲线-–贝塞尔曲线,它目前运用于App的范围是在太广了,最初的QQ气泡拖拽,到个人界面的波浪效果.Loading波浪效果,甚至于轨迹变化的动画都可以依赖贝塞尔曲线完 ...

  6. android炫酷动画代码,Android高级UI特效仿直播点赞动画效果

    Android高级UI特效仿直播点赞动画效果 发布时间:2020-10-02 16:06:18 来源:脚本之家 阅读:117 作者:mrr 本文给大家分享高级UI特效仿直播点赞效果-一个优美炫酷的点赞 ...

  7. android高级UI视频全套

    android高级UI视频全套 http://nez.cc/NfhYoO

  8. android app初始化sdk,Android SDK使用系列教程——2.SDK初始化和常用类介绍

    本帖最后由 碎羽 于 2015-6-18 11:36 编辑 上次讲到SDK的下载和导入,这次来讲讲SDK的初始化和常用类的介绍. 一.初始化SDK 初始化SDK,首先要获得对应设备的AppID.App ...

  9. android高级UI之贝塞尔曲线<上>---基本概念、德卡斯特里奥算法

    在上一次android高级UI之Canvas综合案例操练 - cexo - 博客园对于Android UI绘制中核心的Canvas进行了相关的学习,这块的学习也中断一年多了,既然主业是Android开 ...

  10. android高级UI之PathMeasure<一>--Path测量基础(nextContour、getPosTan、getMatrix、getSegment)

    前言: 在上一次android高级UI之贝塞尔曲线<下>--贝塞尔曲线运用:QQ消息气泡完成了对于贝塞尔曲线绘制的学习,今天准备学习UI绘制中经常会用到的跟Path相关的一些知识,也是很重 ...

最新文章

  1. 开源服务专题之------ssh防止暴力破解及fail2ban的使用方法
  2. yii2.0 下拉菜单
  3. Python类的静态属性、类方法、静态方法
  4. bitbucket初次使用
  5. virtual多态 你不知道的事情
  6. web开发环境_Web开发人员的开发环境
  7. 【转】ABP源码分析十四:Entity的设计
  8. composer不成功的原因
  9. linux的常用操作——lftp、nfs、ssh和scp
  10. 甘蔗是怎么变成白糖的?
  11. Cadence画PCB的傻瓜式教程
  12. 快捷指令|支付宝合集|安卓支付宝shell快捷指令大全
  13. mysql中数据库改名字_MySQL数据库改名字
  14. 前端css样式如何设置内边框
  15. C#面向对象编程:构造函数
  16. firefox 浏览器证书问题
  17. 计算机毕业设计之java+ssm供应链管理信息系统
  18. 计算机机房新风机的作用,机房为什么要装新风系统,附解决方案
  19. python二重积分_用python求一重积分和二重积分的例子
  20. excel取消密码_取消excel工作簿的保护(无密码)

热门文章

  1. 谐波小波 matlab,基于谐波小波的电力系统谐波分析
  2. 计算机酒店管理论文,计算机专业酒店管理系统毕业论文.doc
  3. PHP教程一环境搭建 Wampserve 下载和安装
  4. 为什么有些蓝牙耳机有底噪?高音质便宜实惠的蓝牙耳机分享
  5. 软件测试经典面试题30道
  6. 大革命修改后无法连接服务器,刺客信条大革命常见问题解决方法 中文设置教学...
  7. 各种时频分析方法-不定期更新
  8. 简单实用的web打印方案-网页精准打印
  9. Casewhen和Decode
  10. 如何从 Hibernate官网下载 hibernate原码 和hibernatetools