黑马程序员技术交流社区
标题: 【武汉校区】分享:自定义控件之onMeasure [打印本页]
作者: 武汉分校-小舞 时间: 2016-4-13 11:19
标题: 【武汉校区】分享:自定义控件之onMeasure
【武汉校区】分享:自定义控件之onMeasure
自定义控件的测量方法自定义控件四个步骤:
1,加载
2,测量
3,布局
4,排版
自定义控件中测量方法是至关重要的,本文着重讲解此方法
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
由于宽度和高度的知识一致性,我们选其一,只需要研究widthMeasureSpecwidthMeasureSpec是父控件对子控件的约束,是由两个数据组成的(32位的int值)前两位:mode
//mode分为三种
//UNSPECIFIED:未指定宽高等,没有限制,此时界面的宽高可以是任意数值,使用比较少,例:ScrollView对于子View的限制
//EXACTLY:确定的.例如:xxxdp或MATCH_PARENT
//AT_MOST:至多.例如:WRAP_CONTENT,如果没有对View设置默认数据大小,而View本身也没有具有宽高的背景,传入WRAP_CONTENT,效果是视图铺满了窗体
//后三十位:size,表示父控件为子控件指定的大小
一般处理测量结果会定义如下方法private int measureWidth(int widthMeasureSpec) {
int result = 0;
//将widthMeasureSpec传入到方法中,获得对应的mode
//源码中实际上是将32位int值中的前两位取出,拿到mode
int mode = MeasureSpec.getMode(widthMeasureSpec);
//将widthMeasureSpec传入到方法中,获得对应的size
//源码中实际上是将32位int值中的后30位取出,拿到size
int size = MeasureSpec.getSize(widthMeasureSpec);
//当然,此时的mode和size不是直接可以使用,需要根据不同的需求进行相应的处理
switch (mode) {
//如果mode为未指定大小,则传入默认大小
case MeasureSpec.UNSPECIFIED:
Log.i("test", "UNSPECIFIED");
result = dashBoard.getWidth();
break;
//如果mode为确切值,则测量结果为size
case MeasureSpec.EXACTLY:
Log.i("test", "EXACTLY");
result = size;
break;
//如果mode为至多,则取Bitmap大小和指定大小的最小值,防止Bitmap显示不全
case MeasureSpec.AT_MOST:
Log.i("test", "AT_MOST");
result = dashBoard.getWidth();
result = Math.min(result, size);
break;
default:
break;
}
return result;
}
//以上均为个人需求,不是绝对的处理逻辑,需要根据不同需求对应进行不同处理
这么讲解起来没有发现并没有想象那么难.
那么难点在哪里呢?在于上述switch,case中的逻辑(即难点在于需求)!这需要程序员的长期努力学习和实践,加油,少年!
想获取最新传智播客武汉中心分享技术文章请加QQ 1641907557 ,后期会分享更多与实体班同步教程,助你冲击月薪20K!
推荐阅读:
作者: 泪雨星空 时间: 2016-4-15 22:54
还没学到这,非常抱歉不能回答你的问题;
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |