Android高级UI系列教程
Posted 我想月薪过万
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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() 方法的执行
@Override
protected 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解密 :PathMeasure截取片段 与 切线(新思路实现轨迹变换)
Android 高级UI解密 :PathMeasure截取片段 与 切线(新思路实现轨迹变换)
Android 高级UI解密 :PathMeasure截取片段 与 切线(新思路实现轨迹变换)