1.测量时,需要自定义ViewGroup,实现onMeasure方法
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int measuredWidth = 0; int measuredHeight = 0; final int childCount = getChildCount(); measureChildren(widthMeasureSpec, heightMeasureSpec); int widthSpaceSize = MeasureSpec.getSize(widthMeasureSpec); int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec); int heightSpaceSize = MeasureSpec.getSize(heightMeasureSpec); int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec); if (childCount == 0) { setMeasuredDimension(0, 0); } else if (widthSpecMode == MeasureSpec.AT_MOST && heightSpecMode == MeasureSpec.AT_MOST) { final View childView = getChildAt(0); measuredWidth = childView.getMeasuredWidth() * childCount; measuredHeight = childView.getMeasuredHeight(); setMeasuredDimension(measuredWidth, measuredHeight); } else if (heightSpecMode == MeasureSpec.AT_MOST) { final View childView = getChildAt(0); measuredHeight = childView.getMeasuredHeight(); setMeasuredDimension(widthSpaceSize, childView.getMeasuredHeight()); } else if (widthSpecMode == MeasureSpec.AT_MOST) { final View childView = getChildAt(0); measuredWidth = childView.getMeasuredWidth() * childCount; setMeasuredDimension(measuredWidth, heightSpaceSize); } }
然后在调用this.getMeasuredHeight();就可以获取了。
this.getMeasuredHeight();
2.当view为gone的时候怎么获取view的高度
在项目开发中,遇到了 当view为gone时 测量高度一直为0,解决办法:
mView.getViewTreeObserver().addOnGlobalLayoutListener( new OnGlobalLayoutListener(){ @Override public void onGlobalLayout() { // gets called after layout has been done but before display // so we can get the height then hide the view mHeight = mView.getHeight(); mView.getViewTreeObserver().removeOnGlobalLayoutListener(this); mView.setVisibility(View.GONE); } });
默认先让他显示,而加载完成,则进行View.GONE,就可以了。