您的位置:首页 > 移动开发 > Android开发

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属性的话就需要重写这个方法

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;
}}


实现效果如下:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android