高级自定义View系列四;ScrollView的嵌套滑动冲突的解决(下)

作者:波澜步惊
链接:https://www.jianshu.com/p/8ee2acc24755

前言

手把手讲解系列文章,是我写给各位看官,也是写给我自己的。
文章可能过分详细,但是这是为了帮助到尽量多的人,毕竟工作5,6年,不能老吸血,也到了回馈开源的时候.
这个系列的文章:
1、用通俗易懂的讲解方式,讲解一门技术的实用价值
2、详细书写源码的追踪,源码截图,绘制类的结构图,尽量详细地解释原理的探索过程
3、提供Github 的 可运行的Demo工程,但是我所提供代码,更多是提供思路,抛砖引玉,请酌情cv
4、集合整理原理探索过程中的一些坑,或者demo的运行过程中的注意事项
5、用gif图,最直观地展示demo运行效果

如果觉得细节太细,直接跳过看结论即可。
本人能力有限,如若发现描述不当之处,欢迎留言批评指正。

高级自定义View系列文章,都为学员波澜步惊在学习高级进阶课程的过程中所吸收和思考的知识,尤其对于从事Android开发3-5年,处于瓶颈期需要寻找突破和进阶方向的小伙伴们一定有所启发和帮助的

高级自定义View系列思维脑图;

高级自定义View系列四;ScrollView的嵌套滑动冲突的解决(下)_第1张图片

学到老活到老,路漫漫其修远兮。与众君共勉 !


github地址:

下载之后找到其中的 MemoryClearDrawable

前言

关于自定义绘制view,有了之前一篇,再加上这一篇,应付工作中的大部分动效绘制 应该足够了。

效果图:

高级自定义View系列四;ScrollView的嵌套滑动冲突的解决(下)_第2张图片
image

源码讲解

MemoryClearDrawable

特别说明:自定义View,可以继承view,可以继承View的某个实现,可以继承ViewGroup或者ViewGroup的某个实现,具体做法很多,但是究其原理,无非就是自绘 / 组合. 而自绘,可以继承View去重写onDraw,也可以继承Drawable 去重写draw.

继承View 和 继承Drawable的区别是:
1.后者使用比前者更简单,只需要重写draw过程,并且不需要操心onMeasure的一堆破事。
2.setAlpha、setColorFilter、getOpacity也需要重写,但是模板固定.

另外,Drawable (英文翻译为 "可绘制")可以理解为它就是一张图,可以当作图片去使用,并且这张图比 jpg/png 这种资源文件更省apk空间。

但是,继承Drawable有一个缺点:如果我们的自定义效果里面包含了手势操作,例如需要重写onTouchEvent,那么drawable就不能使用了,还是只能继承View,去重写测量 布局 绘制

思路

我上面提供了动画减速的按钮,应该可以帮助大家更好去分解动画。

遇到复杂动画,第一件事就是放慢速度观察,看看具体有哪些绘制 、动效 步骤。
针对上面这个动画,

我们能够分析出
静止的部分有:

1.最外围的绿色背景

2.外围的白色圆圈(带渐变色)

3.中间的白色叉叉

4.叉叉消失之后的一个小圆点

5.小圆点消失之后的勾勾

6.纵横的辅助线(也可以不画)

动态的部分有:

1.白色圆圈(带渐变色)的旋转

2. 叉叉逐渐缩小直到消失

3.叉叉消失之后的一个小圆点 上移

4.叉叉消失之后的一个小圆点 下移

5.小圆点消失之后的勾勾的伸长


开始撸码

1、从静止的部分开始写:

TIPS: 自定义View的绘制,很大一部分工作量都是在坐标计算上。根据以往的经验,在绘制开始之前,将坐标轴平移到画面中心,一般都可以减轻计算的工作量,所以:

@Override
    public void draw(@NonNull Canvas canvas) {
        canvas.translate(mWidth / 2, mHeight / 2);//第一件事,先把坐标轴移动到中央,为了绘制方便
        ...
}

首先平移坐标轴,总是有好处的。

TIPS:坐标计算的过程,文字很难说的清,请阅读源码,应该能看懂

按照上面的6点要素,一个一个绘制, 确认单步绘制调试没有错误之后,把各个步骤的绘制方法独立出来.

高级自定义View系列四;ScrollView的嵌套滑动冲突的解决(下)_第3张图片
image

2、静止的部分完了,那么现在是动态的部分。

TIPS: 我们看到的动画效果,都是利用人肉眼的影像残留特性,通过短时间刷新视图,造成动画的假象。自定义View做动画,可以通过ValueAnimator当作计算器 来改变全局参数,然后把全局参数 加入到 绘制的计算中。
动态的部分,按照步骤来:一共有5部分,如上述。
我把5个步骤定义为5种状态,通过内部类Status来管理。

高级自定义View系列四;ScrollView的嵌套滑动冲突的解决(下)_第4张图片
image

然后根据状态的不同来执行不同的绘制过程

高级自定义View系列四;ScrollView的嵌套滑动冲突的解决(下)_第5张图片
image

然后结合 ValueAnimator 对参数的改变,加上invalidateSelf 刷新自身来造成动画效果。

高级自定义View系列四;ScrollView的嵌套滑动冲突的解决(下)_第6张图片
image

每一个步骤也是要单步调试,确定OK了,再编码下一步动画。

3、最后一步,利用AnimatorSet将所有的分步 animator 顺序执行

高级自定义View系列四;ScrollView的嵌套滑动冲突的解决(下)_第7张图片
image

结语

以上就是 这个效果的大概实现思路,我写完之后,针对代码的可读性进行了多次重构,应该能保证大部分人都能阅读无障碍。

网上的自定义控件博文确实很多,但是能够详细讲解,并且提供案例,能够换位思考的作者,实在是太少。所以我写了两篇手把手系列,给自己以后温故而知新,也希望能帮到需要帮助的 大佬····

如果有大佬读了源码有问题,欢迎随时指教!

你可能感兴趣的:(高级自定义View系列四;ScrollView的嵌套滑动冲突的解决(下))