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