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截取片段 与 切线(新思路实现轨迹变换)

EasyClick 原生UI 高级课程

如何从 Android 中的 Fragment 访问 UI 元素?

QtQuick系列教程之开发环境的搭建