博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
自定义控件详解(五):onMeasure()、onLayout()
阅读量:7137 次
发布时间:2019-06-28

本文共 2576 字,大约阅读时间需要 8 分钟。

前言:

  自定义控件的三大方法:

测量: onMeasure():  测量自己的大小,为正式布局提供建议 布局: onLayout():   使用layout()函数对所有子控件布局绘制: onDraw():     根据布局的位置绘图

      onDraw() 里面是绘制的操作,可以看下其他的文章,下面来了解 onMeasure()和onLayout()方法。

 

一、onMeasure()、测量

protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)

参数即父类传过来的两个宽高的"建议值",即把当前view的高设置为:heightMeasureSpec ;宽设置为:widthMeasureSpec

这个参数不是简单的整数类型,而是2位整数(模式类型)和30位整数(实际数值) 的组合

 

其中模式分为三种:

①、UNSPECIFIED(未指定),父元素部队自元素施加任何束缚,子元素可以得到任意想要的大小;UNSPECIFIED=00000000000000000000000000000000 ②、EXACTLY(完全),父元素决定自元素的确切大小,子元素将被限定在给定的边界里而忽略它本身大小;EXACTLY =01000000000000000000000000000000
③、AT_MOST(至多),子元素至多达到指定大小的值。 他们对应的二进制值分别是: AT_MOST =10000000000000000000000000000000 最前面两位代表模式,分别对应十进制的0,1,2;

 

获取模式int值 和 获取数值int值的方法:

  1. int measureWidth = MeasureSpec.getSize(widthMeasureSpec);  
  2. int measureHeight = MeasureSpec.getSize(heightMeasureSpec);  
  3. int measureWidthMode = MeasureSpec.getMode(widthMeasureSpec);  
  4. int measureHeightMode = MeasureSpec.getMode(heightMeasureSpec); 

模式的值有:

MeasureSpec.AT_MOST       = 2MeasureSpec.EXACTLY       = 1MeasureSpec.UNSPECIFIED   = 0

 

上面我们知道了 onMeasure(int widthMeasureSpec, int heightMeasureSpec) 方法参数的意义

下面了解参数对应的三个模式分别对应的意义:

每一个模式都对应的xml布局中的一个值

wrap_content   --- MeasureSpec.AT_MOSTmatch_parent   --- MeasureSpec.EXACTLY具体值          --- MeasureSpec.UNSPECIFIED

 

注意:当模式是MeasureSpec.AT_MOST时,即wrap_content时,需要将大小设置一个数值。

 

 

二、onLayout() 、 布局

首先先了解几个需要用到的方法:

  (1)、

      这个方法和onMeasure()方法类似。其实这个方法的作用就是 设置当前View的宽高

  (2)、

      这个方法就和方法类似了,不过少了第一个参数boolean changed

      这个方法的目的是用于当前ViewGroup中的子控件的布局

 

  再看方法,只要是继承ViewGroup的类都必须要重写该方法,来实现该控件内部子控件的布局情况。

  我们写一个自定义类继承ViewGroup实现Linearlayout垂直排列的效果看下:

  public class XViewGroup extends ViewGroup{    public XViewGroup(Context context) {        super(context);    }    public XViewGroup(Context context, AttributeSet attrs) {        super(context, attrs);    }    public XViewGroup(Context context, AttributeSet attrs, int defStyleAttr) {        super(context, attrs, defStyleAttr);    }    @Override    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {        super.onMeasure(widthMeasureSpec, heightMeasureSpec);        int measureWidth = MeasureSpec.getSize(widthMeasureSpec);        int measureHeight = MeasureSpec.getSize(heightMeasureSpec);        int measureWidthMode = MeasureSpec.getMode(widthMeasureSpec);        int measureHeightMode = MeasureSpec.getMode(heightMeasureSpec);                  // 计算所有子控件需要用到的宽高        int height = 0;              //记录根容器的高度        int width = 0;               //记录根容器的宽度        int count = getChildCount(); //记录容器内的子控件个数        for (int i=0;i

 

转载地址:http://jbtrl.baihongyu.com/

你可能感兴趣的文章
mac安装brew和nginx
查看>>
技术博客
查看>>
软考信息系统监理师:2016年4月1日作业
查看>>
关于ssh远程登录太慢的解决方法
查看>>
bootstrap栅格系统显示规则
查看>>
子类化QMainWindows
查看>>
Windows完成端口 IOCP模型(一)
查看>>
修改roo的密码 虚拟机vmware8.04 Centos 6.3
查看>>
大数据真的好找工作么?
查看>>
Hibernate4离散结构课程在线考试系统
查看>>
安装部署LNMP/大并发nginx优化/php性能加速 实战
查看>>
rsync 和 配置及个人理解
查看>>
决心书
查看>>
访问控制列表acl权限
查看>>
sed工具的用法
查看>>
我的设计模式--------------责任链模式
查看>>
Java——循环应用
查看>>
云计算网络基础部分案列和必备知识点
查看>>
python之Linux基础(四)
查看>>
文本处理工具之sed的用法
查看>>