onMeasure(int widthMeasureSpec, int heightMeasureSpec)
- 除非你总是需要一个100×100像素的控件,否则,你必须要重写onMeasure。
- onMeasure方法在控件的父元素正要放置它的子控件时调用。它会问一个问题,“你想要用多大地方啊?”,然后传入两个参数——widthMeasureSpec和heightMeasureSpec。
- 它们指明控件可获得的空间以及关于这个空间描述的元数据。
- 比返回一个结果要好的方法是你传递View的高度和宽度到setMeasuredDimension方法里。
- 接下来的代码片段给出了如何重写onMeasure。注意,调用的本地空方法是来计算高度和宽度的。它们会译解widthHeightSpec和heightMeasureSpec值,并计算出合适的高度和宽度值。
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- int measuredHeight = measureHeight(heightMeasureSpec);
- int measuredWidth = measureWidth(widthMeasureSpec);
- setMeasuredDimension(measuredHeight, measuredWidth);
- }
- private int measureHeight(int measureSpec) {
- // Return measured widget height.
- }
- private int measureWidth(int measureSpec) {
- // Return measured widget width.
- }
- 边界参数——widthMeasureSpec和heightMeasureSpec ,效率的原因以整数的方式传入。在它们使用之前,首先要做的是使用MeasureSpec类的静态方法getMode和getSize来译解,如下面的片段所示:
- int specMode = MeasureSpec.getMode(measureSpec);
- int specSize = MeasureSpec.getSize(measureSpec);
- 依据specMode的值,如果是AT_MOST,specSize 代表的是最大可获得的空间;如果是EXACTLY,specSize 代表的是精确的尺寸;如果是UNSPECIFIED,对于控件尺寸来说,没有任何参考意义。
- 当以EXACT方式标记测量尺寸,父元素会坚持在一个指定的精确尺寸区域放置View。在父元素问子元素要多大空间时,AT_MOST指示者会说给我最大的范围。在很多情况下,你得到的值都是相同的。
- 在两种情况下,你必须绝对的处理这些限制。在一些情况下,它可能会返回超出这些限制的尺寸,在这种情况下,你可以让父元素选择如何对待超出的View,使用裁剪还是滚动等技术。
- 接下来的框架代码给出了处理View测量的典型实现:
- @Override
- protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
- int measuredHeight = measureHeight(heightMeasureSpec);
- int measuredWidth = measureWidth(widthMeasureSpec);
- setMeasuredDimension(measuredHeight, measuredWidth);
- }
- private int measureHeight(int measureSpec) {
- int specMode = MeasureSpec.getMode(measureSpec);
- int specSize = MeasureSpec.getSize(measureSpec);
- // Default size if no limits are specified.
- int result = 500;
- if (specMode == MeasureSpec.AT_MOST)
- {
- // Calculate the ideal size of your
- // control within this maximum size.
- // If your control fills the available
- // space return the outer bound.
- result = specSize;
- }
- else if (specMode == MeasureSpec.EXACTLY)
- {
- // If your control can fit within these bounds return that value.
- result = specSize;
- }
- return result;
- }
- private int measureWidth(int measureSpec) {
- int specMode = MeasureSpec.getMode(measureSpec);
- int specSize = MeasureSpec.getSize(measureSpec);
- // Default size if no limits are specified.
- int result = 500;
- if (specMode == MeasureSpec.AT_MOST)
- {
- // Calculate the ideal size of your control
- // within this maximum size.
- // If your control fills the available space
- // return the outer bound.
- result = specSize;
- }
- else if (specMode == MeasureSpec.EXACTLY)
- {
- // If your control can fit within these bounds return that value.
- result = specSize;
- }
- return result;
- }
onMeasure(int widthMeasureSpec, int heightMeasureSpec)相关推荐
- const int * 、int * const、int const* 、const int a(){ } 和int a()const { }的区别和联系
前言:很多人都把const int * .int * const.int const* 的区别和联系搞混,我自己在学习C++的过程中,也经常性 弄不 清楚,今天特意总结一下,作为学习 ...
- int main(int argc,char *argv[]),主函数的参数问题
主函数的参数 在VC++中,我们有时候看到一些程序的主函数是带有参数的,虽然我们经常用到VC++但是对主函数的参数并不是很理解: int main(int argc,char *argv[]) 对于里 ...
- 关于int main( int argc, char* argv[] ) 中arg和argv参数理解
在示例程序中经常可以看到argc和argv这两个参数 ,在调试代码过程中遇到main函数为int main( int argc, char* argv[] ) 这种类型时往往会报错,或者是运行起来了但 ...
- java write_java中write(byte[] b)与write(byte[] b,int off,int len)区别
在项目中要上传文件或者图片 private static final int BUFFER_SIZE = 16 * 1024; private static void copy(File src, F ...
- 基于java的InputStream.read(byte[] b,int off,int len)算法学习!
public int read(byte[] b,int off,int len)throws IOException 将输入流中最多 len 个数据字节读入字节数组.尝试读取多达 len 字节,但可 ...
- 有关(int)和(int)的区别
先看一段程序 #include "stdafx.h" #include <iostream> using namespace std; int _tmain(int a ...
- int main( int argc , char *argv[] , char *envp[] )中参数解说
原文链接:https://blog.csdn.net/mengyandelove/article/details/82285504 argc是命令行总的参数个数 argv[]是argc个参数,其中第0 ...
- 如何将C#nullable int转换为int
如何将可空int转换为int ? 假设我有两种类型的int,如下所示: int? v1; int v2; 我想将v1的值分配给v2 . v2 = v1; 会导致错误. 如何将v1转换为v2 ? #1楼 ...
- 深入解剖unsigned int 和 int
就如同int a:一样,int 也能被其它的修饰符修饰.除void类型外,基本数据类型之前都可以加各种类型修饰符,类型修饰符有如下四种: 1.signed----有符号,可修饰char.int.Int ...
最新文章
- iOS swift2.3 迁移到3.0 遇到的一些问题
- 对AFTER触发器的一些整理
- Scapy:局域网MAC地址扫描脚本
- PPA格式Linux安装,Ubuntu12.04 用PPA安装fcitx和搜狗输入法附加组件Linux版
- 拖延症讲:反向遍历链表
- Oracle 练习P297 131026 PL/SQL块程序
- 怎样用shell计算linux内存,计算Linux内存,CUP,硬盘使用率的shell脚本
- 读EasyPR开发详解实践感想1
- MongoDB技术分享:WiredTiger存储引擎
- 版本控制系统(vcs)Git
- 查询计算机的配置命令是什么,查看电脑配置指令大全
- 深度学习、机器学习交流群
- 制作半透明的毛玻璃效果教程
- Parallel()
- 你对锁的理解?如何手动模拟一个死锁?
- iOS HTTPS证书不受信任解决办法
- Tableau自定义分类调色板
- 51单片机10S秒表功能
- linux tux_与Tux,BSD等一起庆祝国家超级英雄日
- dim=0与dim=1_CodingPark编程公园