在我们自己定义控件的时候可能你会用到onMeasure方法,以下就具体的给大家介绍一下这种方法:

    @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

我们自己定义一个类继承View或者ViewGroup之后重写onMeasure方法,我们看到这种方法传递进来两个变量,这里做一下解释:

widthMeasureSpec:推荐的宽度和宽度的计算模式
heightMeasureSpec:推荐的高度和高度的计算模式
这里为什么说是推荐的宽和高呢?
由于这种方法是測量的作用,顾名思义就是让你測量一下你自身的宽和高,传递进来的变量仅仅是提供你作为參考,你依据这些參考值来计算你自身的宽和高!


那么有的人又有疑问了,你说的上面两个值的意思是推荐的宽和高以及响应的计算模式,可我怎么就看到两个值啊,你说的明明就是四个嘛?
这是由于一个变量里面包括了两个变量的值,所以我们须要对这两个值进行操作,获取相应的宽和高和相应的计算模式

    @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// super.onMeasure(widthMeasureSpec, heightMeasureSpec); // 宽和高的计算模式
int modeWidth = MeasureSpec.getMode(widthMeasureSpec);
int modeHeight = MeasureSpec.getMode(heightMeasureSpec);
        //真正的宽和高的数值
int sizeWidth = MeasureSpec.getSize(widthMeasureSpec);
int sizeHeigth = MeasureSpec.getSize(heightMeasureSpec); measureChildren(widthMeasureSpec, heightMeasureSpec); setMeasuredDimension(sizeWidth, sizeHeigth); }

能够看到我们通过类MeasureSpec的静态方法能够获取到对应的计算模式和宽和高

事实上计算模式就是你在布局文件里写的match_parent、wrap_content
而获取出来的宽和高是当前的计算模式下父容器所能给你的最大宽和高
比方:
父容器320*480
你这个控件的宽和高用了match_parent
那么这里推荐你的宽和高就是320*480
计算模式就是一个match_parent常量:

ViewGroup.LayoutParams.MATCH_PARENT



假如你用了wrap_content,那么这里推荐你的宽和高还是320*480

计算模式就是一个wrap_content常量:
ViewGroup.LayoutParams.WRAP_CONTENT


为什么推荐的宽和高和match_parent的时候一样,由于父容器无法确定你的包裹内容的须要的宽和高详细是多少,所以它仅仅能给你它最大的.所以这种方法计算的时候事实上说白了就是计算包裹内容的时候自身的大小,由于不管是match_parent还是写死的大小父容器都能非常轻松的算出来你须要的大小,仅仅有在包裹的时候是不知道的,须要你自己计算,然后通知我,怎样通知呢?


通过方法:setMeasureDimension(int,int)来告知,这里面就是传入你计算好的真正的宽和高.所以在不是包裹内容的时候父容器推荐你的宽和高是正确的,你无须计算,直接走父类的方法就可以,所以一般的解决方法就是以下这样:
    @Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// 宽和高的计算模式
int modeWidth = MeasureSpec.getMode(widthMeasureSpec);
int modeHeight = MeasureSpec.getMode(heightMeasureSpec);
//拿到父容器推荐的宽和高
int sizeWidth = MeasureSpec.getSize(widthMeasureSpec);
int sizeHeigth = MeasureSpec.getSize(heightMeasureSpec);
<span style="white-space:pre">	</span>//这里測量每个孩子的宽和高
if (modeWidth == MeasureSpec.ATMOST)
//sizeWidth = 计算的值
}
if (modeHeight == MeasureSpec.ATMOST<span style="font-family: Arial, Helvetica, sans-serif;">)</span>
//sizeHeigth = 计算的值
}
setMeasuredDimension(sizeWidth, sizeHeigth);
}

好了今天如此具体的解说了这种方法的作用及其參数的作用,大家自己也去试试吧

自己定义控件的onMeasure方法具体解释的更多相关文章

  1. 自己定义控件:onDraw 方法实现仿 iOS 的开关效果

    概述 本文主要解说怎样在 Android 下实现高仿 iOS 的开关按钮,并不是是在 Android 自带的 ToggleButton 上改动,而是使用 API 提供的 onDraw.onMeasur ...

  2. Android自定义View(三、深入解析控件测量onMeasure)

    转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51490283 本文出自:[openXu的博客] 目录: onMeasure什么时候会被调用 ...

  3. Android自己定义控件系列五:自己定义绚丽水波纹效果

    尊重原创!转载请注明出处:http://blog.csdn.net/cyp331203/article/details/41114551 今天我们来利用Android自己定义控件实现一个比較有趣的效果 ...

  4. Android自己定义控件系列二:自己定义开关button(一)

    这一次我们将会实现一个完整纯粹的自己定义控件,而不是像之前的组合控件一样.拿系统的控件来实现.计划分为三部分:自己定义控件的基本部分,自己定义控件的触摸事件的处理和自己定义控件的自己定义属性: 以下就 ...

  5. 【Android】自己定义控件实现可滑动的开关(switch)

    ~转载请注明来源:http://blog.csdn.net/u013015161/article/details/46704745 介绍 昨天晚上写了一个Android的滑动开关, 即SlideSwi ...

  6. Android自己定义控件:进度条的四种实现方式

    前三种实现方式代码出自: http://stormzhang.com/openandroid/2013/11/15/android-custom-loading/ (源代码下载)http://down ...

  7. 自己定义控件三部曲视图篇(二)——FlowLayout自适应容器实现

    前言:我最大的梦想,就是有一天.等老了坐在摇椅上回望一生,有故事给孩子们讲--. 相关文章: <Android自己定义控件三部曲文章索引>:http://blog.csdn.net/har ...

  8. android 自己定义控件

    Android自己定义View实现非常easy 继承View,重写构造函数.onDraw.(onMeasure)等函数. 假设自己定义的View须要有自己定义的属性.须要在values下建立attrs ...

  9. Android 实现形态各异的双向側滑菜单 自己定义控件来袭

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/39670935.本文出自:[张鸿洋的博客] 1.概述 关于自己定义控件側滑已经写了 ...

随机推荐

  1. Linux-批量添加用户stu01..stu03,并设置固定的密码123456 (要求不能使用循环for while)

    最终目标: useradd stu01;echo 123456|passwd --stdin stu01 useradd stu02;echo 123456|passwd --stdin stu02 ...

  2. [BJOI2018]求和(树链剖分)

    题目描述 master 对树上的求和非常感兴趣.他生成了一棵有根树,并且希望多次询问这棵树上一段路径上所有节点深度的 kkk 次方和,而且每次的 kkk 可能是不同的.此处节点深度的定义是这个节点到根 ...

  3. 洛谷——P3368 【模板】树状数组 2

    https://www.luogu.org/problem/show?pid=3368 题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某区间每一个数数加上x 2.求出某一个数的和 输入 ...

  4. 伸缩--也可用于tabs

    var $ranklist_li = $("div.ranklist_model ul li"); $ranklist_li.hover(function () { $(this) ...

  5. 为什么用卷积滤波,而不是非常easy的在频率领域内进行数据的频率处理

    卷积.为了更好的"动态"滤波. 问题来了.为什么用卷积滤波.而不是非常easy的在频率领域内进行数据的频率处理? 为了强调我觉得的答案,已经用blog标题给出了.卷积.为了更好的& ...

  6. beego实现web api接口

    1)程序代码: /** * 类似beego版物联网首页产品数据的调用 */import (    "github.com/astaxie/beego"    "githu ...

  7. HDU 5353 Average 贪心

    就是贪心啊,不知道为啥总是不过,总是WA 方法不对吗? 将数组扩展一倍,从左到右扫描,大于平均数就给右边的,小于就从右边拿,等于就不变,记录下操作类型. 大于2直接NO,不知道哪错了,自己出了一些数据 ...

  8. javascript学习笔记总结

    1 有些浏览器可能不支持JavaScript,我们可以使用如下的方法对它们隐藏JavaScript代码. <html> <body> <script type=" ...

  9. 织梦DedeCMS会员登录或退出后如何直接跳转到首页

    织梦dedecms默认情况下的会员登录后会直接跳转到会员中心,退出也是一样,但是如果我们想让会员登录后直接跳转到首页,那该如何实现呢? 经过我们的研究,已经找到解决办法,下面是详细的修改步骤: 首先在 ...

  10. node.学习笔记(关于http2的讲解)

    个人总结:读完这篇文章需要30分钟 http2部分很有学习价值,可以好好看.  用node搭建TCP服务器 用node搭建HTTP服务器 用node文件fs模块对文件读取,并用流的方式写入 用url路 ...