热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

onMeasure与onSizeChanged获取尺寸区别

自定义view如下:publicclassMyViewextendsView{privatestaticfinalintDEFAULT_WIDTH100;privat

自定义view如下:


public class MyView extends View {private static final int DEFAULT_WIDTH = 100;private static final int DEFAULT_HEIGHT = 100;private Paint paint;private Rect rect;public MyView(Context context) {super(context);init();}public MyView(Context context, @Nullable AttributeSet attrs) {super(context, attrs);init();}public MyView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);init();}private void init() {paint = new Paint();paint.setColor(Color.parseColor("#ff0000"));rect = new Rect(getPaddingLeft(), getPaddingTop(), 200, 200);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {int width = getProperSize(DEFAULT_WIDTH, widthMeasureSpec);int height = getProperSize(DEFAULT_HEIGHT, heightMeasureSpec);setMeasuredDimension(width, height);}private int getProperSize(int defaultSize, int measureSpec) {int result;int mode = MeasureSpec.getMode(measureSpec);int size = MeasureSpec.getSize(measureSpec);if (mode == MeasureSpec.EXACTLY) {result = size;} else {result = defaultSize;if (mode == MeasureSpec.AT_MOST) {result = Math.min(result, size);}}return result;}@Overrideprotected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);//可省略}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);canvas.drawRect(rect, paint);}}

onMeasure与onSizeChanged获取尺寸区别:

获取的尺寸单位均为px

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);//int width = getWidth();int height = getHeight();int measuredHeight = getMeasuredHeight();int measuredWidth = getMeasuredWidth();//onMeasure中://Width = Height = 0 //当具体数据或match_parent时://measuredHeight的最后数值 = onSizeChanged中h = height = measuredHeight//measuredWidth的最后数值 = onSizeChanged中w = width = measuredWidthint suggestedMinimumWidth = getSuggestedMinimumWidth();int suggestedMinimumHeight = getSuggestedMinimumHeight();//等于xml中指定的min尺寸与背景图的min尺寸中较大值,否则为零
}@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {super.onSizeChanged(w, h, oldw, oldh);//空方法,可删int width = getWidth();int height = getHeight();int measuredHeight = getMeasuredHeight();int measuredWidth = getMeasuredWidth();//onSizeChanged中//w = width = measuredWidth//h = height = measuredHeight//oldw = onMeasure方法中getWidth()的最后数值//oldh = onMeasure方法中getHeight()的最后数值int suggestedMinimumWidth = getSuggestedMinimumWidth();int suggestedMinimumHeight = getSuggestedMinimumHeight();//等于xml中指定的min尺寸与背景图的min尺寸中较大值,否则为零
}

super.onMeasure(widthMeasureSpec, heightMeasureSpec);源码:

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {setMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec),getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec));
}

public static int getDefaultSize(int size, int measureSpec) {int result = size;int specMode = MeasureSpec.getMode(measureSpec);int specSize = MeasureSpec.getSize(measureSpec);switch (specMode) {case MeasureSpec.UNSPECIFIED:result = size;break;case MeasureSpec.AT_MOST:case MeasureSpec.EXACTLY:result = specSize;break;}return result;
}

可看出:
wrap_content和match_parent具有相同的效果,即填充父容器

getSuggestedMinimumWidth方法源码:

private int mMinWidth;
private int mMinHeight;private Drawable mBackground;protected int getSuggestedMinimumWidth() {return (mBackground == null) ? mMinWidth : max(mMinWidth, mBackground.getMinimumWidth());
}protected int getSuggestedMinimumHeight() {return (mBackground == null) ? mMinHeight : max(mMinHeight, mBackground.getMinimumHeight());}


推荐阅读
author-avatar
mobiledu2502864045
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有