推翻自己和过往

从我的公众号开始征稿的那一天,谷哥的小弟 就成了我的第一个支持者,首篇投稿文章就是他写的。之后的几乎每一篇文章,他都会一如既往地点赞、评论、打赏、点广告,而且评论经常会顶到最上面,好像大家都认识他了一样。


那么在第一篇文章投稿之后的一个多月里,谷哥的小弟都没有再投稿。为什么呢?因为他在这一个多月的时间里苦心将自定义View的方面方面重新学习了一遍,并且整理成了八篇高质量文章,目前已经形成一个完整的系列了。这八篇文章中有多篇被推荐到了优快云的首页上,对于想学自定义View的朋友们来说,这可是不可多得的好资料,今天也是重磅推荐给大家。


谷哥的小弟 的博客地址:http://blog.youkuaiyun.com/lfdfhl


你和我可能相似的感受


路上的司机都知道,自定义View 有三个重要的步骤:measure,layout,draw。 


关于这三个玩意,我们听得太多太多了,平常工作也基本上是这么按部就班的。 


可是有一天,我们或许会发现许多关于自定义View 的开发技术我们仅仅是掌握了常见的用法,但是没有去深入学习过;许多问题一知半解,知其然而不知其所以然。比如:


1. 为什么父View影响到了子View的MeasureSpec的生成?


2. 为什么自定义一个View在布局时将其大小设为wrap_content但其实际却是ma   tch_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()会失效?


这七个葫芦娃之前也一直困扰着我,我就去找资料看,从博客园到优快云,从stackoverflow到EOE论坛,从百草园到三味书屋,搜了一大筐,沮丧的发现这些文章大同小异:


  • 只举个简单的例子,很少研究为什么;

  • 人云亦云,文章里的内容根本没有去验证和深究就发出来了;

  • 或者避重就轻展示简单的Demo直接把难点给绕过去了;


文章零零散散不成体系……每次看完这些文章觉得还是晕头转向,稀里糊涂,原本就不多的学习动力和勇气也消失殆尽了。


这可能就是《自定义View——从入门到放弃》的剧本吧:我们欲求不满,欲罢不能——想搞懂却又觉得难,想放弃又觉得舍不得。看了那么多文章依旧不能解答原来的疑惑;就像听过了许多大道理依旧过不好这一生。 


每当这个时候我都在想:要是有一个介绍自定义View的系列教程该有多好呀!要是有一个图能把繁杂的源码流程梳理得清清楚楚的那该有多好呀! 


可是,在反复的搜索之后我的愿望依旧落空了,没有人给我准备好我需要的东西。当我想安慰自己再等等的时候,我猛地想起风韵犹存的郭大婶说的那句话:每当你在感叹,如果有这样一个东西就好了的时候,请注意,其实这是你的机会。 


是啊,你怎么总是在期待别人把东西洗得干干净净,摆得整整齐齐地放在你面前呢? 


对啊,自己动手实现这个期待难道不是一个最好的学习过程么?! 


嗯哼,想到这里我决定了要自己梳理自定义View,而且要把它们弄成一个系列的。


自定义View系列教程


既然要重新学习自定义View,那就不能再走老路了。所以,这次我都是从源码开始的,从源码里寻找那些解开困惑的良方。在看完源码之后,我怕脑子笨过几天又忘记了,于是我又着手画流程图。


印象最深的是画 ViewGroupdispatchTouchEvent() 流程图,端午节在家画了一天。我以前特别讨厌画流程图,觉得花拳绣腿没有实际的用处。通过这些段时间,我才认识到自己的无知!其实,画流程图是对代码的理解和逻辑的分析是非常有帮助的!只要你能画出对应的流程图来,那么说明你是正真的理解了!画完流程图之后,我就开心地睡觉了,一觉起来发现有的东西又变得模糊了,反而是梦里的美女清晰得很,连脖子后面有颗痣都还记得!无耻啊,无耻!


好吧,我只好使出我的杀手锏了———写博客!每次学习完对应的内容,我就写一篇博客记录下来,而且在记录的过程中再次梳理知识点,同时进行详细得令人发指的记录,比如在源码分析的时候哪几行是干嘛的都一一作了笔记。


最后形成了一个系列的文章(文章不可直接点击,请点击最下方 阅读原文 按钮查看链接):


  • 自定义View系列教程01–常用工具介绍 

  • 自定义View系列教程02–onMeasure源码详尽分析 

  • 自定义View系列教程03–onLayout源码详尽分析 

  • 自定义View系列教程04–Draw源码分析及其实践 

  • 自定义View系列教程05–示例分析 

  • 自定义View系列教程06–详解View的Touch事件处理 

  • 自定义View系列教程07–详解ViewGroup分发Touch事件 

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


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


多谢你们


网络上的小伙伴 


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


郭大婶 


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


Stay


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


最后


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

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

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




如果你有好的技术文章想和大家分享,欢迎向我的公众号投稿,投稿具体细节请在公众号主页点击“投稿”菜单查看。


欢迎长按下图 -> 识别图中二维码或者扫一扫关注我的公众号:

python+opencv简谱识别音频生成系统源码含GUI界面+详细运行教程+数据 一、项目简介 提取简谱中的音乐信息,依据识别到的信息生成midi文件。 Extract music information from musical scores and generate a midi file according to it. 二、项目运行环境 python=3.11.1 第三方库依赖 opencv-python=4.7.0.68 numpy=1.24.1 可以使用命令 pip install -r requirements.txt 来安装所需的第三方库。 三、项目运行步骤 3.1 命令行运行 运行main.py。 输入简谱路径:支持图片或文件夹,相对路径或绝对路径都可以。 输入简谱主音:它通常在第一页的左上角“1=”之后。 输入简谱速度:即每分钟拍数,同在左上角。 选择是否输出程序中间提示信息:请输入Y或N(不区分大小写,下同)。 选择匹配精度:请输入L或M或H,对应低/中/高精度,一般而言输入L即可。 选择使用的线程数:一般与CPU核数相同即可。虽然python的线程不是真正的多线程,但仍能起到加速作用。 估算字符上下间距:这与简谱中符号的密集程度有关,一般来说纵向符号越稀疏,这个值需要设置得越大,范围通常在1.0-2.5。 二值化算法:使用全局阈值则跳过该选项即可,或者也可输入OTSU、采用大津二值化算法。 设置全局阈值:如果上面选择全局阈值则需要手动设置全局阈值,对于.\test.txt中所提样例,使用全局阈值并在后面设置为160即可。 手动调整中间结果:若输入Y/y,则在识别简谱后会暂停代码,并生成一份txt文件,在其中展示识别结果,此时用户可以通过修改这份txt文件来更正识别结果。 如果选择文件夹的话,还可以选择所选文件夹中不需要识别的文件以排除干扰
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值