A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

【武汉校区】分享:自定义控件之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!



1 个回复

倒序浏览
还没学到这,非常抱歉不能回答你的问题;
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马