OnMeasure()
一般来说,自定义控件都会去重写View的onMeasure方法,因为该方法指定该控件在屏幕上的大小。
protected void onMeasure (int widthMeasureSpec, int heightMeasureSpec)
onMeasure传入的两个参数是由上一层控件传入的大小,有多种情况,重写该方法时需要对计算控件的实际大小,然后调用setMeasuredDimension(int, int)设置实际大小。
onMeasure传入的widthMeasureSpec和heightMeasureSpec不是一般的尺寸数值,而是将模式和尺寸组合在一起的数值。我们需要通过int mode = MeasureSpec.getMode(widthMeasureSpec)得到模式,用int size = MeasureSpec.getSize(widthMeasureSpec)得到尺寸。
mode共有三种情况,取值分别为MeasureSpec.UNSPECIFIED, MeasureSpec.EXACTLY, MeasureSpec.AT_MOST。
MeasureSpec.EXACTLY是精确尺寸,当我们将控件的layout_width或layout_height指定为具体数值时如andorid:layout_width="50dip",或者为FILL_PARENT是,都是控件大小已经确定的情况,都是精确尺寸。
MeasureSpec.AT_MOST是最大尺寸,当控件的layout_width或layout_height指定为WRAP_CONTENT时,控件大小一般随着控件的子空间或内容进行变化,此时控件尺寸只要不超过父控件允许的最大尺寸即可。因此,此时的mode是AT_MOST,size给出了父控件允许的最大尺寸。
MeasureSpec.UNSPECIFIED是未指定尺寸,这种情况不多,一般都是父控件是AdapterView,通过measure方法传入的模式。
因此,在重写onMeasure方法时要根据模式不同进行尺寸计算。下面代码就是一种比较典型的方式:
protected void onMeasure( int widthMeasureSpec, int heightMeasureSpec) {
setMeasuredDimension(getMeasuredLength(widthMeasureSpec, true), getMeasuredLength(heightMeasureSpec, false));
}
private int getMeasuredLength( int length, boolean isWidth) {
int specMode = MeasureSpec.getMode(length);
int specSize = MeasureSpec.getSize(length);
int size;
int padding = isWidth ? getPaddingLeft() + getPaddingRight()
: getPaddingTop() + getPaddingBottom();
if (specMode == MeasureSpec.EXACTLY) {
size = specSize;
} else {
size = isWidth ? padding + mWave.length / 4 : DEFAULT_HEIGHT
+ padding;
if (specMode == MeasureSpec.AT_MOST) {
size = Math.min(size, specSize);
}
}
return size;
}
OnMeasure()相关推荐
- 关于View测量中的onMeasure函数
在自定义View中我们通常会重写onMeasure,下面来说说这个onMeasure有什么作用 onMeasure主要用于对于View绘制时进行测量 @Override protected void ...
- Android开发实践:为什么要继承onMeasure()
首先,我们写一个自定义View,直接调用系统默认的onMeasure函数,看看会是怎样的现象: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 2 ...
- Android自定义视图四:定制onMeasure强制显示为方形
这个系列是老外写的,干货!翻译出来一起学习.如有不妥,不吝赐教! Android自定义视图一:扩展现有的视图,添加新的XML属性 Android自定义视图二:如何绘制内容 Android自定义视图三: ...
- Android onMeasure方法介绍
nMeasure方法在控件的父元素正要放置它的子控件时调用.它会问一个问题,"你想要用多大地方啊?",然后传入两个参数--widthMeasureSpec和heightMeasur ...
- 2.View绘制分析笔记之onMeasure
今天主要学习记录一下Android View绘制三部曲的第一步,onMeasure,测量. 起源 在Activity中,所有的View都是DecorView的子View,然后DecorView又是被V ...
- Android onMeasure过程分析
测量布局开始的总入口: android.view.ViewRootImpl#measureHierarchy 里面调用了performMeasure private boolean measureHi ...
- Android -- onMeasure()源码分析
1,作为自定义控件最重要的三个方法之一,onMeasure()可以说是我们研究的重点,今天我们更详细的来研究一下View的onMeasure()方法和ViewGroup的onMeasure()方法 2 ...
- LinearLayout测量原理解析:onMeasure(int,int)
想写这部分内容已经很久了,但是每次写的时候总感觉自己讲的不够清楚,但是感觉这种事情真的不能拖,越拖越解决不了,所以,Let's go!好好理一理LinearLayout的measure的原理,也就是测 ...
- onMeasure模式
2019独角兽企业重金招聘Python工程师标准>>> MeasureSpec.UNSPECIFIED //无限制 case MeasureSpec.EXACTLY://限制固定值/ ...
- 自定义控件之onMeasure
最近一直在接触自定义控件的知识,自己就尝试着写了一个小的demo,算是对自定义知识点进行下总结 今天先来看下自定义控件需要重写的三个重要方法 看代码 package com.example.testc ...
最新文章
- 7-27 冒泡法排序 (C语言)
- 计算机与应用教学,教学方法与教学手段
- c运行库、c标准库、windows API的区别和联系
- selenium2与python自动化6-select下拉框
- 凡普金科以互金 “头马”入选互联网企业百强的启示:创新为王
- 关于页面动态添加控件(转)
- 如何添加引文标_如何在Google文档中查找和添加引文
- Machine Learning、Date Mining、IRNLP 会议期刊论文推荐
- UI自定义UITableView的右侧索引
- 基于模型与不基于模型的深度增强学习_CVPR2018: 基于时空模型无监督迁移学习的行人重识别...
- java中nul值的处理
- 2019上海开源峰会炉边会谈纪要
- JavaScript函数的参数及传参
- 如何最高效实现手机~电脑端文件传输?
- css logo划一道光,[前端]纯css实现图片自动闪耀闪光划过效果css3特效logo | 尽享网...
- iOS打包成ipa包
- 《德鲁克管理思想精要》读书笔记
- iOS包体积优化实践
- idea发现git出现cannot run git:cannot identify version of git executable :no response
- 以潘金莲和西门公子为例讲述Java静态代理和动态代理