覆写onMeaure进行measure操作

    android在屏幕上绘制视图3步: measure测量、layout布局、draw绘制。
     这里主要介绍第一步measure,measure是view大小计算的过程。先来一个自定义View的例子,演示如何覆写onMeasure方法

一、 覆写onMeasure的例子(自定义View)  


例子下载地址   自定义view全屏显示蓝色方块


1. 覆写onMeasure
[plain]  view plain copy print ?
  1. @Override   
  2. protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {   
  3.   
  4. }  


2. 分别计算出宽高,后面解释使用的方法的作用
[plain]  view plain copy print ?
  1. private int measureWidth(int pWidthMeasureSpec) {  
  2.     int result = 0;  
  3.       
  4.     int widthMode = MeasureSpec.getMode(pWidthMeasureSpec);  
  5.     int widthSize = MeasureSpec.getSize(pWidthMeasureSpec);  
  6.       
  7.     switch (widthMode) {  
  8.     case MeasureSpec.AT_MOST:  
  9.     case MeasureSpec.EXACTLY:  
  10.         result = widthSize;  
  11.         break;  
  12.     }  
  13.     return result;  
  14. }  
  15.   
  16.   
  17. private int measureHeight(int pHeightMeasureSpec) {  
  18.     int result = 0;  
  19.       
  20.     int heightMode = MeasureSpec.getMode(pHeightMeasureSpec);  
  21.     int heightSize = MeasureSpec.getSize(pHeightMeasureSpec);  
  22.       
  23.     switch (heightMode) {  
  24.     case MeasureSpec.AT_MOST:  
  25.     case MeasureSpec.EXACTLY:  
  26.         result = heightSize;  
  27.         break;  
  28.     }  
  29.       
  30.     return result;  
  31. }  


3. 调用setMeasuredDimension,指定视图在屏幕上的大小、
[plain]  view plain copy print ?
  1. int measureWidth = measureWidth(widthMeasureSpec);  
  2. int measureHeight = measureHeight(heightMeasureSpec);  
  3.   
  4. setMeasuredDimension(measureWidth, measureHeight);  




二、 解释例子中使用的MeasureSpec  

     MeasureSpec是一个android.view.View的内部类。

     MeasureSpec封装了从父类传送到子类的布局要求信息。每个MeasureSpec对象描述了空间的高度或宽度。 MeasureSpec由size和mode组成。

1. MeasureSpec的方法介绍:
类名.方法名解释
MeasureSpec.getMode(int measureSpec)根据提供的测量值(格式)提取模式(上述三个模式之一)
MeasureSpec.getSize(int measureSpec)根据提供的测量值(格式)提取大小值(这个大小也就是我们通常所说的大小)
MeasureSpec.makeMeasureSpec(int size,int mode)根据提供的大小值和模式创建一个测量值(格式)


2. MeasureSpec有三种mode,分别说明并描述模式与layout参数值的对应关系
模式模式翻译模式与Layout参数的对应关系 
android:layout_width=“” 
android:layout_height=“”
模式描述
UNSPECIFIED无限制 parent view不约束child view的大小
AT_MOST最多的wrap_contentparent view 为child view指定最大的值,child view可以在范围内设置
EXACTLY准确的fill_parent,精确值(例如50dip)parent view为child view指定固定大小


三、 疑惑

例子总只写了一个view,在onMeasure中添加log获知此方法执行2次? 在ADT 20.3中同样的代码onMeasure执行4次?不是应该只执行一次吗?
我整明白了,当new ViewGroup()的时候,通过getWidth()和getHeight()(在构造方法里打log),得到的值首先是0,0,然后通过调用onMeasure()和onLayout()方法,会对这个view测量大小,这个时候view的宽高就发生了改变,这个时候又会重新调用一次onMeasure和onLayout方法(当view发生改变的时候,这两个方法会被调用),这时候你通过getWidth和getHeight方法就可以看到被测量之后的宽高了。这就是会调用两次的原因。

如果父视图的子视图的个数为0,就会执行一次。否则就会执行多次。因为开始时父试图中是没有子试图的。但是当你从xml文件中加载子试图或者在java代码中添加子试图时,父试图的状态会发生变化,这个变化会引起onlayout甚至是onmeasure。




四、 资料

计算控件尺寸

MeasureSpec介绍  ( 如何计算size和mode )

重写onMeasure典型例子:




提高:
自定义view改成addview多个,每个layout参数不同
各种模式画图比较

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值