http://blog.csdn.net/lfdfhl/article/details/51671038

深入探讨Android异步精髓Handler


站在源码的肩膀上全解Scroller工作机制


Android多分辨率适配框架(1)— 核心基础 
Android多分辨率适配框架(2)— 原理剖析 
Android多分辨率适配框架(3)— 使用指南


自定义View系列教程00–推翻自己和过往,重学自定义View 
自定义View系列教程01–常用工具介绍 
自定义View系列教程02–onMeasure源码详尽分析 
自定义View系列教程03–onLayout源码详尽分析 
自定义View系列教程04–Draw源码分析及其实践 
自定义View系列教程05–示例分析 
自定义View系列教程06–详解View的Touch事件处理 
自定义View系列教程07–详解ViewGroup分发Touch事件 
自定义View系列教程08–滑动冲突的产生及其处理


PS:如果觉得这个系列的每篇文章太长,那就直接看视频


你和我可能相似的感受

路上的司机都知道自定义View有三个重要的步骤:measure,layout,draw。 
关于这三个玩意,我们听得太多太多了,平常工作也基本上是这么按部就班的。 
可是有一天,我们或许会发现许多关于自定义View的开发技术我们仅仅是掌握了常见的用法,但是没有去深入学习过;许多问题一知半解,知其然而不知其所以然。比如:

  1. 为什么父View影响到了子View的MeasureSpec的生成?
  2. 为什么自定义一个View在布局时将其大小设为wrap_content但其实际却是match_parent的效果?
  3. 子View的specMode和specSize生成的依据是什么?
  4. 为什么子View对于ACTION_DOWN返回false,系统就不会将ACTION_MOVE和ACTION_UP派发给该子View?
  5. 为什么子view对于Touch事件处理返回true那么其上层的ViewGroup就无法处理Touch事件?
  6. View的滑动冲突是怎么产生的,又该怎么处理?
  7. 为什么有时requestDisallowInterceptTouchEvent()会失效?

这七个葫芦娃之前也一直困扰着我,我就去找资料看,从博客园到CSDN,从stackoverflow到EOE论坛,从百草园到三味书屋,搜了一大筐,沮丧的发现这些文章大同小异:只举个简单的例子,很少研究为什么;人云亦云,文章里的内容根本没有去验证和深究就发出来了;或者避重就轻展示简单的Demo直接把难点给绕过去了;文章零零散散不成体系……每次看完这些文章觉得还是晕头转向,稀里糊涂,原本就不多的学习动力和勇气也消失殆尽了。这可能就是《自定义View——从入门到放弃》的剧本吧:我们欲求不满,欲罢不能——想搞懂却又觉得难,想放弃又觉得舍不得。看了那么多文章依旧不能解答原来的疑惑;就像听过了许多大道理依旧不过好这一生。 
每当这个时候我都在想:要是有一个介绍自定义View的系列教程该有多好呀!要是有一个图能把繁杂的源码流程梳理得清清楚楚的那该有多好呀! 
可是,在反复的搜索之后我的愿望依旧落空了,没有人给我准备好我需要的东西。当我想安慰自己再等等的时候,我猛地想起风韵犹存的郭大婶说的那句话:每当你在感叹,如果有这样一个东西就好了的时候,请注意,其实这是你的机会。 
是啊,你怎么总是在期待别人把东西洗得干干净净,摆得整整齐齐地放在你面前呢?!? 
对啊,自己动手实现这个期待难道不是一个最好的学习过程么?! 
嗯哼,想到这里我决定了要自己梳理自定义View,而且要把它们弄成一个系列的。


自定义View系列教程

既然要重新学习自定义View,那就不能再走老路了。所以,这次我都是从源码开始的,从源码里寻找那些解开困惑的良方。在看完源码之后,我怕脑子笨过几天又忘记了,于是我又着手画流程图。印象最深的是画ViewGroup的dispatchTouchEvent()流程图,端午节在家画了一天。我以前特别讨厌画流程图,觉得花拳绣腿没有实际的用处。通过这些段时间,我才认识到自己的无知!其实,画流程图是对代码的理解和逻辑的分析是非常有帮助的!只要你能画出对应的流程图来,那么说明你是正真的理解了!画完流程图之后,我就开心地睡觉了,一觉起来发现有的东西又变得模糊了,反而是梦里的美女清晰得很,连脖子后面有颗痣都还记得!无耻啊,无耻!好吧,我只好使出我的杀手锏了———写博客!每次学习完对应的内容,我就写一篇博客记录下来,而且在记录的过程中再次梳理知识点,同时进行详细得令人发指的记录,比如在源码分析的时候哪几行是干嘛的都一一作了笔记。

最后形成了一个系列的文章:

自定义View系列教程01–常用工具介绍 
自定义View系列教程02–onMeasure源码详尽分析 
自定义View系列教程03–onLayout源码详尽分析 
自定义View系列教程04–Draw源码分析及其实践 
自定义View系列教程05–示例分析 
自定义View系列教程06–详解View的Touch事件处理 
自定义View系列教程07–详解ViewGroup分发Touch事件 
自定义View系列教程08–滑动冲突的产生及其处理

前后一共花了一个半月的时间,战线稍微拉得有点长了。没办法,基本每天都要加班,有时候连周末都难于幸免。学习的时候只有安排在晚上回家之后了。这个过程有一点点痛苦,还好,还好,坚持过来了。


多谢你们

  1. 小伙伴 
    博客是发到CSDN上的,由于每篇文章都很长,所以我有点担心没有人看。后来发现我的顾虑有点多余了,不但有人看还有的人看得很仔细并且指出了文章中的笔误,非常感谢

  2. 郭大婶 
    有几次看源码看得我有些郁闷,情绪也不好;我就硬着头皮继续看结果更悲剧了,犯了低级的错误。好在郭大婶出手相救,把我从悬崖边拉了回来。这也给我一个教训:不要死钻牛角尖难以自拔,状态不好的时候就换个思路,或者出去走走,或者听歌舒缓一下情绪,或者打开E盘学习一下中日文化交流

  3. Stay 
    开车多年的老司机了,我有次在看源码拐弯的时候卡住了。多谢他帮我拖车,拖完之后还给我讲Retrofit。


不打鸡血,不喝鸡汤;不念过往,不畏将来。

期望有一天不用写代码也吃得起馒头。

或许我是一个存在主义者。


PS:如果觉得这个系列的每篇文章太长,那就直接看视频

推翻自己和过往,重学自定义View的更多相关文章

  1. 从0开始学自定义View -1

    PS:好久没有写博客了,之前的东西有所忘记,百度一下竟然查到了自己的写过的博客,访问量还可以,一开始的写博客的初衷是把自己不会的记录下来,现在没想到也有博友会关注我,这就给了我动力,工作之余把零零碎碎 ...

  2. 自定义View系列教程01--常用工具介绍

    站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Android多分辨率适配框架(3)- 使用指南 自定 ...

  3. 自定义View系列教程08--滑动冲突的产生及其处理

    深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Andr ...

  4. 自定义View系列教程07--详解ViewGroup分发Touch事件

    深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Andr ...

  5. 自定义View系列教程06--详解View的Touch事件处理

    深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Andr ...

  6. 自定义View系列教程05--示例分析

    站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Android多分辨率适配框架(3)- 使用指南 自定 ...

  7. 自定义View系列教程04--Draw源码分析及其实践

    深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Andr ...

  8. 自定义View系列教程03--onLayout源码详尽分析

    深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Andr ...

  9. 自定义View系列教程02--onMeasure源码详尽分析

    深入探讨Android异步精髓Handler 站在源码的肩膀上全解Scroller工作机制 Android多分辨率适配框架(1)- 核心基础 Android多分辨率适配框架(2)- 原理剖析 Andr ...

随机推荐

  1. CSU 1639 队长,我想进集训队!

    水题 #include<cstdio> int main() { int x1, x2, x3, u, h; int n; while (~scanf("%d", &a ...

  2. Java中三种常见的注释(注解) Annotation

    Java为我们提供了三种Annotation方便我们开发. 1 Override-函数覆写注解 如果我们想覆写Object的toString()方法,请看下面的代码: class Annotation ...

  3. HTTP Basic Authentication认证的各种语言 后台用的

    访问需要HTTP Basic Authentication认证的资源的各种语言的实现 无聊想调用下嘀咕的api的时候,发现需要HTTP Basic Authentication,就看了下. 什么是HT ...

  4. PAT 团体程序设计天梯赛-练习集 L2-009. 抢红包

    没有人没抢过红包吧…… 这里给出N个人之间互相发红包.抢红包的记录,请你统计一下他们抢红包的收获. 输入格式: 输入第一行给出一个正整数N(<= 104),即参与发红包和抢红包的总人数,则这些人 ...

  5. 《高性能Javascript》读书笔记-3

    第三章 DOM编程 把dom和js 各自想象为一个岛,他们之间用收费的桥梁链接,每次访问dom都必须途径这座桥收取过路费,访问次数多费用就高了.所有必须减少来往次数. innerHtml 与dom比较 ...

  6. [SOJ] connect components in undirected graph

    题目描述: 输入一个简单无向图,求出图中连通块的数目 输入: 输入的第一行包含两个整数n和m,n是图的顶点数,m是边数.1<=n<=1000,0<=m<=10000. 以下m行 ...

  7. UESTC 1272 Final Pan's prime numbers(乱搞)

    题目链接 Description Final Pan likes prime numbers very much. One day, he want to find the super prime n ...

  8. linux上发布网站遇到的问题

    在linux上部署mono之后,就自己使用vs写了个简单的网站上传到linux下的apache目录下的htdocs下,就使用主机的浏览器访问地址,但是很残酷的报错了!百思不得其解.搞了半天才想到是因为 ...

  9. Openjudge-计算概论(A)-回文串判断

    描述: 任意给定一个非空的字符串,判断其是否是回文串.回文串是指正向看和反向看均相等的串,如AbcDcbA和cDDc.如果是回文串,则输出1,否则,输出0 输入长度不小于1不大于100的字符串输出如果 ...

  10. Openjudge-计算概论(A)-过滤多余的空格

    描述: 一个句子中也许有多个连续空格,过滤掉多余的空格,只留下一个空格. 输入一行,一个字符串(长度不超过200),句子的头和尾都没有空格.输出过滤之后的句子. 样例输入 Hello world.Th ...