推翻自己和过往,重学自定义View

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:如果觉得这个系列的每篇文章太长,那就直接看视频吧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283192.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SHELL 脚本小技巧

脚本很简单,直接上功能介绍及脚本,可以做模板使用: 记录日志,记录脚本开始执行时间、结束时间usage 函数,脚本需接参数执行,避免误执行,告诉用户,这个脚本的使用方法加锁,创建锁文件…

WinForm(十)项目框架结构

看到下面的项目结构,是否曾经相识?不要笑,这也是一种项目结构,极简主义。项目结构没有对错,合适就好,但也要有几个要求,至少要做到结构明确,清晰,当然上图的结构清晰&…

mysql索引有哪些了解_Mysql索引(简单了解)

Mysql的存储引擎,可以针对不同的表使用不同的存储引擎MyISAM:插入,查血速度快,但是不支持事物,所以适用于数据仓库,Web等InnoDB:支持事物,所以适合于事物型数据库Memory:…

Elasticsearch5.X的java配置

pom: <properties><elasticsearch.version>5.4.1</elasticsearch.version><transport.version>5.4.1</transport.version></properties><!--elasticsearch相关依赖--><dependency><groupId>org.elasticsearch</group…

使用Spring发送带附件的电子邮件(站内和站外传送)

1.使用Spring发送带附件的电子邮件 <?xml version"1.0" encoding"UTF-8"?> <beansxmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xmlns:p"http://www.spr…

vmware 克隆后Linux没有eth网卡只有lo

想试着在虚拟机上搭下主从&#xff0c;&#xff0c;&#xff0c;结果&#xff0c;克隆出来的虚拟机没有网卡。。。只有lo 于是跟着别人的来添加一个网卡 第一步&#xff1a;打开克隆的虚拟机 第二步&#xff1a; 第三步 第四步&#xff1a; 最后&#xff1a; 之后执行reboot重启…

聊一聊 C++ 中的 namespace

一&#xff1a;背景 相信大家在分析 dump 时&#xff0c;经常会看到 WKS 和 SRV 这样的字眼&#xff0c;如下代码所示&#xff1a;00007ffa778a07b8 coreclr!WKS::gc_heap::segment_standby_list 0x0000000000000000 00007ffa778a3870 coreclr!WKS::qpf 0x989680 00007ffa778…

mysql模糊查询后分页_jsp模糊查询后的数据进行分页,但点击下一页后就查询全部的了...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼String path request.getContextPath();String basePath request.getScheme() "://" request.getServerName() ":" request.getServerPort() path "/";%>信息表#container {width: 500px;}…

会议会展活动从业技能之会销流程的16个环节

会议营销是透过相对大型活动来实现销售。会议营销是细节营销&#xff0c;一般操作流程有会前、会中、会后三个阶段共计16个环节&#xff0c;每个环节都做到位了&#xff0c;衔接好了&#xff0c;会议营销的最终效果就会得到保证。一般而言&#xff0c;会议营销分为会前营销、会…

haproxy详细介绍

Haproxy是既可以工作在7层也能工作在4层的反代工具.Haproxy的功能:路由HTTP请求到后端服务器,基于cookie作会话绑定.能够将多个请求反代至后端主机完成负载均衡的效果.主服务器失败时能自动切换到备服务器上.接受特殊的端口连接完成服务监控拒绝新连接时不会关闭已经连接的请求…

SQL JOIN连接分类[转]

1、内联接&#xff08;典型的联接运算&#xff0c;使用像 或 <> 之类的比较运算符&#xff09;&#xff1b;包括相等联接和自然联接&#xff1b; 内联接使用比较运算符根据每个表共有的列的值匹配两个表中的行&#xff1b; 2、外联接。外联接可以是左向外联接、右向…

《ASP.NET Core 6框架揭秘》实例演示[17]:利用IHttpClientFactory工厂来创建HttpClient

在一个采用依赖注入框架的应用中&#xff0c;我们一般不太推荐利用手工创建的HttpClient对象来进行HTTP调用&#xff0c;使用的HttpClient对象最好利用注入的IHttpClientFactory工厂来创建。前者引起的问题&#xff0c;以及后者带来的好处&#xff0c;将通过如下这几个演示程序…

Hadoop部署方式-高可用集群部署(High Availability)

Hadoop部署方式-高可用集群部署(High Availability) 作者&#xff1a;尹正杰 版权声明&#xff1a;原创作品&#xff0c;谢绝转载&#xff01;否则将追究法律责任。 本篇博客的高可用集群是建立在完全分布式基础之上的&#xff0c;详情请参考&#xff1a;https://www.cnblogs.c…

sybase 连接mysql_如何连接到Sybase SQL Anywhere数据库

Sybase SQL Anywhere数据库具有许多非常有用的功能&#xff0c;与竞争对手相比&#xff0c;它具有很高的竞争力。首先&#xff0c;它允许您处理大量数据。其次&#xff0c;它具有很高的生产率&#xff0c;也就是说&#xff0c;可以快速提供大量数据。第三&#xff0c;它需要最少…

MaintainableCSS 《可维护性 CSS》 --- 模板篇

什么是模块(Modules) ? 模块是一个特别的独立单元&#xff0c;可以与其他模块组合以形成更复杂的结构。 在客厅里&#xff0c;我们可以认为电视&#xff0c;沙发和墙艺术是模块。它们聚在一起创造一个可用的房间。 如果我们把其中一个拿走&#xff0c;其他的能继续工作。我们不…

【汇编语言】DEBUG的使用

在masm for windows中&#xff0c;需要先生存exe文件&#xff0c;然后再点调试按钮。 常用的命令有&#xff1a; R命令&#xff1a;查看、改变CPU寄存器的内容&#xff1b;如果要修改某个寄存器的内容&#xff0c;可以在r的后面接上空格和寄存器名。如&#xff1a;-r ax&#x…

centos6.6 源码安装mysql5.5_CentOS6.x下源码安装MySQL5.5

2. 卸载原有的mysql数据库[rootzabbix ~]# yum -y remove mysql mysql-server mysql-libs compat-mysql51[rootzabbix ~]# rm -rf /var/lib/mysql[rootzabbix ~]# rm /etc/my.cnf[rootzabbix ~]# rpm -qa|grep mysql #如果还能查询出来mysql文件&#xff0c;继续删除&#xff0…

学习韩立刚老师IT运维课程,成为韩立刚老师正式学生,在全国范围为你就近推荐工作。...

2018年5月21日&#xff0c;万恒教育成立IT运维就业指导部门&#xff0c;为韩立刚老师正式学生推荐工作&#xff0c;实习单位。和国内IT外包公司HR长期合作&#xff0c;韩立刚老师技术考核通过的学生&#xff0c;为学生在全国范围就近推荐工作。有学习IT运维课程&#xff0c;打算…

Leetcode 动态规划 Trapping Rain Water

本文为senlie原创。转载请保留此地址&#xff1a;http://blog.csdn.net/zhengsenlie Trapping Rain Water Total Accepted: 14568 Total Submissions: 50810My SubmissionsGiven n non-negative integers representing an elevation map where the width of each bar is 1, co…

白盒测试用例设计方法

一、白盒测试 根据软件产品的内部工作过程&#xff0c;在计算机上进行测试&#xff0c;以证实每种内部操作是否符合设计规格要求&#xff0c;所有内部成分是否已经过检查。这种测试方法就是白盒测试。白盒测试把测试对象看做一个打开的盒子&#xff0c;允许测试人员利用程序内部…