相信大家多数都能说出自定义的步骤,但是很多细节上的问题其实也需要关注。
针对:
MesureSpec.UNSPECIFIED
1. 这个模式什么时候会遇到?
2. 遇到后怎么处理?
3. 有什么注意事项?
以后问答每周 2-3 问,没有人回答会挂稍微久一些,希望大家踊跃参与。
更多问答 >>
-
每日一问 View中的getContext一定返回的是Activity对象吗?
2019-06-23 22:18 -
每日一问 有没有使用过 DataBinding ,有什么优点、缺点,遇到过哪些坑?
2019-06-26 00:23 -
每日一问 | 为什么属性动画移动一个控件后,目标位置仍然能响应用户事件?
2019-06-27 23:50 -
每日一问 ANR的产生的原理是什么,AMS中涉及ANR的代码有哪些?
2019-06-30 22:33 -
每日一问 对于SharedPreferences你觉得有什么优缺点?
2019-07-02 23:35 -
每日一问 自定义 ViewGroup 的时候,关于 LayoutParams 有哪些注意事项?
2019-06-15 21:09 -
每日一问 gradle Transform API 和 Annotation Processor各有什么使用场景?能否相互替换与补充。
2019-06-13 21:54 -
2019-05-29 12:23
-
每日一问 View的onAttachedToWindow ,onDetachedFromWindow 调用时机,使用场景是什么?
2019-05-26 19:19 -
每日一问 你有什么好的学习习惯 或者 不错的 app 推荐给大家?
2019-05-24 11:09

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成自己想要的样子。不过,一般不会这么做。上面的解答非常棒。给个赞
等你好久咯~
小缘同学牛批(破音