android自定义View之 onMeasure() EXACTCLY 大概意思就是精确值模式,我们在布局文件中的宽和高为具体值,或为view的高度自适应wrap_content view的测量

在很多自定义view之后,控件的高度需要自适应,即使使用wrap_content没有作用还是match_parent的效果,这时就需要重写onMeasure()方法来实现,view类的onMeasure()方法默认是只支持.EXACTLY模式,所以在自定义view先支持wrap_content就得重写onMeasure(),在这里就需要说一下测量的三种模式了:

第一种:

EXACTCLY

大概意思就是精确值模式,我们在布局文件中的宽和高为具体值,或为match_parent(父布局的大小)属性时系统会用次模式,

第二种:

AT_MOST

大概意思就是最大值模式,我理解为就是自适应。我们在布局文件中的宽和高为wrap_content 属性时,控件的大小一般会随着子View大小大或内容的多少的变化而变化,此控件只要不超过父控件的大小就行。

第三种:

UNSPECIFIED

这种模式不指定测量模式,view大小没有限制,想多大就多大。

我们可以通过MeasureSpec这个类的getMode()和getSize()方法获取测量模式和大小,

代码如下:

没什么逻辑,仔细看一下就ok了

[java]  view plain  copy
  1. /** 
  2.      * view的大小控制 
  3.      */  
  4.     @Override  
  5.     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {  
  6.   
  7.         setMeasuredDimension(measureWidth(widthMeasureSpec),  
  8.                 measureHeight(heightMeasureSpec));  
  9.   
  10.     }  
  11.   
  12.     private int measureHeight(int measureSpec) {  
  13.         int result = 0;  
  14.         int mode = MeasureSpec.getMode(measureSpec);  
  15.         int size = MeasureSpec.getSize(measureSpec);  
  16.   
  17.         if (mode == MeasureSpec.EXACTLY) {  
  18.             result = size;  
  19.         } else {  
  20.             result=75;  
  21.             if (mode == MeasureSpec.AT_MOST) {  
  22.                 result = Math.min(result, size);  
  23.             }  
  24.         }  
  25.         return result;  
  26.   
  27.     }  
  28.   
  29.     private int measureWidth(int measureSpec) {  
  30.         int result = 0;  
  31.         int mode = MeasureSpec.getMode(measureSpec);  
  32.         int size = MeasureSpec.getSize(measureSpec);  
  33.   
  34.         if (mode == MeasureSpec.EXACTLY) {  
  35.             result = size;  
  36.         } else {  
  37.             result = 75;//根据自己的需要更改  
  38.             if (mode == MeasureSpec.AT_MOST) {  
  39.                 result = Math.min(result, size);  
  40.             }  
  41.         }  
  42.         return result;  
  43.   
  44.     }  

猜你喜欢

转载自blog.csdn.net/u014644594/article/details/80526022
今日推荐