Android View 测量
2016-07-21 09:32
465 查看
View测量使用MeasureSpec类实现,测量包括大小和位置的测量;MeasureSpec是个32位的数,高2位是测量模式,低30位是测量大小;
测量模式包括
1.EXACTLY
即match_parent或指定长度,onMeasure方法默认只支持这种模式;
2.AT_MOST
即wrap_content,由于onMeasure方法默认只支持EXACTLY模式,所以如果需要使用该属性需要重写onMeasure方法,判断并确定该模式下测量大小的值。
3.UNSPECIFIED
未定义模式,不指定测量大小和测量模式,View想多大就多大,一般多在View重写中使用;
onMeasure方法默认继承父类的onMeasure方法,即super.onMeasure(),点开父类就会发现,onMeasure方法实现的是setMeasureDimension方法。一般如果使用wrap_content属性的话就需要重写这个方法
代码如下:
实现效果如下:
测量模式包括
1.EXACTLY
即match_parent或指定长度,onMeasure方法默认只支持这种模式;
2.AT_MOST
即wrap_content,由于onMeasure方法默认只支持EXACTLY模式,所以如果需要使用该属性需要重写onMeasure方法,判断并确定该模式下测量大小的值。
3.UNSPECIFIED
未定义模式,不指定测量大小和测量模式,View想多大就多大,一般多在View重写中使用;
onMeasure方法默认继承父类的onMeasure方法,即super.onMeasure(),点开父类就会发现,onMeasure方法实现的是setMeasureDimension方法。一般如果使用wrap_content属性的话就需要重写这个方法
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(getDefaultSize(getSuggestedMinimumWidth(), widthMeasureSpec), getDefaultSize(getSuggestedMinimumHeight(), heightMeasureSpec)); }
代码如下:
package com.everyoo.chaos.view; import android.content.Context; import android.util.AttributeSet; import android.view.View; /** * Created by chaos on 2016/7/20. * 功能描述:View测量 * 1.辅助类:MeasureSpec,MeasureSpec是一个32位的int值,高2位是测量模式(包括EXACTLY、AT_MOST、UNSPECIFIED);低30位是测量大小;使用位运算的目的是提高并优化运行效率 * 2.继承View,重写onMeasure方法,该方法中实现的是setMeasureDimension方法,需要输入宽和高。onMeasure方法默认只支持EXACLY模式,如果要支持AT_MOST模式,需重写onMeasure方法指定该模式下wrap_content大小 */ public class Measure extends View { public Measure(Context context, AttributeSet attrs) { super(context, attrs); } @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { setMeasuredDimension(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec));// 默认只支持EXACTLY模式,需要重写才能支持AT_MOST模式 } /** * 宽度测量 * * @param measureSpec * @return */ private int measureWidth(int measureSpec) { int size; int specMode = MeasureSpec.getMode(measureSpec); int specSize = MeasureSpec.getSize(measureSpec); if (specMode == MeasureSpec.EXACTLY) { // EXACTLY模式,去指定的specSize作为测量值 size = specSize; } else {// AT_MOST或UNSPECIFIED 模式下取出我们指定的大小和specSize两个数值中最小的一个作为最后的测量值 size = 200; size = Math.min(size, specSize); } return size; } /** * 高度测量 * * @param measureSpec * @return */ private int measureHeight(int measureSpec) { int size; int specMode = MeasureSpec.getMode(measureSpec); int specSize = MeasureSpec.getSize(measureSpec); if (specMode == MeasureSpec.EXACTLY) { size = specSize; } else { size = 200; size = Math.min(size, specSize); } return size; }}
实现效果如下:
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- Android IPC进程间通讯机制
- Android Manifest 用法
- [转载]Activity中ConfigChanges属性的用法
- Android之获取手机上的图片和视频缩略图thumbnails
- Android之使用Http协议实现文件上传功能
- Android学习笔记(二九):嵌入浏览器
- android string.xml文件中的整型和string型代替
- i-jetty环境搭配与编译
- android之定时器AlarmManager
- android wifi 无线调试
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- android 代码实现控件之间的间距
- android FragmentPagerAdapter的“标准”配置
- Android"解决"onTouch和onClick的冲突问题
- android:installLocation简析
- android searchView的关闭事件
- SourceProvider.getJniDirectories