美文网首页Android开发Android技术知识Android进阶之路
View篇(一):玩一下自定义ViewGroup

View篇(一):玩一下自定义ViewGroup

作者: cff70524f5cf | 来源:发表于2019-02-21 22:00 被阅读4次

    自定义ViewGroup可不像自定义View那么简单

    今日聚焦:

    1.自定义ViewGroup中花样布局子View2.移动View用layout、translation、TranslationAnimation、ViewPropertyAnimator、scrollTo、scrollBy有什么区别?3.ViewGroup里怎么给孩子加动画4.惯性移动? 也许你可以了解一下复制代码

    效果 1

    效果 2

    一、前置知识:

    1.生命函数

    这是我曾经测试画出的一张图,描述了ViewGroup+两个孩子的生命函数调用情况

    在这补充一点,ViewGroup在没有背景时不会走onDraw方法,但可以走dispatchDraw原因在于View对onDraw的控制时做了限定:[if(!dirtyOpaque) onDraw(canvas)]  你可以使用onDraw,在之前设个透明色即可:setBackgroundColor(0x00000000);

    2.View与Activity之间

    貌似一直没有对Activity与View的生命周期一起做过测试

    测试之后发现View加载完成之后(onFinishInflate)并未立即回调测量、布局、绘制

    而是在onResume之后View才会回调onAttachedToWindow-->onMeasure-->onSizeChanged-->onLayout-->onDraw

    这一点确实让我挺惊讶,以前竟然没注意,现在理清了,通畅很多

    2019-02-19 16:50:29.998 : onCreate --------------

    2019-02-19 16:50:29.992 : 构造函数: 0

    2019-02-19 16:50:29.996 : onFinishInflate: 0

    2019-02-19 16:50:33.001 : onStart: ...................

    2019-02-19 16:50:33.006 : onResume: ...................

    2019-02-19 16:50:33.050 : onAttachedToWindow: 

    2019-02-19 16:50:33.207 : onMeasure: 0

    2019-02-19 16:50:33.243 : onMeasure: 0

    2019-02-19 16:50:33.354 : onSizeChanged: 1948

    2019-02-19 16:50:33.358 : onLayout: 1948

    2019-02-19 16:50:33.395 : onDraw: 1948

    二、自定义ViewGroup (排兵布阵)

    经测试发现注意点:

    [1].必须onMeasure中测量孩子的尺寸,否则无法显示

    [2].必须onLayout中布局孩子的位置,否则无法显示

    [3].在onLayout中孩子不能用view.getHeight()获取尺寸(因为为0),只能用view.getMeasuredHeight复制代码

    1.最简形式的ViewGroup

    这里使用适配器模式,跟ListView一个套路,其实是非常简单,看箭头所指

    这里暂时不对ViewGroup进行测量,先填满。对子View用自带的测量方法measureChildren

    2.布局子view

    这里关键在排布这里给张图先:子View布局的左上右下

    3.放置成圆形

    4.添加点击事件

    这就比较容易了,一个监听搞定

    5.数组点阵定位

    这突然让我想到一个好玩的东西,那就是点阵控位。

    点阵控位可以使用二维数组,也可以使用字符串,也可以使用像素点。

    具体的可以详见我的这篇:这里就放一张核心的分析图:我们这里不画圆,而是取点位

    ok了,只要把1放在你想要的位置,子View就在那里,

    不过简单一点的还好说,要是爱心...来看神技:

    5.位图点阵定位

    用黑白(就相当于上面1,0)来标识点位,再根据Bitmap的像素进行

    Bitmap内存杀手? 7*7像素的Bitmap也就九牛一毛...

    就是下面的小不点,你可以下载玩玩。有PS,你也可以用ps自己戳点

    到这里排兵布阵就结束了,相信对onLayout已经能玩的6了吧,接下来上阵杀敌。

    二.移动测试篇

    既然是测试,就一切从简,直切问题本身,这里新建了一个Activity

    并且打开了手机自带的布局便界显示,这样更能说明问题所在

    1.布局

    自定义:TestViewGroup+TestView纯原生,不加防腐剂

    为了说明问题,这里的TestViewGroup加了边距

    2.代码实现

    3.移动:layout与translation

    这样对比应该非常明显:layout真的把布局移动了,translation只是离家出走而已

    layout-----

    translation

    点击事件在绿色上点击事件在绿色上

    4 : 移动动画和属性动画

    移动动画都是从家里开始,属性动画移动从当前位置,但是家还在那里!

    也就是传说中的属性动画也并无法改变View的布局位置

    TranslationAnimation

    ViewPropertyAnimator

    点击事件在家里点击事件在绿色上

    5:哥就像让View搬家动画怎么办?

    很简单:ValueAnimator呗,在刷新时对layout进行更新

    由于有四个setXXX方法,这里,简单一点,使用ObjectAnimator

    6:scrollTo和scrollBy

    可以说这两个方法和上面的不是一辈的人,应用场景有很大区别

    这两个方法是移动一个View内部的所有子View,调用方并非子View

    至于To和By的区别,也是老生常谈,看图体悟吧...

    scroll

    ToscrollBy

    Ok ,基础知识就到这里

    最后附上小编整理出来的Android相关的学习思维导图,让大家有个学习的方向,早日拿到大厂的offer。

    Android进阶

    Android前沿技术

    Flutter

    移动架构师

    需要这些安卓学习资料和面试资料的大伙需要的关注+点赞+加群:185873940 免费获取!

    群内还有许多免费的关于高阶安卓学习资料,包括高级UI、性能优化、架构师课程、 NDK、混合式开发:ReactNative+Weex等多个Android技术知识的架构视频资料,还有职业生涯规划及面试指导。

    相关文章

      网友评论

        本文标题:View篇(一):玩一下自定义ViewGroup

        本文链接:https://www.haomeiwen.com/subject/bnfjyqtx.html