自定义View学习笔记之onMeasure()方法
2016-08-01 12:26
387 查看
1.为什么要重写onMeasure()方法?
我们拿一个例子来看。自定义一个MyView类并继承View,代码如下:
在布局文件中声明该自定义View并将layout_width和layout_height设置成match_parent,如下:
然后运行程序,发现效果正是我们想要的结果:
接下来,把width和height都设置成wrap_content,按理说这样设置layout_width和layout_height都应该是0才对,但是呢,实际运行的效果图跟上图没有任何变化!
那么问题就出现了,我们明明设置了wrap_content,但为什么效果却和设置match_parent效果一样呢?
其实,我们自定义的MyView继承了父容器(RelativeLayout)的大小!解决这个问题就需要我们重写onMeasure()方法了。
2.onMeasure方法中的参数和与之相关的几个常量都表示什么意思?
(1)onMeasure方法中有两个参数,分别是widthMeasureSpec和heightMeasureSpec,这两个参数表示什么?
这两个参数是View可以获取的宽高尺寸和模式值混合的int数据。可以通过int mode = MeasureSpec.getMode(widthMeasureSpec)得到模式,用int size =MeasureSpec.getSize(widthMeasureSpec)得到尺寸。
(2)通过MeasureSpec.getMode(widthMeasureSpec)我们可以获取到View宽高的模式,这个模式有三个值,分别是:
MeasureSpec.EXACTLY;
MeasureSpec.AT_MOST;
MeasureSpec.UNSPECIFIED.
这三个常量值表示什么意思?
其中MeasureSpec.EXACTLY是精确尺寸,当我们将控件的layout_width或layout_height指定为具体数值时如andorid:layout_width=”100dp”,或者为match_parent时,都是控件大小已经确定的情况,都是精确尺寸。
MeasureSpec.AT_MOST是最大尺寸,当控件的layout_width或layout_height指定为WRAP_CONTENT时,控件大小一般随着控件的子空间或内容进行变化,此时控件尺寸只要不超过父控件允许的最大尺寸即可。因此,此时的mode是AT_MOST,size给出了父控件允许的最大尺寸。
MeasureSpec.UNSPECIFIED是未指定尺寸,这种情况不多,一般都是父控件是AdapterView,通过measure方法传入的模式。
(3)通过MeasureSpec.getSize()得到的是什么?
MeasureSpec.getSize()会解析MeasureSpec值得到父容器的width或者height。
3.小结:
(1)重写onMeasure()方法是为了自定义View尺寸的规则。
(2)如果自定义View的尺寸是与父控件行为一致,就不需要重写onMeasure()方法。
我们拿一个例子来看。自定义一个MyView类并继承View,代码如下:
package com.example.smily.myview; import android.content.Context; import android.util.AttributeSet; import android.view.View; public class MyView extends View { public MyView(Context context) { super(context); } public MyView(Context context, AttributeSet attrs) { this(context, attrs,0); } public MyView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } }
在布局文件中声明该自定义View并将layout_width和layout_height设置成match_parent,如下:
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.smily.myview.MainActivity"> <com.example.smily.myview.MyView android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/colorPrimaryDark"/> </RelativeLayout>
然后运行程序,发现效果正是我们想要的结果:
接下来,把width和height都设置成wrap_content,按理说这样设置layout_width和layout_height都应该是0才对,但是呢,实际运行的效果图跟上图没有任何变化!
那么问题就出现了,我们明明设置了wrap_content,但为什么效果却和设置match_parent效果一样呢?
其实,我们自定义的MyView继承了父容器(RelativeLayout)的大小!解决这个问题就需要我们重写onMeasure()方法了。
2.onMeasure方法中的参数和与之相关的几个常量都表示什么意思?
(1)onMeasure方法中有两个参数,分别是widthMeasureSpec和heightMeasureSpec,这两个参数表示什么?
这两个参数是View可以获取的宽高尺寸和模式值混合的int数据。可以通过int mode = MeasureSpec.getMode(widthMeasureSpec)得到模式,用int size =MeasureSpec.getSize(widthMeasureSpec)得到尺寸。
(2)通过MeasureSpec.getMode(widthMeasureSpec)我们可以获取到View宽高的模式,这个模式有三个值,分别是:
MeasureSpec.EXACTLY;
MeasureSpec.AT_MOST;
MeasureSpec.UNSPECIFIED.
这三个常量值表示什么意思?
其中MeasureSpec.EXACTLY是精确尺寸,当我们将控件的layout_width或layout_height指定为具体数值时如andorid:layout_width=”100dp”,或者为match_parent时,都是控件大小已经确定的情况,都是精确尺寸。
MeasureSpec.AT_MOST是最大尺寸,当控件的layout_width或layout_height指定为WRAP_CONTENT时,控件大小一般随着控件的子空间或内容进行变化,此时控件尺寸只要不超过父控件允许的最大尺寸即可。因此,此时的mode是AT_MOST,size给出了父控件允许的最大尺寸。
MeasureSpec.UNSPECIFIED是未指定尺寸,这种情况不多,一般都是父控件是AdapterView,通过measure方法传入的模式。
(3)通过MeasureSpec.getSize()得到的是什么?
MeasureSpec.getSize()会解析MeasureSpec值得到父容器的width或者height。
3.小结:
(1)重写onMeasure()方法是为了自定义View尺寸的规则。
(2)如果自定义View的尺寸是与父控件行为一致,就不需要重写onMeasure()方法。
相关文章推荐
- 自定义View的onMeasure、onDraw、BitmapShader等等笔记__学习笔记
- 自定义View之OnMeasure方法学习
- Android中View的绘制过程 onMeasure方法简述 附有自定义View例子
- Android中View的绘制过程 onMeasure方法简述 附有自定义View例子
- Android中View的绘制过程 onMeasure方法简述 附有自定义View例子
- 自定义View之onMeasure(int widthMeasureSpec, int heightMeasureSpec)方法解释
- Android 自定义 view(四)—— onMeasure 方法理解
- Android中View的绘制过程 onMeasure方法简述 附有自定义View例子
- 自定义View之onLayout方法学习
- 自定义view中onMeasure、onLayout、onDraw、onFinishInflate、onSizeChanged方法调用时机
- Android 自定义 view(四)—— onMeasure 方法理解
- Android 自定义View onMeasure方法的实现
- Android学习自定义View(五)——自定义ViewGroup及其onMeasure()的理解
- Android中View的绘制过程 onMeasure方法简述 附有自定义View例
- 3自定义View系列课程学习笔记——之Measure测量
- 【转】Android中View的绘制过程 onMeasure方法简述 附有自定义View例子
- Android中View的绘制过程 onMeasure方法简述 附有自定义View例子
- 自定义View中为什么需要重写onMeasure()方法?
- 2014-11-3Android学习------关于自定义视图View的时候需要调用onMeasure--------GIF动画实现
- Android 自定义view 和 onMeasure方法介绍