• 不会拍照的程序员不是一个好厨师

  • #1楼 @diycode-reward 谢谢,插值器和估值器网上有不少写的很不错的文章,所以我就没有在这里去分析了

  • 喜欢烧菜,弄点好吃的,但是还没有狂热的状态吧

  • #6楼 @lwj1994 findviewbyId 可以放到一个函数里面 整理好 放着 我觉得看上去还好

  • #5楼 @myroid 恩,我暂时的使用范围在demo中,还有一些基本不会做第二次的东西

  • 正好最近在研究自定义View,略有心得,就来分享一下。自定义View的概念很简单,但实际操作中你会发现你需要了解的东西多的超乎你的想象,不是仅仅去看几篇文章就可以学会的,需要你在了解View基本绘制流程的情况下,不断的去进行实战,以学习更多的内容。

    View的基本绘制流程

    • Constructors 进行一些参数的初始化,比如自定义属性
    • onMeasure 测量View及其子View的宽高属性,这里是属性,而不仅仅是宽高的值
    • onLayout 确定View及其子View的布局位置,也就是View及其子View在父容器中的坐标位置
    • onSizeChanged View的大小发生改变时,将调用此函数,一个View的大小在绘制过程中可能发生改变,比如父View
    • onDraw View的内容绘制部分,系统会提供给我们一块画布

    在了解上述流程之后,可以去学习一些Api,这些Api将在onDraw中对View进行绘制。

    Canvas常用方法

    • 绘制图形(点、线、矩形、椭圆、圆等)
    • 绘制文本(文本的居中问题,需要Paint知识)
    • 画布的基本变化(平移、缩放、旋转、倾斜)
    • 画布的裁剪
    • 画布的保存
    • ...

    Paint常用方法

    • 颜色
    • 类型(填充、描边)
    • 字体大小
    • 宽度
    • 对齐方式
    • 文字位置属性测量
    • 文字宽度测量
    • 笔锋
    • ...

    Path常用方法

    • 添加路径
    • 移动起点
    • 贝塞尔(二阶、三阶)
    • 逻辑运算
    • 重置路径
    • PathEffect
    • Matrix
    • PathMeasure
    • ...

    学习到此,你已经可以绘制出,丰富多彩的自定义View了。但是你可能会发现他们都是静止的,并无法进行移动,所以接下来就需要对animator进行学习,主要学习的方面就是属性动画。

    动画

    • ObjectAnimator
    • ValueAnimator
    • AnimatorSet
    • 差值器
    • 估值器

    学习完动画,你的自定义View已经可以完成各种特效了。但是你现在可能会想,我定义的一直都是View,那么如何自定义ViewGroup呢?那么就需要对View的源码进行学习。

    View源码分析

    • View的测量流程
    • View的布局流程
    • View的绘制流程

    现在你可能还会想,像ScrollView、Viewpager滑动的View是如何实现的呢?那么你就需要对View的事件分发以及滑动进行学习了。

    View事件分发

    • dispatchTouchEvent
    • onInterceptTouchEvent
    • onTouchEvent
    • onTouchListener
    • onClick
    • onLongClick
    • 滑动冲突

    View的滑动

    • Scroller
    • invalidate的传递
    • requestLayout的传递

    到这里你已经对自定义View进行了深入的学习了,但是现在还有一些东西需要去掌握,那就是如何改造系统现有的View,来更简单的完成自定义View。

    经常改造的View有

    • ListView
    • RecyclerView
    • Button
    • ImageView
    • ...

    至此,你已经掌握了应用层的自定义View的知识,如果你还有兴趣可以继续深入,比如openGl、WMS。以下是我的自定义View系列文章。


    Android自定义View系列


    文章目前写了12篇,刚刚写到了我前面说到的事件分发和滑动部分,后面还会继续更新。如果在阅读的过程发现问题,您可以通过issue、评论、邮件等方式联系我。