@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int widthMode = MeasureSpec.getMode(widthMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); int size; if (widthMode == MeasureSpec.EXACTLY && widthSize > 0) { size = widthSize; } else if (heightMode == MeasureSpec.EXACTLY && heightSize > 0) { size = heightSize; } else { size = widthSize < heightSize ? widthSize : heightSize; } int finalMeasureSpec = MeasureSpec.makeMeasureSpec(size, MeasureSpec.EXACTLY); mSize = size; if (mShowTags) { showTags(); } Log.i("[VTC]", "tag container size " + mSize); super.onMeasure(finalMeasureSpec, finalMeasureSpec); }
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width; int height; // Get measureSpec mode and size values. final int measureWidthMode = MeasureSpec.getMode(widthMeasureSpec); final int measureHeightMode = MeasureSpec.getMode(heightMeasureSpec); final int measureWidth = MeasureSpec.getSize(widthMeasureSpec); final int measureHeight = MeasureSpec.getSize(heightMeasureSpec); // The RangeBar width should be as large as possible. if (measureWidthMode == MeasureSpec.AT_MOST) { width = measureWidth; } else if (measureWidthMode == MeasureSpec.EXACTLY) { width = measureWidth; } else { width = mDefaultWidth; } // The RangeBar height should be as small as possible. if (measureHeightMode == MeasureSpec.AT_MOST) { height = Math.min(mDefaultHeight, measureHeight); } else if (measureHeightMode == MeasureSpec.EXACTLY) { height = measureHeight; } else { height = mDefaultHeight; } setMeasuredDimension(width, height); }
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec); int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec); int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec); int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec); if (widthSpecMode == MeasureSpec.UNSPECIFIED || heightSpecMode == MeasureSpec.UNSPECIFIED) { throw new RuntimeException("CellLayout cannot have UNSPECIFIED dimensions"); } final int count = getChildCount(); for (int i = 0; i < count; i++) { View child = getChildAt(i); PagedViewCellLayout.LayoutParams lp = (PagedViewCellLayout.LayoutParams) child.getLayoutParams(); lp.setup(mCellWidth, mCellHeight, mWidthGap, mHeightGap, getPaddingLeft(), getPaddingTop()); int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(lp.width, MeasureSpec.EXACTLY); int childheightMeasureSpec = MeasureSpec.makeMeasureSpec(lp.height, MeasureSpec.EXACTLY); child.measure(childWidthMeasureSpec, childheightMeasureSpec); } setMeasuredDimension(widthSpecSize, heightSpecSize); }
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { final int widthMode = MeasureSpec.getMode(widthMeasureSpec); final int heightMode = MeasureSpec.getMode(heightMeasureSpec); if (widthMode != MeasureSpec.EXACTLY || heightMode != MeasureSpec.EXACTLY) { throw new IllegalStateException("Must measure with an exact size"); } final int width = MeasureSpec.getSize(widthMeasureSpec); final int height = MeasureSpec.getSize(heightMeasureSpec); if (!mMenuSizeSet) mMenuSize = (int) (height * 0.25f); if (mOffsetPixels == -1) openMenu(false); final int menuWidthMeasureSpec = getChildMeasureSpec(widthMeasureSpec, 0, width); final int menuHeightMeasureSpec = getChildMeasureSpec(widthMeasureSpec, 0, mMenuSize); mMenuContainer.measure(menuWidthMeasureSpec, menuHeightMeasureSpec); final int contentWidthMeasureSpec = getChildMeasureSpec(widthMeasureSpec, 0, width); final int contentHeightMeasureSpec = getChildMeasureSpec(widthMeasureSpec, 0, height); mContentContainer.measure(contentWidthMeasureSpec, contentHeightMeasureSpec); setMeasuredDimension(width, height); updateTouchAreaSize(); }
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { if (IMPL instanceof CardViewApi21 == false) { final int widthMode = MeasureSpec.getMode(widthMeasureSpec); switch (widthMode) { case MeasureSpec.EXACTLY: case MeasureSpec.AT_MOST: final int minWidth = (int) Math.ceil(IMPL.getMinWidth(this)); widthMeasureSpec = MeasureSpec.makeMeasureSpec( Math.max(minWidth, MeasureSpec.getSize(widthMeasureSpec)), widthMode); break; } final int heightMode = MeasureSpec.getMode(heightMeasureSpec); switch (heightMode) { case MeasureSpec.EXACTLY: case MeasureSpec.AT_MOST: final int minHeight = (int) Math.ceil(IMPL.getMinHeight(this)); heightMeasureSpec = MeasureSpec.makeMeasureSpec( Math.max(minHeight, MeasureSpec.getSize(heightMeasureSpec)), heightMode); break; } super.onMeasure(widthMeasureSpec, heightMeasureSpec); } else { super.onMeasure(widthMeasureSpec, heightMeasureSpec); } }
@Override protected void onMeasure(int widthSpec, int heightSpec) { // Measure all children. int freeSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED); mShutterButton.measure(freeSpec, freeSpec); mIndicatorControlWheel.measure(freeSpec, freeSpec); mZoomControlWheel.measure(freeSpec, freeSpec); // Measure myself. Add some buffer for highlight arc. int desiredWidth = mShutterButton.getMeasuredWidth() + IndicatorControlWheel.HIGHLIGHT_WIDTH * 4; int desiredHeight = mShutterButton.getMeasuredHeight() + IndicatorControlWheel.HIGHLIGHT_WIDTH * 4; int widthMode = MeasureSpec.getMode(widthSpec); int heightMode = MeasureSpec.getMode(heightSpec); int measuredWidth, measuredHeight; if (widthMode == MeasureSpec.UNSPECIFIED) { measuredWidth = desiredWidth; } else if (widthMode == MeasureSpec.AT_MOST) { measuredWidth = Math.min(desiredWidth, MeasureSpec.getSize(widthSpec)); } else { // MeasureSpec.EXACTLY measuredWidth = MeasureSpec.getSize(widthSpec); } if (heightMode == MeasureSpec.UNSPECIFIED) { measuredHeight = desiredHeight; } else if (heightMode == MeasureSpec.AT_MOST) { measuredHeight = Math.min(desiredHeight, MeasureSpec.getSize(heightSpec)); } else { // MeasureSpec.EXACTLY measuredHeight = MeasureSpec.getSize(heightSpec); } setMeasuredDimension(measuredWidth, measuredHeight); }
/** {@inheritDoc} */ @Override protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) { final int specWidthSize = MeasureSpec.getSize(widthMeasureSpec); final int specWidthMode = MeasureSpec.getMode(widthMeasureSpec); final int specHeightSize = MeasureSpec.getSize(heightMeasureSpec); final int specHeightMode = MeasureSpec.getMode(heightMeasureSpec); // We expect to be somewhere inside a MaterialCalendarView, which should measure EXACTLY if (specHeightMode == MeasureSpec.UNSPECIFIED || specWidthMode == MeasureSpec.UNSPECIFIED) { throw new IllegalStateException("MonthView should never be left to decide it's size"); } // The spec width should be a correct multiple final int measureTileSize = specWidthSize / DEFAULT_DAYS_IN_WEEK; // Just use the spec sizes setMeasuredDimension(specWidthSize, specHeightSize); int count = getChildCount(); for (int i = 0; i < count; i++) { final View child = getChildAt(i); int childWidthMeasureSpec = MeasureSpec.makeMeasureSpec(measureTileSize, MeasureSpec.EXACTLY); int childHeightMeasureSpec = MeasureSpec.makeMeasureSpec(measureTileSize, MeasureSpec.EXACTLY); child.measure(childWidthMeasureSpec, childHeightMeasureSpec); } }
// 测量当前布局,修改测量规则 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // 获取宽度模式 int widthMode = MeasureSpec.getMode(widthMeasureSpec); // 得到宽度 int widthSize = MeasureSpec.getSize(widthMeasureSpec); // 去除左右内边距,得到真实的宽度 widthSize = widthSize - this.getPaddingLeft() - this.getPaddingRight(); // 获取宽度模式 int heightMode = MeasureSpec.getMode(heightMeasureSpec); // 得到高度 int heightSize = MeasureSpec.getSize(heightMeasureSpec); // 去除上下内边距,得到真实的高度 heightSize = heightSize - this.getPaddingTop() - this.getPaddingBottom(); // 哪个是精确值,就以哪个为基准进行按比例设置 if (widthMode == MeasureSpec.EXACTLY && heightMode != MeasureSpec.EXACTLY) { // 对高度进行根据宽度的比例设置,+0.5是为了四舍五入 heightSize = (int) (widthSize / ratio + 0.5); } else if (widthMode != MeasureSpec.EXACTLY && heightMode == MeasureSpec.EXACTLY) { // 由于高度是精确的值 ,宽度随着高度的变化而变化 widthSize = (int) ((heightSize * ratio) + 0.5f); } // 重新指定测量规则 widthMeasureSpec = MeasureSpec.makeMeasureSpec( widthSize + this.getPaddingLeft() + this.getPaddingRight(), MeasureSpec.EXACTLY); heightMeasureSpec = MeasureSpec.makeMeasureSpec( heightSize + this.getPaddingTop() + this.getPaddingBottom(), MeasureSpec.EXACTLY); super.onMeasure(widthMeasureSpec, heightMeasureSpec); }
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int widthMode = MeasureSpec.getMode(widthMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); int width; int height; if (widthMode == MeasureSpec.EXACTLY) { width = widthSize; } else { int desired = (int) (getPaddingLeft() + getPaddingRight() + rectDst.width() + bitmapBaseLine.getWidth()); width = desired; } if (heightMode == MeasureSpec.EXACTLY) { height = heightSize; } else { int desired; if (valueNode2 != null) { desired = (int) (getPaddingTop() + getPaddingBottom() + rectDst.height() * 3 / 2); height = desired; } else { desired = (int) (getPaddingTop() + getPaddingBottom() + rectDst.height()); height = desired; } } setMeasuredDimension(width, height); }
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = 0; int height = 0; int widthMode = MeasureSpec.getMode(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); if (widthMode == MeasureSpec.EXACTLY) { width = widthSize; } else { width = mDrbBackground == null ? 0 : mDrbBackground.getIntrinsicWidth(); if (widthMode == MeasureSpec.AT_MOST) { width = Math.min(width, widthSize); } } if (heightMode == MeasureSpec.EXACTLY) { height = heightSize; } else { height = mDrbBackground == null ? 0 : mDrbBackground.getIntrinsicHeight(); if (heightMode == MeasureSpec.AT_MOST) { height = Math.min(height, heightSize); } } if (null != mDrbBackground) { mDrbBackground.setBounds(0, 0, width, height); } mRawProgressBounds.set( getPaddingLeft(), getPaddingTop(), width - getPaddingRight(), height - getPaddingBottom()); setMeasuredDimension(width, height); }
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int widthSize = MeasureSpec.getSize(widthMeasureSpec); int widthMode = MeasureSpec.getMode(widthMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); switch (widthMode) { case MeasureSpec.UNSPECIFIED: widthSize = getSuggestedMinimumWidth(); break; case MeasureSpec.AT_MOST: widthSize = Math.min(widthSize, getSuggestedMinimumWidth()); break; } switch (heightMode) { case MeasureSpec.UNSPECIFIED: heightSize = getSuggestedMinimumHeight(); break; case MeasureSpec.AT_MOST: heightSize = Math.min(heightSize, getSuggestedMinimumHeight()); break; } setMeasuredDimension(widthSize, heightSize); }
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec); int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec); int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec); int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec); measureChildren(widthMeasureSpec, heightMeasureSpec); int childCount = getChildCount(); if (childCount == 0) { setMeasuredDimension(0, 0); } else if (heightSpecMode == MeasureSpec.AT_MOST && widthSpecMode == MeasureSpec.AT_MOST) { // 即如果宽高都是wrap_content,那么测量的宽应该是单个子view的宽度乘以个数,高为单个view的高度 View view = getChildAt(0); heightSpecSize = view.getMeasuredHeight(); widthMeasureSpec = view.getMeasuredWidth() * childCount; // 假定所有子view的宽度相同 setMeasuredDimension(widthSpecSize, heightSpecSize); } else if (heightSpecMode == MeasureSpec.AT_MOST) { // 高是wrap_content,那么高度应该是单个子view的高度,宽度为屏幕宽度 View view = getChildAt(0); heightSpecSize = view.getMeasuredHeight(); setMeasuredDimension(widthSpecSize, heightSpecSize); } else if (widthSpecMode == MeasureSpec.AT_MOST) { // 宽是wrap_content,那么高度应该是屏幕高度,宽度为子view的宽度乘以个数 View view = getChildAt(0); widthSpecSize = view.getMeasuredWidth() * childCount; setMeasuredDimension(widthSpecSize, heightSpecSize); } }
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { float textSize = getTextSize(); float textLen = getText().length(); mRadius = Math.round(2 * textSize); mTickLen = Math.round(mRadius / 180 * 3.14 * mSweepAngMin); mMaxRippleWidth = mRadius; mLineWidth = Math.round(mRadius / 10); mRippleWidth = mLineWidth; mInitRippleWidth = mRippleWidth; mRecWidth = textLen * textSize; float mWidth = mRecWidth + 2 * (mRadius + mLineWidth + mMaxRippleWidth); float mHeight = 2 * (mRadius + mLineWidth + mMaxRippleWidth); mLineRadius = mRadius + mLineWidth; cxLeft = mLineRadius + mMaxRippleWidth; cyLeft = mLineRadius + mMaxRippleWidth; cxRight = cxLeft + mRecWidth; cyRight = cyLeft; mLinePaint.setStrokeWidth(mLineWidth); mLinePaint.setStrokeCap(Paint.Cap.ROUND); mTickPaint.setStrokeWidth(mLineWidth); mTickPaint.setStrokeCap(Paint.Cap.ROUND); int width = MeasureSpec.makeMeasureSpec((int) mWidth, MeasureSpec.getMode(widthMeasureSpec)); int height = MeasureSpec.makeMeasureSpec((int) mHeight, MeasureSpec.getMode(heightMeasureSpec)); super.onMeasure(width, height); }
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int fWidth; int fHeight; int wSize = MeasureSpec.getSize(widthMeasureSpec); int wMode = MeasureSpec.getMode(widthMeasureSpec); int hSize = MeasureSpec.getSize(heightMeasureSpec); int hMode = MeasureSpec.getMode(heightMeasureSpec); if (wMode == MeasureSpec.EXACTLY) { fWidth = wSize; } else { mPaint.setTextSize(mTextSize); mPaint.getTextBounds(mInt, 0, mInt.length(), mBound); int tepWidth = (int) (getPaddingLeft() + mBound.width() + getPaddingRight()); fWidth = tepWidth; } if (hMode == MeasureSpec.EXACTLY) { fHeight = hSize; } else { mPaint.setTextSize(mTextSize); mPaint.getTextBounds(mInt, 0, mInt.length(), mBound); int tepHeight = getPaddingTop() + mBound.height() + getPaddingBottom(); fHeight = tepHeight; } radius = Math.max(fHeight, fWidth) / 2; setMeasuredDimension(radius * 2, radius * 2); }
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec); int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec); int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec); int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec); if (widthSpecMode == MeasureSpec.UNSPECIFIED || heightSpecMode == MeasureSpec.UNSPECIFIED) { throw new RuntimeException("SlidingDrawer cannot have UNSPECIFIED dimensions"); } final View handle = mHandle; measureChild(handle, widthMeasureSpec, heightMeasureSpec); if (mVertical) { int height = heightSpecSize - handle.getMeasuredHeight() - mTopOffset; mContent.measure( MeasureSpec.makeMeasureSpec(widthSpecSize, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY)); } else { int width = widthSpecSize - handle.getMeasuredWidth() - mTopOffset; mContent.measure( MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(heightSpecSize, MeasureSpec.EXACTLY)); } setMeasuredDimension(widthSpecSize, heightSpecSize); }
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // TODO: 16/3/29 int widthMode = MeasureSpec.getMode(widthMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); int width; int height; if (widthMode == MeasureSpec.EXACTLY) { width = widthSize; } else { mPaint.setTextSize(mTitleSize); mPaint.getTextBounds(mTitleText, 0, mTitleText.length(), mBound); float textWidth = mBound.width(); int desired = (int) (getPaddingLeft() + textWidth + getPaddingRight()); width = desired; } if (heightMode == MeasureSpec.EXACTLY) { height = heightSize; } else { mPaint.setTextSize(mTitleSize); mPaint.getTextBounds(mTitleText, 0, mTitleText.length(), mBound); float textHeight = mBound.height(); int desired = (int) (getPaddingTop() + textHeight + getPaddingBottom()); height = desired; } setMeasuredDimension(width, height); }
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = 0; int height = 0; // 设置宽度 int specMode = MeasureSpec.getMode(widthMeasureSpec); int specSize = MeasureSpec.getSize(widthMeasureSpec); switch (specMode) { case MeasureSpec.EXACTLY: // 明确指定 width = getPaddingLeft() + getPaddingRight() + specSize; break; case MeasureSpec.AT_MOST: // WARP_CONTENT width = getPaddingLeft() + getPaddingRight() + textBound.width(); break; } // 设置高度 specMode = MeasureSpec.getMode(heightMeasureSpec); specSize = MeasureSpec.getSize(heightMeasureSpec); switch (specMode) { case MeasureSpec.EXACTLY: height = getPaddingTop() + getPaddingBottom() + specSize; break; case MeasureSpec.AT_MOST: height = getPaddingTop() + getPaddingBottom() + textBound.height(); break; } setMeasuredDimension(width, height); }
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int widthMode = MeasureSpec.getMode(widthMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); int width; int height; // 代表设置了具体的数值,就用界面传递过来的 if (widthMode == MeasureSpec.EXACTLY) { width = widthSize; } else { // 其他模式就自己计算 width = (int) (getPaddingLeft() + mRadius * 2 + mStrokeWidth * 2 + getPaddingRight()); } if (heightMode == MeasureSpec.EXACTLY) { height = heightSize; } else { height = (int) (getPaddingTop() + mRadius * 2 + mStrokeWidth * 2 + getPaddingBottom()); } setMeasuredDimension(width, height); }
// 测量当前布局 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // widthMeasureSpec 宽度的规则 包含了两部分 模式 值 int widthMode = MeasureSpec.getMode(widthMeasureSpec); // 模式 int widthSize = MeasureSpec.getSize(widthMeasureSpec); // 宽度大小 int width = widthSize - getPaddingLeft() - getPaddingRight(); // 去掉左右两边的padding int heightMode = MeasureSpec.getMode(heightMeasureSpec); // 模式 int heightSize = MeasureSpec.getSize(heightMeasureSpec); // 高度大小 int height = heightSize - getPaddingTop() - getPaddingBottom(); // 去掉上下两边的padding if (widthMode == MeasureSpec.EXACTLY && heightMode != MeasureSpec.EXACTLY) { // 修正一下 高度的值 让高度=宽度/比例 height = (int) (width / ratio + 0.5f); // 保证4舍五入 } else if (widthMode != MeasureSpec.EXACTLY && heightMode == MeasureSpec.EXACTLY) { // 由于高度是精确的值 ,宽度随着高度的变化而变化 width = (int) ((height * ratio) + 0.5f); } // 重新制作了新的规则 widthMeasureSpec = MeasureSpec.makeMeasureSpec( MeasureSpec.EXACTLY, width + getPaddingLeft() + getPaddingRight()); heightMeasureSpec = MeasureSpec.makeMeasureSpec( MeasureSpec.EXACTLY, height + getPaddingTop() + getPaddingBottom()); super.onMeasure(widthMeasureSpec, heightMeasureSpec); }
/** * Overriding onMeasure to handle the case where WRAP_CONTENT might be specified in the layout. * Since we don't know the dimensions of the profile photo, we need to handle this case * specifically. * * <p>The approach is to default to a NORMAL sized amount of space in the case that a preset size * is not specified. This logic is applied to both width and height */ @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { ViewGroup.LayoutParams params = getLayoutParams(); boolean customMeasure = false; int newHeight = MeasureSpec.getSize(heightMeasureSpec); int newWidth = MeasureSpec.getSize(widthMeasureSpec); if (MeasureSpec.getMode(heightMeasureSpec) != MeasureSpec.EXACTLY && params.height == ViewGroup.LayoutParams.WRAP_CONTENT) { newHeight = getPresetSizeInPixels(true); // Default to a preset size heightMeasureSpec = MeasureSpec.makeMeasureSpec(newHeight, MeasureSpec.EXACTLY); customMeasure = true; } if (MeasureSpec.getMode(widthMeasureSpec) != MeasureSpec.EXACTLY && params.width == ViewGroup.LayoutParams.WRAP_CONTENT) { newWidth = getPresetSizeInPixels(true); // Default to a preset size widthMeasureSpec = MeasureSpec.makeMeasureSpec(newWidth, MeasureSpec.EXACTLY); customMeasure = true; } if (customMeasure) { // Since we are providing custom dimensions, we need to handle the measure // phase from here setMeasuredDimension(newWidth, newHeight); measureChildren(widthMeasureSpec, heightMeasureSpec); } else { // Rely on FrameLayout to do the right thing super.onMeasure(widthMeasureSpec, heightMeasureSpec); } }
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { // 父容器传过来的宽度方向上的模式 int widthMode = MeasureSpec.getMode(widthMeasureSpec); // 父容器传过来的高度方向上的模式 int heightMode = MeasureSpec.getMode(heightMeasureSpec); // 父容器传过来的宽度的值 int width = MeasureSpec.getSize(widthMeasureSpec) - getPaddingLeft() - getPaddingRight(); // 父容器传过来的高度的值 int height = MeasureSpec.getSize(heightMeasureSpec) - getPaddingLeft() - getPaddingRight(); if (widthMode == MeasureSpec.EXACTLY && heightMode != MeasureSpec.EXACTLY && ratio != 0.0f) { // 判断条件为,宽度模式为Exactly,也就是填充父窗体或者是指定宽度; // 且高度模式不是Exaclty,代表设置的既不是fill_parent也不是具体的值,于是需要具体测量 // 且图片的宽高比已经赋值完毕,不再是0.0f // 表示宽度确定,要测量高度 height = (int) (width / ratio + 0.5f); heightMeasureSpec = MeasureSpec.makeMeasureSpec(height, MeasureSpec.EXACTLY); } else if (widthMode != MeasureSpec.EXACTLY && heightMode == MeasureSpec.EXACTLY && ratio != 0.0f) { // 判断条件跟上面的相反,宽度方向和高度方向的条件互换 // 表示高度确定,要测量宽度 width = (int) (height * ratio + 0.5f); widthMeasureSpec = MeasureSpec.makeMeasureSpec(width, MeasureSpec.EXACTLY); } super.onMeasure(widthMeasureSpec, heightMeasureSpec); }
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int widthMode = MeasureSpec.getMode(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); int prefWidth = this.tnContainer.getPreferredWidth(); int prefHeight = this.tnContainer.getPreferredHeight(); if (prefWidth > 0 && (widthMode == MeasureSpec.UNSPECIFIED || widthMode == MeasureSpec.AT_MOST || widthMode == MeasureSpec.EXACTLY)) { if (widthSize > 0 && prefWidth > widthSize) prefWidth = widthSize; widthMeasureSpec = MeasureSpec.makeMeasureSpec(prefWidth, MeasureSpec.EXACTLY); } if (prefHeight > 0 && (heightMode == MeasureSpec.UNSPECIFIED || heightMode == MeasureSpec.AT_MOST || heightMode == MeasureSpec.EXACTLY)) { if (heightSize > 0 && prefHeight > heightSize) prefHeight = heightSize; heightMeasureSpec = MeasureSpec.makeMeasureSpec(prefHeight, MeasureSpec.EXACTLY); } super.onMeasure(widthMeasureSpec, heightMeasureSpec); }
protected void onMeasure(final int widthMeasureSpec, final int heightMeasureSpec) { int widthMode = MeasureSpec.getMode(widthMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); // Measure Width if (widthMode == MeasureSpec.EXACTLY) { // Must be this size width = widthSize; } else if (widthMode == MeasureSpec.AT_MOST) { // Can't be bigger than... width = Math.min(50, widthSize); } else { // Be whatever you want width = 100; } // Measure Height if (heightMode == MeasureSpec.EXACTLY) { // Must be this size height = heightSize; } else if (heightMode == MeasureSpec.AT_MOST) { // Can't be bigger than... height = Math.min(80, heightSize); } else { // Be whatever you want height = 73; } // Satisfy contract by calling setMeasuredDimension setMeasuredDimension(width, height); }
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int width = 0; int height = 0; int widthMode = MeasureSpec.getMode(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int widthAllowed = MeasureSpec.getSize(widthMeasureSpec); int heightAllowed = MeasureSpec.getSize(heightMeasureSpec); widthAllowed = chooseWidth(widthMode, widthAllowed); heightAllowed = chooseHeight(heightMode, heightAllowed); width = (int) (heightAllowed + HUE_PANEL_WIDTH); if (width > widthAllowed) { width = widthAllowed; height = (int) (widthAllowed - HUE_PANEL_WIDTH); } else { height = heightAllowed; } setMeasuredDimension(width, height); }
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int widthMode = MeasureSpec.getMode(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); rebuildItems(); // rebuilding before measuring int height = calculateLayoutHeight(heightSize, heightMode); int width; if (widthMode == MeasureSpec.EXACTLY) { width = widthSize; } else { width = Math.max( getItemDimension() * (mVisibleItems - mItemOffsetPercent / 100), getSuggestedMinimumWidth()); if (widthMode == MeasureSpec.AT_MOST) { width = Math.min(width, widthSize); } } setMeasuredDimension(width, height); }
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int measuredWidth = 0; int measuredHeight = 0; if (mUIElement != null) { final int paddingLeft = getPaddingLeft(); final int paddingTop = getPaddingTop(); final int paddingRight = getPaddingRight(); final int paddingBottom = getPaddingBottom(); final int viewWidthSize = MeasureSpec.getSize(widthMeasureSpec); final int viewWidthMode = MeasureSpec.getMode(widthMeasureSpec); final int viewHeightSize = MeasureSpec.getSize(heightMeasureSpec); final int viewHeightMode = MeasureSpec.getMode(heightMeasureSpec); final int elementWidth = viewWidthSize - paddingLeft - paddingRight; final int elementWidthSpec = MeasureSpec.makeMeasureSpec(elementWidth, viewWidthMode); final int elementHeight = viewHeightSize - paddingTop - paddingBottom; final int elementHeightSpec = MeasureSpec.makeMeasureSpec(elementHeight, viewHeightMode); mUIElement.measure(elementWidthSpec, elementHeightSpec); measuredWidth = mUIElement.getMeasuredWidth() + paddingLeft + paddingRight; measuredHeight = mUIElement.getMeasuredHeight() + paddingTop + paddingBottom; } measuredWidth = Math.max(measuredWidth, getSuggestedMinimumWidth()); measuredHeight = Math.max(measuredHeight, getSuggestedMinimumHeight()); setMeasuredDimension(measuredWidth, measuredHeight); }
// ---------------------------------- // Setting up stuff // ---------------------------------- @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int viewWidth = circleRadius + this.getPaddingLeft() + this.getPaddingRight(); int viewHeight = circleRadius + this.getPaddingTop() + this.getPaddingBottom(); int widthMode = MeasureSpec.getMode(widthMeasureSpec); int widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); int width; int height; // Measure Width if (widthMode == MeasureSpec.EXACTLY) { // Must be this size width = widthSize; } else if (widthMode == MeasureSpec.AT_MOST) { // Can't be bigger than... width = Math.min(viewWidth, widthSize); } else { // Be whatever you want width = viewWidth; } // Measure Height if (heightMode == MeasureSpec.EXACTLY || widthMode == MeasureSpec.EXACTLY) { // Must be this size height = heightSize; } else if (heightMode == MeasureSpec.AT_MOST) { // Can't be bigger than... height = Math.min(viewHeight, heightSize); } else { // Be whatever you want height = viewHeight; } setMeasuredDimension(width, height); }
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int widthSpecMode = MeasureSpec.getMode(widthMeasureSpec); int widthSpecSize = MeasureSpec.getSize(widthMeasureSpec); int heightSpecMode = MeasureSpec.getMode(heightMeasureSpec); int heightSpecSize = MeasureSpec.getSize(heightMeasureSpec); if (widthSpecMode == MeasureSpec.UNSPECIFIED || heightSpecMode == MeasureSpec.UNSPECIFIED) { throw new RuntimeException("View cannot have UNSPECIFIED dimensions"); } mMainView.measure(widthMeasureSpec, heightMeasureSpec); int leftViewWidth = (int) (widthSpecSize - mLeftViewRightPadding); mLeftView.measure( MeasureSpec.makeMeasureSpec(leftViewWidth, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(heightSpecSize, MeasureSpec.EXACTLY)); int rightViewWidth = (int) (widthSpecSize - mRightViewLeftPadding); mRightView.measure( MeasureSpec.makeMeasureSpec(rightViewWidth, MeasureSpec.EXACTLY), MeasureSpec.makeMeasureSpec(heightSpecSize, MeasureSpec.EXACTLY)); setMeasuredDimension(widthSpecSize, heightSpecSize); }
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { Drawable drawable = getDrawable(); if (drawable == null || drawable.getIntrinsicWidth() == 0 || drawable.getIntrinsicHeight() == 0) { setMeasuredDimension(0, 0); return; } int drawableWidth = drawable.getIntrinsicWidth(); int drawableHeight = drawable.getIntrinsicHeight(); int widthSize = MeasureSpec.getSize(widthMeasureSpec); int widthMode = MeasureSpec.getMode(widthMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); int heightMode = MeasureSpec.getMode(heightMeasureSpec); viewWidth = setViewSize(widthMode, widthSize, drawableWidth); viewHeight = setViewSize(heightMode, heightSize, drawableHeight); // // Set view dimensions // setMeasuredDimension(viewWidth, viewHeight); // // Fit content within view // fitImageToView(); }
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int resultWidth = 0; int modeWidth = MeasureSpec.getMode(widthMeasureSpec); int sizeWidth = MeasureSpec.getSize(widthMeasureSpec); if (modeWidth == MeasureSpec.EXACTLY) { resultWidth = sizeWidth; } else { resultWidth = defaultWidth; if (modeWidth == MeasureSpec.AT_MOST) { resultWidth = Math.min(resultWidth, sizeWidth); } } int resultHeight = 0; int modeHeight = MeasureSpec.getMode(heightMeasureSpec); int sizeHeight = MeasureSpec.getSize(heightMeasureSpec); if (modeHeight == MeasureSpec.EXACTLY) { resultHeight = sizeHeight; } else { resultHeight = defaultHeight; if (modeHeight == MeasureSpec.AT_MOST) { resultHeight = Math.min(resultHeight, sizeHeight); } } setMeasuredDimension(resultWidth, resultHeight); }