今天想感谢一个伙伴
这位小伙伴的昵称是:
陈小缘
如果大家平时打开公众号比较多,那么一定知道这个系列:
....
看名字就知道至少有十三篇啦,可以自行去作者博客学习。
每一篇质量都非常高。
不过感谢主要的原因不是这个。
追溯问答
还记得在 5 月底的时候,玩 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期
算是启发吧。每日一问这个事情,说实话看起来非常容易,坚持下来难到不行。
也在陆续更新一些每日一问的内容,不知道能坚持多久,但还是为他点赞,文章大概如下:
最后
还记得第一次和小缘聊天的时候,他还在纠结怎么追女神,最近发现他已经在给女朋友买书了!
应该是好人有好报吧。
嘿嘿嘿~
那个,小缘不要有压力,千万不要因为这篇文章,心态不要产生任何变化,把回答作为任务,其实还是就想回答就回答,该做菜做菜,轻松过好自己的每一天!
推荐阅读:
扫一扫 关注我的公众号
如果你想要跟大家分享你的文章,欢迎投稿~
┏(^0^)┛明天见!