详细描述下自定义 View 测量时的 MesureSpec.UNSPECIFIED
原始网页直通车
UNSPECIFIED
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
模式下, 子View
的尺寸不能超出所在的 ViewGroup
的尺寸,最多只能等于。所以在这个场景下,用 UNSPECIFIED
会更合适,这个模式下你想要多大就多大。
我们在自定义 View 的时候,在测量时发现是 UNSPECIFIED 模式时,应该怎么做呢?
这个就比较自由了,既然尺寸由自己决定,那么我们既可以写死为 50,也可以写死为 200。当然了,还是要根据实际需求来定义。
比如 ImageView
,它的做法就是:有设置图片内容( drawable
)的话,会直接使用这个 drawable
的尺寸,但不超过指定的 MaxWidth
或 MaxHeight
, 没有内容的话就是 0。
而 TextView
处理 UNSPECIFIED
的方式,和 AT_MOST
是一样的。
当然了,这些尺寸都不一定等于最后 layout
出来的尺寸,因为最后决定 子View
位置和大小的,是在 onLayout
方法中,在这里你完全可以无视这些尺寸,去 layout
成自己想要的样子。不过,一般不会这么做。
详细描述下自定义 View 测量时的 MesureSpec.UNSPECIFIED相关推荐
- 自定义View开发时踩的坑
在这篇博客中,我希望按照日记的方式来记录自己在android的自定义视图开发中所遇到的一些问题: 1.首先是在自定义view中获取对应的子视图,在自定义视图中定义了很多成员变量,按照个人的代码编写习惯 ...
- Android自定义View的四种方式
目录 一 前言 二 分类 1.组合控件 2.继承系统控件 3.继承View 4.继承ViewGroup 三 自定义View 1.构造函数 2.onMeasure 3.onLayout 4.onDraw ...
- android自定义起止时间的时间刻度尺,Android 自定义View篇(六)实现时钟表盘效果...
前言 Android 自定义 View 是高级进阶不可或缺的内容,日常工作中,经常会遇到产品.UI 设计出花里胡哨的界面.当系统自带的控件不能满足开发需求时,就只能自己动手撸一个效果. 本文就带自定义 ...
- 自定义view - 收藏集 - 掘金
Android 从 0 开始自定义控件之 View 的 draw 过程 (九) - Android - 掘金 转载请标明出处: http://blog.csdn.net/airsaid/... 本文出 ...
- Android 自定义view onMeasure() 方法剖析
接着上一篇自定义view 相关的,揭秘 Android Graphics2D 实现动态效果之--invalidate() 内容的介绍,这一篇主要介绍下自定义view 中的 onMeasure()方 ...
- Android自定义View如此简单 实现点击动画+进度刷新的提交/下载按钮(填坑面试题)
SubmitButton 背景 实现思路 继承View 面试题:构造方法如何选择 自定义属性 面试题:styleable.AttributeSet.TypedArray的关系 测量宽高 面试题:UNS ...
- Android自定义View,滑动,事件传递小结
本文只总结知识点 欢迎补充,欢迎纠正.谢谢! #预备知识 Android控件框架 ####1. View树状图 Android的View树结构总是以一个ViewGroup开始,包含多个View或Vie ...
- Android中的自定义view和自定义属性TypedArray的使用
先总结下自定义View的步骤: 1.自定义View的属性 2.在View的构造方法中获得我们自定义的属性 [ 3.重写onMesure ] 4.重写onDraw 我把3用[]标出了,所以说3不一定是必 ...
- Android之自定义View的实现
对于学习Android开发的小童鞋对于自定义View一定不会陌生,相信大家对它是又爱又恨,爱它可以跟随我们的心意设计出漂亮的效果:恨它想要完全流畅掌握,需要一定的功夫.对于初学者来说确实很不容易,网上 ...
最新文章
- linux 脚本自动编制工具,全自动工具链编译脚本
- module ‘imgaug.augmenters‘ has no attribute ‘Resize‘
- python都能干什么-python都能做什么
- Linux下Apache虚拟主机配置
- SqlServer项目经验:介质集有2个介质簇,但只提供了1个。必须提供所有成员
- ubuntu 电源按钮操作_桌面应用|在 Ubuntu 中使用 Slimbook Battery Optimizer 切换电源模式...
- JavaScript设置对象的不可拓展
- STM32开发 -- HardFault_Handler处理
- OpenCV TSP(TravelingSalesman Problem)的实例(附完整代码)
- 深度学习-Tensorflow2.2-RNN循环神经网络{11}-RNN空气污染预测-26
- Angular里遇到的一个依赖注入问题以及解决办法
- 通过显式寻找物体的 extremity 区域加快 DETR 的收敛:Conditional DETR
- CV新赛事|CT影像诊断新冠肺炎北京垃圾分类识别~文末有福利
- CGI form标签学习
- [小甲鱼]汇编语言笔记 基础知识
- 8.25 ccpc 比赛总结
- mysql查看sa密码_查询mssql 密码
- openlayer地图裁切
- wc -m命令在统计字符数的时候为什么总是多一个?
- 从用户个体的角度,谈微信群吱口令红包