自定义控件---OnMeasure()方法分析
来源:互联网 发布:淘宝商城女装晚礼服 编辑:程序博客网 时间:2024/05/16 14:03
自定义View的第一步就是要测量Measure控件的大小,所以了解OnMeasure至关重要
首先说说MeasureSpec类
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); }
MeasureSpec是帮助我们测量View的,MeasureSpec是一个32位的int值,其中高2位表示测量模式,后30位表示测量的大小。
测量模式值得一说,搞不清楚的话,很难写好OnMeasure()方法,测量模式分为三种:
- EXACTLY:精确模式,将控件的高或者宽设置为match_parent或者具体的数值(如100dp)时,系统采用EXACTLY
- AT_MOST,指定为wrap_content时,系统采用AT_MOST,控件随着子控件的内容变化而变化,指的是控件不超过父控件允许的最大尺寸即可
- UNSPECIFIED:系统的测量模式,我们不需要了解,自定义控件也用不到这个
如何让你写的控件支持wrap_content
如果你不重写OnMeasure()方法,你写的自定义控件只是支持EXACTLY模式,即只能用具体的数值(如100dp)或者match_parent,是不支持使用wrap_content的(如果你使用了wrap_content的话,效果与match_parent是一样的),如何让你写的控件支持wrap_content呢,重写OnMeasure()即可,以下代码为模板代码:
// 以下为模板代码,如果不重写onMeasure方法,无法使用wrap_content这个属性,系统不知道该默认什么尺寸,// 就会默认填充整个父布局 @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); setMeasuredDimension(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec)); } private int measureWidth(int widthMeasureSpec) { int result = 0; int specMode = MeasureSpec.getMode(widthMeasureSpec); int specSize = MeasureSpec.getSize(widthMeasureSpec); if (specMode == MeasureSpec.EXACTLY) { //如果是EXACTLY模式,测量宽度就是父类传递过来的宽度,(或者说你在xml布局里写的具体的宽度数值或者match_parent) result = specSize; } else { result = DensityUtil.dip2px(context, 200); if (specMode == MeasureSpec.AT_MOST) { //如果是AT_MOST模式,测量宽度就是你自己设置的默认宽度与父类传递过来的宽度之间的一个最小值(为什么取最小值呢,因为如果你设置的默认值很大,已经超过了父控件的大小,那么这个控件在父控件里就显示不全了,如果你设置的默认值小于父控件,那么就用你设置的默认值) result = Math.min(result, specSize); } } return result; } private int measureHeight(int heightMeasureSpec) { int result = 0; int specMode = MeasureSpec.getMode(heightMeasureSpec); int specSize = MeasureSpec.getSize(heightMeasureSpec); if (specMode == MeasureSpec.EXACTLY) { result = specSize; } else { result = DensityUtil.dip2px(context,200); if (specMode == MeasureSpec.AT_MOST) { result = Math.min(result, specSize); } } return result; }
0 0
- 自定义控件---OnMeasure()方法分析
- Android 自定义控件onMeasure()方法详解
- 自定义控件的onMeasure方法详解
- 自定义View控件之onMeasure方法详解
- Android 自定义控件源码分析----谈Android自定义控件中 onMeasure()方法处理 wrap_content 情况的必要性
- 自定义控件View之onMeasure调用时机源码分析
- 对Android自定义控件中的onMeasure方法的理解
- 自定义控件初学篇——onMeasure()和onLayout()方法
- 自定义控件:onMeasure 方法和测量原理的理解
- Android自定义控件onMeasure方法简单的重写
- 自定义的onMeasure()方法
- 自定义View_onDraw,onMeasure方法
- 自定义控件---onMeasure和onLayout
- Android自定义控件之onMeasure
- Android自定义控件之onMeasure
- 自定义view 重写onMeasure()方法
- 自定义View-onMeasure()方法
- 自定义View之onMeasure方法
- Web开发过程中乱码问题
- Redis+linux入门(二)
- leetcode之Intersection of Two Linked Lists
- Github+Jekyll —— 创建个人免费博客(三)Git学习
- 最长滑雪路径
- 自定义控件---OnMeasure()方法分析
- 【GDOI2016模拟3.9】暴走的图灵机
- 二叉树是否相同
- UIWebView简单使用
- nodeJs grunt中Gruntfile.js模版
- 表单提交方式总结
- Boost解析json格式文本
- 【UFLDL-exercise9-Convolution and Pooling】
- Hash算法冲突解决方法分析