Android高级UI系列教程(一)
自定义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系列教程(一)相关推荐
- Android高级UI系列教程(二)
上期回顾 Android高级UI系列教程(一)_我想月薪过万的博客-CSDN博客https://blog.csdn.net/qq_41885673/article/details/121870917 ...
- Android 高级UI解密 (三) :Canvas裁剪 与 二维、三维Camera几何变换(图层Layer原理)
Android的绘图机制是核心内容之一,无论是什么样的功能最终都是以图像的形式呈现给用户.因此掌握Android的绘图技巧,有助于Android理解层次的提高,在面对产品经理提出的idea时也更有底气 ...
- 你连《Android高级UI与FrameWork源码》都搞不懂学什么Android?还敢面试阿里P7!
Android高级UI与FrameWork源码 重要性? 这块知识是现今使用者最多的,我们称之为Android2013~2016年的技术,但是,即使是这样的技术,Android开发者也往往因为网上Co ...
- Lance老师UI系列教程第三课-QQ登录注册界面的实现(android-2012最新版)
分类: android UI教程2012-08-06 22:37 3731人阅读 评论(6) 收藏 举报 uiandroidqqlayoutbutton UI系列教程第三课:腾讯登录注册界面的实现 今 ...
- Android 高级UI解密 (四) :花式玩转贝塞尔曲线(波浪、轨迹变换动画)
讲解此UI系列必然少不了一个奇妙数学曲线-–贝塞尔曲线,它目前运用于App的范围是在太广了,最初的QQ气泡拖拽,到个人界面的波浪效果.Loading波浪效果,甚至于轨迹变化的动画都可以依赖贝塞尔曲线完 ...
- android炫酷动画代码,Android高级UI特效仿直播点赞动画效果
Android高级UI特效仿直播点赞动画效果 发布时间:2020-10-02 16:06:18 来源:脚本之家 阅读:117 作者:mrr 本文给大家分享高级UI特效仿直播点赞效果-一个优美炫酷的点赞 ...
- android高级UI视频全套
android高级UI视频全套 http://nez.cc/NfhYoO
- android app初始化sdk,Android SDK使用系列教程——2.SDK初始化和常用类介绍
本帖最后由 碎羽 于 2015-6-18 11:36 编辑 上次讲到SDK的下载和导入,这次来讲讲SDK的初始化和常用类的介绍. 一.初始化SDK 初始化SDK,首先要获得对应设备的AppID.App ...
- android高级UI之贝塞尔曲线<上>---基本概念、德卡斯特里奥算法
在上一次android高级UI之Canvas综合案例操练 - cexo - 博客园对于Android UI绘制中核心的Canvas进行了相关的学习,这块的学习也中断一年多了,既然主业是Android开 ...
- android高级UI之PathMeasure<一>--Path测量基础(nextContour、getPosTan、getMatrix、getSegment)
前言: 在上一次android高级UI之贝塞尔曲线<下>--贝塞尔曲线运用:QQ消息气泡完成了对于贝塞尔曲线绘制的学习,今天准备学习UI绘制中经常会用到的跟Path相关的一些知识,也是很重 ...
最新文章
- 开源服务专题之------ssh防止暴力破解及fail2ban的使用方法
- yii2.0 下拉菜单
- Python类的静态属性、类方法、静态方法
- bitbucket初次使用
- virtual多态 你不知道的事情
- web开发环境_Web开发人员的开发环境
- 【转】ABP源码分析十四:Entity的设计
- composer不成功的原因
- linux的常用操作——lftp、nfs、ssh和scp
- 甘蔗是怎么变成白糖的?
- Cadence画PCB的傻瓜式教程
- 快捷指令|支付宝合集|安卓支付宝shell快捷指令大全
- mysql中数据库改名字_MySQL数据库改名字
- 前端css样式如何设置内边框
- C#面向对象编程:构造函数
- firefox 浏览器证书问题
- 计算机毕业设计之java+ssm供应链管理信息系统
- 计算机机房新风机的作用,机房为什么要装新风系统,附解决方案
- python二重积分_用python求一重积分和二重积分的例子
- excel取消密码_取消excel工作簿的保护(无密码)
热门文章
- 谐波小波 matlab,基于谐波小波的电力系统谐波分析
- 计算机酒店管理论文,计算机专业酒店管理系统毕业论文.doc
- PHP教程一环境搭建 Wampserve 下载和安装
- 为什么有些蓝牙耳机有底噪?高音质便宜实惠的蓝牙耳机分享
- 软件测试经典面试题30道
- 大革命修改后无法连接服务器,刺客信条大革命常见问题解决方法 中文设置教学...
- 各种时频分析方法-不定期更新
- 简单实用的web打印方案-网页精准打印
- Casewhen和Decode
- 如何从 Hibernate官网下载 hibernate原码 和hibernatetools