自己定义控件的onMeasure方法具体解释

在我们自己定义控件的时候可能你会用到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);
    }

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

时间: 2025-01-08 06:17:32

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

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

转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51490283 本文出自:[openXu的博客] 目录: onMeasure什么时候会被调用 onMeasure方法执行流程 MeasureSpec类 从ViewGroup的onMeasure到View的onMeasure ViewGroup中三个测量子控件的方法 getChildMeasureSpec方法 View的onMeasure setMeasuredDimension ??在上一篇

Android应用之——自己定义控件ToggleButton

我们经常会看到非常多优秀的app上面都有一些非常美丽的控件,用户体验非常好.比方togglebutton就是一个非常好的样例,IOS系统以下那个精致的togglebutton现在在android以下也能够实现了,并且还能够自己定义它的颜色文字背景图,做出各种美丽的开关按键出来. 这里就用到了android里面一个比較经常使用的技术--自己定义控件. 先来看下我们实现的自己定义的togglebutton效果图:      自己定义控件的步骤: 1.首先,定义一个类继承View 或者View的子类,

android 自己定义控件

Android自己定义View实现非常easy 继承View,重写构造函数.onDraw.(onMeasure)等函数. 假设自己定义的View须要有自己定义的属性.须要在values下建立attrs.xml. 在当中定义你的属性. 在使用到自己定义View的xml布局文件里须要增加xmlns:前缀="http://schemas.android.com/apk/res/你的应用所在的包路径". 在使用自己定义属性的时候.使用前缀:属性名,如my:textColor="#FF

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

前三种实现方式代码出自: http://stormzhang.com/openandroid/2013/11/15/android-custom-loading/ (源代码下载)http://download.csdn.net/detail/chaoyu168/9616035 近期一直在学习自己定义控件,搜了很多大牛们Blog里分享的小教程.也上GitHub找了一些类似的控件进行学习.发现读起来都不太好懂,就想写这么一篇东西作为学习笔记吧. 一.控件介绍: 进度条在App中非经常见,比例如以下载

自己定义控件三部曲视图篇(一)——測量与布局

前言:生命总是要有信仰,有梦想才干一直前行.哪怕走的再慢,也是在前行. 相关文章: <Android自己定义控件三部曲文章索引>:http://blog.csdn.net/harvic880925/article/details/50995268 今天给大家讲讲有关自己定义布局控件的问题,大家来看这样一个需求,你须要设计一个container,实现内部控件自己主动换行.即里面的控件能够依据长度来推断当前行是否容得下它,进而决定是否转到下一行显示.效果图例如以下 在上图中,全部的紫色部分是Flo

git-osc自己定义控件之:CircleImageView

git-osc自己定义控件之:CircleImageView 一.CircleImageView的使用 在项目中能够发现,用户的头像都是圆形的.感觉非常好奇,昨天最终发现了,原来是自定了一个ImageView.先学习下怎样使用,使用过程例如以下: 创建属性文件:attrs.xml,创建路径为-- res/values/attrs.xml .格式例如以下: <?xml version="1.0" encoding="utf-8"?> <resourc

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

前言:我最大的梦想,就是有一天.等老了坐在摇椅上回望一生,有故事给孩子们讲--. 相关文章: <Android自己定义控件三部曲文章索引>:http://blog.csdn.net/harvic880925/article/details/50995268 经过上篇的铺垫.这篇就開始正式開始FlowLayout的开发啦,还是先给大家上上效果: 从效果图中能够看到,底部container的布局方式应该是layout_width="match_parent",layout_he

Android自己定义控件之轮播图控件

背景 近期要做一个轮播图的效果.网上看了几篇文章.基本上都能找到实现,效果还挺不错,可是在写的时候感觉每次都要单独去又一次在Activity里写一堆代码.于是自己封装了一下.这里仅仅是做了下封装成一个控件,不必每次反复写代码了. 效果图 实现分析 轮播图的功能就是实现左右滑动的广告.图片信息展示,那我们就用ViewPager来实现,由于考虑到用户体验,我们还须要在以下加一个指示器来标示滑动到了第几张轮播图.指示器我们能够用一个线性布局来依据要展示的轮播图设置显示的View,我们要做这种一个控件没

【转】带checkbox的ListView实现(二)——自定义Checkable控件的实现方法

原文网址:http://blog.csdn.net/harvic880925/article/details/40475367 前言:前一篇文章给大家展示了传统的Listview的写法,但有的时候我们并不想在DataHolder类中加一个标识是否选中的checked的成员变量,因为在项目开发中,大部分的ListItemLayout布局都是大家共用的,有些人根本不需要checkbox控件,所以会在初始化的时候把这个控件给隐藏掉,但我们的DataHolder在构造的时候以及ListItemAdapt