1. 除非你总是需要一个100×100像素的控件,否则,你必须要重写onMeasure。
  2. onMeasure方法在控件的父元素正要放置它的子控件时调用。它会问一个问题,“你想要用多大地方啊?”,然后传入两个参数——widthMeasureSpec和heightMeasureSpec。
  3. 它们指明控件可获得的空间以及关于这个空间描述的元数据。
  4. 比返回一个结果要好的方法是你传递View的高度和宽度到setMeasuredDimension方法里。
  5. 接下来的代码片段给出了如何重写onMeasure。注意,调用的本地空方法是来计算高度和宽度的。它们会译解widthHeightSpec和heightMeasureSpec值,并计算出合适的高度和宽度值。
  6. @Override
  7. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  8. int measuredHeight = measureHeight(heightMeasureSpec);
  9. int measuredWidth = measureWidth(widthMeasureSpec);
  10. setMeasuredDimension(measuredHeight, measuredWidth);
  11. }
  12. private int measureHeight(int measureSpec) {
  13. // Return measured widget height.
  14. }
  15. private int measureWidth(int measureSpec) {
  16. // Return measured widget width.
  17. }
  18. 边界参数——widthMeasureSpec和heightMeasureSpec ,效率的原因以整数的方式传入。在它们使用之前,首先要做的是使用MeasureSpec类的静态方法getMode和getSize来译解,如下面的片段所示:
  19. int specMode = MeasureSpec.getMode(measureSpec);
  20. int specSize = MeasureSpec.getSize(measureSpec);
  21. 依据specMode的值,如果是AT_MOST,specSize 代表的是最大可获得的空间;如果是EXACTLY,specSize 代表的是精确的尺寸;如果是UNSPECIFIED,对于控件尺寸来说,没有任何参考意义。
  22. 当以EXACT方式标记测量尺寸,父元素会坚持在一个指定的精确尺寸区域放置View。在父元素问子元素要多大空间时,AT_MOST指示者会说给我最大的范围。在很多情况下,你得到的值都是相同的。
  23. 在两种情况下,你必须绝对的处理这些限制。在一些情况下,它可能会返回超出这些限制的尺寸,在这种情况下,你可以让父元素选择如何对待超出的View,使用裁剪还是滚动等技术。
  24. 接下来的框架代码给出了处理View测量的典型实现:
  25. @Override
  26. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
  27. int measuredHeight = measureHeight(heightMeasureSpec);
  28. int measuredWidth = measureWidth(widthMeasureSpec);
  29. setMeasuredDimension(measuredHeight, measuredWidth);
  30. }
  31. private int measureHeight(int measureSpec) {
  32. int specMode = MeasureSpec.getMode(measureSpec);
  33. int specSize = MeasureSpec.getSize(measureSpec);
  34. // Default size if no limits are specified.
  35. int result = 500;
  36. if (specMode == MeasureSpec.AT_MOST)
  37. {
  38. // Calculate the ideal size of your
  39. // control within this maximum size.
  40. // If your control fills the available
  41. // space return the outer bound.
  42. result = specSize;
  43. }
  44. else if (specMode == MeasureSpec.EXACTLY)
  45. {
  46. // If your control can fit within these bounds return that value.
  47. result = specSize;
  48. }
  49. return result;
  50. }
  51. private int measureWidth(int measureSpec) {
  52. int specMode = MeasureSpec.getMode(measureSpec);
  53. int specSize = MeasureSpec.getSize(measureSpec);
  54. // Default size if no limits are specified.
  55. int result = 500;
  56. if (specMode == MeasureSpec.AT_MOST)
  57. {
  58. // Calculate the ideal size of your control
  59. // within this maximum size.
  60. // If your control fills the available space
  61. // return the outer bound.
  62. result = specSize;
  63. }
  64. else if (specMode == MeasureSpec.EXACTLY)
  65. {
  66. // If your control can fit within these bounds return that value.
  67. result = specSize;
  68. }
  69. return result;
  70. }

onMeasure(int widthMeasureSpec, int heightMeasureSpec)相关推荐

  1. const int * 、int * const、int const* 、const int a(){ } 和int a()const { }的区别和联系

    前言:很多人都把const int * .int * const.int const* 的区别和联系搞混,我自己在学习C++的过程中,也经常性          弄不 清楚,今天特意总结一下,作为学习 ...

  2. int main(int argc,char *argv[]),主函数的参数问题

    主函数的参数 在VC++中,我们有时候看到一些程序的主函数是带有参数的,虽然我们经常用到VC++但是对主函数的参数并不是很理解: int main(int argc,char *argv[]) 对于里 ...

  3. 关于int main( int argc, char* argv[] ) 中arg和argv参数理解

    在示例程序中经常可以看到argc和argv这两个参数 ,在调试代码过程中遇到main函数为int main( int argc, char* argv[] ) 这种类型时往往会报错,或者是运行起来了但 ...

  4. 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 ...

  5. 基于java的InputStream.read(byte[] b,int off,int len)算法学习!

    public int read(byte[] b,int off,int len)throws IOException 将输入流中最多 len 个数据字节读入字节数组.尝试读取多达 len 字节,但可 ...

  6. 有关(int)和(int)的区别

    先看一段程序 #include "stdafx.h" #include <iostream> using namespace std; int _tmain(int a ...

  7. int main( int argc , char *argv[] , char *envp[] )中参数解说

    原文链接:https://blog.csdn.net/mengyandelove/article/details/82285504 argc是命令行总的参数个数 argv[]是argc个参数,其中第0 ...

  8. 如何将C#nullable int转换为int

    如何将可空int转换为int ? 假设我有两种类型的int,如下所示: int? v1; int v2; 我想将v1的值分配给v2 . v2 = v1; 会导致错误. 如何将v1转换为v2 ? #1楼 ...

  9. 深入解剖unsigned int 和 int

    就如同int a:一样,int 也能被其它的修饰符修饰.除void类型外,基本数据类型之前都可以加各种类型修饰符,类型修饰符有如下四种: 1.signed----有符号,可修饰char.int.Int ...

最新文章

  1. iOS swift2.3 迁移到3.0 遇到的一些问题
  2. 对AFTER触发器的一些整理
  3. Scapy:局域网MAC地址扫描脚本
  4. PPA格式Linux安装,Ubuntu12.04 用PPA安装fcitx和搜狗输入法附加组件Linux版
  5. 拖延症讲:反向遍历链表
  6. Oracle 练习P297 131026 PL/SQL块程序
  7. 怎样用shell计算linux内存,计算Linux内存,CUP,硬盘使用率的shell脚本
  8. 读EasyPR开发详解实践感想1
  9. MongoDB技术分享:WiredTiger存储引擎
  10. 版本控制系统(vcs)Git
  11. 查询计算机的配置命令是什么,查看电脑配置指令大全
  12. 深度学习、机器学习交流群
  13. 制作半透明的毛玻璃效果教程
  14. Parallel()
  15. 你对锁的理解?如何手动模拟一个死锁?
  16. iOS HTTPS证书不受信任解决办法
  17. Tableau自定义分类调色板
  18. 51单片机10S秒表功能
  19. linux tux_与Tux,BSD等一起庆祝国家超级英雄日
  20. dim=0与dim=1_CodingPark编程公园

热门文章

  1. 教你如何理解DSP、SSP、RTB、ADX名词
  2. Java中IO流(3).
  3. linux 进文字界面,CentOS安装后进入时文字界面,不知如何用命令,求解
  4. SSL、WSS和HTTPS之间的关系
  5. 将Java中的内容直接存储为二进制文件
  6. BMP Image Sequences for Elliptical Head Tracking
  7. ICEM中Pre Mesh Quality Options的方法
  8. 基于matlab的漏电保护器仿真,基于MATLAB仿真的高压断路器振动信号故障诊断
  9. 新版谷歌眼镜专利曝光:终于像普通眼镜了
  10. 清华制造的百名IT精英