查看原文
其他

今天想感谢一个伙伴

鸿洋 鸿洋 2020-10-29

这位小伙伴的昵称是:


陈小缘


如果大家平时打开公众号比较多,那么一定知道这个系列:


这交互炸了系列  第十三式之移花接木

这交互炸了系列 第十二式之年年有鱼

....


看名字就知道至少有十三篇啦,可以自行去作者博客学习。


每一篇质量都非常高。


不过感谢主要的原因不是这个。


追溯问答


还记得在 5 月底的时候,玩 Android 上线了问答:


千呼万唤始出来  玩Android 上线了问答


我大概发布了 10 多个问题:



其实发布问题是一个很无聊的事情,有时候发布几天了,还没人回答,慢慢就会形成一股非常消极的情绪,对该功能甚至自我的否定:


这功能有个鸡儿用,哪能形成沉淀呢...


印象最深的一次,我发布了一个 Binder 的问题,挂了好几天没人回答,我就开始自暴自弃了(仔细看上图 ,binder 接下一个问题,周期接近半个月),还好他,没错,就是这个男人,群里 at 了我一下,问我问答呢?


把我从放弃边缘拉回来了。


所以在这夜深人静的时刻,我数了一下所有的问题,陈小缘啦啦啦同学几乎回答了我所有的问题。


我数了一下,只有一个问题,gradle plugin 相关的没有回答,其他都做了解答。


说实话,没有小缘的回答,这个功能我就准备石沉大海了。


在此表示由衷的感谢。


问答的初衷


其实我最初做问答这个功能,主要是针对学习性质的问题,什么意思呢?


就是问答的含义实际上是给大家查缺补漏,或者是以前没有了解过的内容,刚好学习一下,最后回来回答总结一下。


往大一点说,整个网站都是偏学习性质的,就是它只能作为你想要学习的时候,来看看文章。


今天的干货


听我扯了这么多,要是不加点干货,感觉浪费一次推送,好亏。


那么今天就主要贴个问答吧。


详细的描述下自定义 View 测量时 MesureSpec.UNSPECIFIED


相信大家多数都能说出自定义的步骤,但是很多细节上的问题其实也需要关注。


针对MesureSpec.UNSPECIFIED


1. 这个模式什么时候会遇到?

2. 遇到后怎么处理?

3. 有什么注意事项?


这个问题,我基本上面试都会问,能够回答上来的同学其实很少。


UNSPECIFIED,就是未指定的意思,在这个模式下父控件不会干涉子View想要多大的尺寸。


那么,这个模式什么时候会在onMeasure里遇到呢:


其实是取决于它的父容器。


就拿最常用的RecyclerView做例子,在item进行measure时,如果列表可滚动,并且item的宽或高设置了WRAP_CONTENT的话,那么接下来,itemView的onMeasure方法就会收到MesureSpec.UNSPECIFIED。


打开RecyclerView源码,会在getChildMeasureSpec方法里看到这么一句注释:


“MATCH_PARENT can't be applied since we can scroll in this dimension, wrap instead using UNSPECIFIED.”


它想表达的是:在可滚动的ViewGroup中,不应该限制Item的尺寸(如果是水平滚动,就不限制宽度),为什么呢? 


因为是可以滚动的,就算Item有多宽,有多高,通过滚动也一样能看到滚动前被遮挡的部分。


有同学可能会有疑问:


我设置了wrap_content,在onMeasure中应该收到的是AT_MOST才对啊,为什么要强制变成UNSPECIFIED?


这是因为考虑到Item的尺寸有可能超出这个可滚动的ViewGroup的尺寸,而在AT_MOST模式下,你的尺寸不能超出你所在的ViewGroup的尺寸,最多只能等于。所以用UNSPECIFIED会更合适,这个模式下你想要多大就多大。


那么,我们在自定义View的时候,在测量时发现是UNSPECIFIED模式时,应该怎么做呢:


这个就比较自由了,既然尺寸由自己决定,那么我可以写死为50,也可以固定为200。


但还是建议结合实际需求来定义咯。


比如ImageView,它的做法就是:有设置图片内容(drawable)的话,会直接使用这个drawable的尺寸,但不会超过指定的MaxWidth或MaxHeight, 没有内容的话就是0。


而TextView处理UNSPECIFIED的方式,和AT_MOST是一样的。


当然了,这些尺寸都不一定等于最后layout出来的尺寸,因为最后决定子View位置和大小的,是在onLayout方法中,在这里你完全可以无视这些尺寸,去layout成自己想要的样子。


不过,一般不会这么做。


来自:小缘的回答。


意外的发现


有一位公众号主 nanchen,受到我之前做的:


我在一个群分享Android  好像被我分享得没人说话了... 3期


算是启发吧。每日一问这个事情,说实话看起来非常容易,坚持下来难到不行。


也在陆续更新一些每日一问的内容,不知道能坚持多久,但还是为他点赞,文章大概如下:


每日一问:讲讲 Java 虚拟机的类加载机制


最后


还记得第一次和小缘聊天的时候,他还在纠结怎么追女神,最近发现他已经在给女朋友买书了!


应该是好人有好报吧。


嘿嘿嘿~


那个,小缘不要有压力,千万不要因为这篇文章,心态不要产生任何变化,把回答作为任务,其实还是就想回答就回答,该做菜做菜,轻松过好自己的每一天!



推荐阅读

教你写一个弹幕库,确定不了解一下?

Android 优质技术分享 | 6 期

19年3月移动端大厂面试题分享


扫一扫 关注我的公众号

如果你想要跟大家分享你的文章,欢迎投稿~


┏(^0^)┛明天见!

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存