在android开发中,很多人对自定义View是望而生畏,我也一样,但这又是向高级进阶的必经之路,主要是对View里面的很多方法不知道怎么理解,其中一个就是onMeasure()方法,网上有很多这样解释说明,可能是由于我的领悟力有限,一直没能搞明白,今天有点空,好好研究一下,并记录下来,也希望对大家有所帮助。
首先,我自定义一个MyView,继承于View,onMeasure()方法不做处理,直接调用super.onMeasure(widthMeasureSpec, heightMeasureSpec);

import android.annotation.TargetApi;
import android.content.Context;
import android.os.Build;
import android.util.AttributeSet;
import android.view.View;/*** Created by Administrator on 2016/1/31.*/
public class MyView extends View{public MyView(Context context) {super(context);}public MyView(Context context, AttributeSet attrs) {super(context, attrs);}public MyView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}@TargetApi(Build.VERSION_CODES.LOLLIPOP)public MyView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {super(context, attrs, defStyleAttr, defStyleRes);}@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);}
}

布局文件为:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical" ><com.example.customviewdemo.View.MyViewandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_margin="10dp"android:padding="10dp"android:background="#ff0000"/></LinearLayout>

onMeasure()方法的作用就是测量View需要多大的空间,就是宽和高,在MyView中我没有做任何处理,使用View默认的测量规则,我们看下效果

在android:layout_width和android:layout_height都为match_parent的时候,MyView填满全屏,当我们把android:layout_width和android:layout_height都为wrap_content的时候,我们看到MyView还是填满全屏,当我把android:layout_width和android:layout_height都这是为100dp的时候,我们看下效果

我们看到MyView的大小为100dp了。
结论:
1、View默认的测量规则是android:layout_width和android:layout_height为match_parent或者wrap_content时,是填充全屏的。
2、android:layout_width和android:layout_height设置为具体值时,那么是多少,宽高就是多少。
显然,默认的规则大部分不符合我们的需求,先来看下onMeasure()的参数,有两个参数,widthMeasureSpec,heightMeasureSpec,以前不明白,我以为是View本身的大小,仔细想想也不对,如果是本身的大小那还要你测什么啊,这两个参数是父布局给它提供的水平和垂直的空间要求,大家注意,只是父布局提供的要求,当然View也可以不遵守在View的android:layout_width和android:layout_height的值就是onMeasure()两个参数。什么意思,比如我为android:layout_width和android:layout_height设置的值为300dp,但是我在onMeasure()中,测量时不遵守这个300dp的空间要求,将onMeasure()的实现改为:

    @Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);setMeasuredDimension(100,100);}

这样一样,不管android:layout_width和android:layout_height设置的值为多少,MyView显示的宽高都为100px,一般来说我们不这样做,我们要考虑父布局给出的宽高,即我们设置android:layout_width和android:layout_height的值。
结论:
onMeasure方法的作用就是计算出自定义View的宽度和高度。这个计算的过程参照父布局给出的大小,以及自己特点算出结果
一般来说使用如下的实现过程:

    @Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {super.onMeasure(widthMeasureSpec, heightMeasureSpec);setMeasuredDimension(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec));}private int measureWidth(int measureSpec) {int specMode = MeasureSpec.getMode(measureSpec);int specSize = MeasureSpec.getSize(measureSpec);//设置一个默认值,就是这个View的默认宽度为500,这个看我们自定义View的要求int result = 500;if (specMode == MeasureSpec.AT_MOST) {//相当于我们设置为wrap_contentresult = specSize;} else if (specMode == MeasureSpec.EXACTLY) {//相当于我们设置为match_parent或者为一个具体的值result = specSize;}return result;}private int measureHeight(int measureSpec) {int specMode = MeasureSpec.getMode(measureSpec);int specSize = MeasureSpec.getSize(measureSpec);int result = 500;if (specMode == MeasureSpec.AT_MOST) {result = specSize;} else if (specMode == MeasureSpec.EXACTLY) {result = specSize;}return result;}

大概就这样,不知道我说清楚了没有,大家有什么问题或者建议可以给我留言。

android中对View的onMeasure()方法的理解相关推荐

  1. Android中自定义view的onMeasure()方法详谈

    背景 理解MeasureSpec MeasureSpec 情况分析 结合图例分析 总结 A little bit of progress every day!Come on! 背景 首先关于自定义vi ...

  2. Android中移动View(ViewGroup)方法探究

    最新研究Veiw的移动方法,参考网上和自己的总结.如下: 1.setX(),setY() 自己测试好像只对自定义ViewGroup起作用,自定义View不行,不知道为什么 ,欢迎解惑. private ...

  3. android中实现view的更新有两组方法

    android中实现view的更新有两组方法,一组是invalidate,另一组是postInvalidate,其中前者是在UI线程自身中使用,而后者在非UI线程中使用.     Android提供了 ...

  4. Android View.onMeasure方法的理解

    View在屏幕上显示出来要先经过measure(计算)和layout(布局). 1.什么时候调用onMeasure方法?  当控件的父元素正要放置该控件时调用.父元素会问子控件一个问题,"你 ...

  5. Android自定义控件:imageview重写onMeasure方法实现图片按指定比例显示,拉伸永不变形,解决屏幕适配问题

    使用ImageView会遇到的问题 在Android应用中,都少不了图片的显示,ImageView,轮播图,ViewPager等等,很多都是来显示图片的,比如一个广告条的轮播效果,参看博客:广告条效果 ...

  6. 【Android】自定义view之onMeasure

    1 onMeasure什么时候会被调用 onMeasure方法的作用是测量控件的大小,当我们创建一个View(执行构造方法)的时候不需要测量控件的大小,只有将这个view放入一个容器(父控件)中的时候 ...

  7. Android中UI(View)的刷新

    2019独角兽企业重金招聘Python工程师标准>>> 看了很多资料,翻啊翻啊,似乎有些了解了. Android中对View的更新有很多种方式,使用时要区分不同的应用场合.我感觉最要 ...

  8. Android 中自定义View 裁剪扇形图片

    Android 中自定义View 裁剪扇形图片 当需要裁剪图片为扇形区域时,使用Canvas.clipPath(path)方法可以裁剪为扇形区域 ps:此方法会导致绘制图片边缘有锯齿,暂无解决方法(知 ...

  9. Android中的View绘制原理

    该文章参考了 伯努力不努力(https://blog.csdn.net/u012124438/article/details/71435787) Android_韦鲁斯(https://blog.cs ...

最新文章

  1. 使用 TListView 控件(3)
  2. 【基础复习】二:预处理、const与sizeof
  3. 如何在10分钟内进行可用性测试
  4. jquery实现停留半秒后再选择
  5. OpenGL在frag着色器中模拟点光源
  6. MSTP协议介绍和堆叠技术介绍
  7. 深入理解JVM(三)——配置参数
  8. Solr 11 - Solr集群模式的部署(基于Solr 4.10.4搭建SolrCloud)
  9. 华为云服务器初探二(完结)
  10. [html] a标签的默认事件禁用后,如何实现跳转?
  11. 在centos服务器上安装配置私人邮箱,并在web端管理邮件
  12. android 中如何监听耳机键消息
  13. [转载] 【python】定义带参数的装饰器,用装饰器限制函数的参数类型
  14. 自适应巡航跟车距离怎么调_2020款奔驰GLS450改装原厂配件 ACC自适应巡航系统 香氛香薰负离子...
  15. VMware如何彻底卸载干净
  16. 计算机管理禁用usb,电脑如何禁用U盘、怎样禁用USB存储工具,防止USB端口泄密?...
  17. 天朝有一个乞丐姓洪,去天桥要钱 第一天要了1块钱 第二天要了2块钱 第三天要了4块钱 第四天要了8块钱 以此类推 问题: 洪乞丐干10天,收入是多少?
  18. 复数计算 [(8+6i)*(4+3i)]/[(8+6i)+(4+3i)]= ?
  19. 使用感受 2019-05-23
  20. win7计算机收藏夹位置,收藏夹位置,教您ie浏览器收藏夹的位置在哪

热门文章

  1. 苹果A10处理器内核图曝光:找不到小核心CPU
  2. 前端JS RSA加密,PHP后端解密实现密码安全传输
  3. mysql8 密码破解
  4. 深入浅出 超详细 从 线程锁 到 redis 实现分布式锁(篇节 2)
  5. MID平板产业生态走势预测
  6. 计算机陈辉江教案,中职语文基础模块下册电子教学教案.doc
  7. 英特尔重启超级计算机技术
  8. 外接显示器调亮度解决方案(最低亮度后还是很亮)
  9. 不知道电脑压缩图片怎么压缩?这有3个压缩妙招推荐给你
  10. 美伦美唤|颇具辨识度的桌搭好物,漫步者蓝牙音响上手评测