首页 > 系统 > Android > 正文

解析:继承ViewGroup后的子类如何重写onMeasure方法

2019-10-24 20:47:16
字体:
来源:转载
供稿:网友
本篇文章是对继承ViewGroup后的子类如何重写onMeasure方法进行了详细的分析介绍,需要的朋友参考下
 
1.首先贴上我试验成功的代码
复制代码代码如下:

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 

         int measureWidth = MeasureSpec.getSize(widthMeasureSpec); 
         int measureHeigth = MeasureSpec.getSize(heightMeasureSpec); 
         setMeasuredDimension(measureWidth, measureHeigth); 
         // TODO Auto-generated method stub 
         for(int i= 0;i<getChildCount();i++){ 
             View v = getChildAt(i); 
             Log.v(TAG, "measureWidth is " +v.getMeasuredWidth() + "measureHeight is "+v.getMeasuredHeight()); 
             int widthSpec = 0; 
             int heightSpec = 0; 
             LayoutParams params = v.getLayoutParams(); 
             if(params.width > 0){ 
                 widthSpec = MeasureSpec.makeMeasureSpec(params.width, MeasureSpec.EXACTLY); 
             }else if (params.width == -1) { 
                 widthSpec = MeasureSpec.makeMeasureSpec(measureWidth, MeasureSpec.EXACTLY); 
             } else if (params.width == -2) { 
                 widthSpec = MeasureSpec.makeMeasureSpec(measureWidth, MeasureSpec.AT_MOST); 
             } 

             if(params.height > 0){ 
                 heightSpec = MeasureSpec.makeMeasureSpec(params.height, MeasureSpec.EXACTLY); 
             }else if (params.height == -1) { 
                 heightSpec = MeasureSpec.makeMeasureSpec(measureHeigth, MeasureSpec.EXACTLY); 
             } else if (params.height == -2) { 
                 heightSpec = MeasureSpec.makeMeasureSpec(measureWidth, MeasureSpec.AT_MOST); 
             } 
             v.measure(widthSpec, heightSpec); 

         } 
     } 

解释一下: 
首先判断params.width的值是多少,有三种情况。
如果是大于零的话,及传递的就是一个具体的值,那么,构造MeasupreSpec的时候可以直接用EXACTLY。
如果为-1的话,就是MatchParent的情况,那么,获得父View的宽度,再用EXACTLY来构造MeasureSpec。
如果为-2的话,就是wrapContent的情况,那么,构造MeasureSpec的话直接用一个负数就可以了。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表