自定义View中为什么需要重写onMeasure方法

 我来答
就烦条0o
2017-08-16 · 知道合伙人软件行家
就烦条0o
知道合伙人软件行家
采纳数:33315 获赞数:46493
从事多年系统运维,喜欢编写各种小程序和脚本。

向TA提问 私信TA
展开全部
onMeasure(int widthMeasureSpec, int heightMeasureSpec)方法的作用主要
是告诉父控件自己需要多少空间,主要的方法是setMeasuredDimension(width, height)
用于保存控件的大小,如果不调用将会报出异常。
重写后的自定义view:
[java] view plain copy
package com.example.callbacktest;
import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
public class myView extends View
{
private static final int DEFUALT_WIDTH = 200;
private static final int DEFUALT_HEIGHT = 100;
public myView(Context context) {
super(context);
}
public myView(Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
int width = measureDemission(DEFUALT_WIDTH,widthMeasureSpec);
int height = measureDemission(DEFUALT_HEIGHT,heightMeasureSpec);
setMeasuredDimension(width, height);
}
private int measureDemission(int defualtSize,int measureSpec) {
int result = defualtSize;
int mode = MeasureSpec.getMode(measureSpec);
int specSize = MeasureSpec.getSize(measureSpec);
//EXACTLY:使用母控件给出的确切的尺寸(specSize),
//确定的大小一般是由控件写好的:layout_widht = "50dp",layout_height = "50dp"
//或者使用的fill_parent,这两种情况都可以确定大小。
if(mode == MeasureSpec.EXACTLY)
{
result = specSize;
}
//AT_MOST:不能超过母控件所给出的尺寸(specSize)
//一般用于不能确定的小的时候,如wrap_content。
else if(mode == MeasureSpec.AT_MOST)
{
result = Math.min(result,specSize);
}
//UNSPECIFIED:表示显示的控件大小没有指定。
else if(mode == MeasureSpec.UNSPECIFIED)
{
result = defualtSize;
}
return result;
}
}
详细请看注释,由于此自定义控件没有内容,所以此处给出了默认值的大小DEFUALT_WIDTH,和DEFUALT_HEIGHT.。
在AT_MOST模式下一般你可以根据自定义控件内容的size来代替。
匿名用户
2017-08-15
展开全部
有三个构造方法(一个参数、两个参数、三个参数)
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式