onMeasure(int widthMeasureSpec, int heightMeasureSpec)

  1. 除非你总是需要一个100×100像素的控件,否则,你必须要重写onMeasure。  
  2.   
  3. onMeasure方法在控件的父元素正要放置它的子控件时调用。它会问一个问题,“你想要用多大地方啊?”,然后传入两个参数——widthMeasureSpec和heightMeasureSpec。  
  4. 它们指明控件可获得的空间以及关于这个空间描述的元数据。  
  5.   
  6.  比返回一个结果要好的方法是你传递View的高度和宽度到setMeasuredDimension方法里。  
  7. 接下来的代码片段给出了如何重写onMeasure。注意,调用的本地空方法是来计算高度和宽度的。它们会译解widthHeightSpec和heightMeasureSpec值,并计算出合适的高度和宽度值。  
  8.   
  9.    
  10.   
  11. @Override  
  12.   
  13. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  14.   
  15. int measuredHeight = measureHeight(heightMeasureSpec);  
  16.   
  17. int measuredWidth = measureWidth(widthMeasureSpec);  
  18.   
  19. setMeasuredDimension(measuredHeight, measuredWidth);  
  20.   
  21. }  
  22.   
  23.    
  24.   
  25. private int measureHeight(int measureSpec) {  
  26.   
  27. // Return measured widget height.  
  28.   
  29. }  
  30.   
  31.    
  32.   
  33. private int measureWidth(int measureSpec) {  
  34.   
  35. // Return measured widget width.  
  36.   
  37. }  
  38.   
  39.    
  40.   
  41. 边界参数——widthMeasureSpec和heightMeasureSpec ,效率的原因以整数的方式传入。在它们使用之前,首先要做的是使用MeasureSpec类的静态方法getMode和getSize来译解,如下面的片段所示:  
  42.   
  43.    
  44.   
  45. int specMode = MeasureSpec.getMode(measureSpec);  
  46.   
  47. int specSize = MeasureSpec.getSize(measureSpec);  
  48.   
  49.    
  50.   
  51. 依据specMode的值,如果是AT_MOST,specSize 代表的是最大可获得的空间;如果是EXACTLY,specSize 代表的是精确的尺寸;如果是UNSPECIFIED,对于控件尺寸来说,没有任何参考意义。  
  52.   
  53. 当以EXACT方式标记测量尺寸,父元素会坚持在一个指定的精确尺寸区域放置View。在父元素问子元素要多大空间时,AT_MOST指示者会说给我最大的范围。在很多情况下,你得到的值都是相同的。  
  54.   
  55. 在两种情况下,你必须绝对的处理这些限制。在一些情况下,它可能会返回超出这些限制的尺寸,在这种情况下,你可以让父元素选择如何对待超出的View,使用裁剪还是滚动等技术。  
  56.   
  57.  接下来的框架代码给出了处理View测量的典型实现:  
  58.   
  59.    
  60.   
  61. @Override  
  62.   
  63. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  64.   
  65. int measuredHeight = measureHeight(heightMeasureSpec);  
  66.   
  67. int measuredWidth = measureWidth(widthMeasureSpec);  
  68.   
  69. setMeasuredDimension(measuredHeight, measuredWidth);  
  70.   
  71. }  
  72.   
  73.    
  74.   
  75. private int measureHeight(int measureSpec) {  
  76.   
  77. int specMode = MeasureSpec.getMode(measureSpec);  
  78.   
  79. int specSize = MeasureSpec.getSize(measureSpec);  
  80.   
  81.    
  82.   
  83. // Default size if no limits are specified.  
  84.   
  85. int result = 500;  
  86.   
  87. if (specMode == MeasureSpec.AT_MOST)   
  88.   
  89. {  
  90.   
  91. // Calculate the ideal size of your  
  92.   
  93. // control within this maximum size.  
  94.   
  95. // If your control fills the available  
  96.   
  97. // space return the outer bound.  
  98.   
  99. result = specSize;  
  100.   
  101. }   
  102.   
  103. else if (specMode == MeasureSpec.EXACTLY)   
  104.   
  105. {  
  106.   
  107. // If your control can fit within these bounds return that value.  
  108.   
  109. result = specSize;  
  110.   
  111. }  
  112.   
  113. return result;  
  114.   
  115. }  
  116.   
  117.    
  118.   
  119. private int measureWidth(int measureSpec) {  
  120.   
  121. int specMode = MeasureSpec.getMode(measureSpec);  
  122.   
  123. int specSize = MeasureSpec.getSize(measureSpec);  
  124.   
  125.    
  126.   
  127. // Default size if no limits are specified.  
  128.   
  129. int result = 500;  
  130.   
  131. if (specMode == MeasureSpec.AT_MOST)  
  132.   
  133. {  
  134.   
  135. // Calculate the ideal size of your control  
  136.   
  137. // within this maximum size.  
  138.   
  139. // If your control fills the available space  
  140.   
  141. // return the outer bound.  
  142.   
  143. result = specSize;  
  144.   
  145. }   
  146.   
  147. else if (specMode == MeasureSpec.EXACTLY)   
  148.   
  149. {  
  150.   
  151. // If your control can fit within these bounds return that value.  
  152.   
  153. result = specSize;  
  154.   
  155. }  
  156.   
  157. return result;  
  158.   
  159. }  
  160.   
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值