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 的创建规则

  • 1
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

super码王

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值