android自定义控件(七) onMeasure() 测量尺寸

原创 2012年03月27日 23:42:29

上次讲的自定义控件刷新点屏幕的任意地方都会刷新,而且在xml里自定义控件下面放一个textview的话,这个TextView是显示不出来的,不只这个,以前的几个自定义控件都是

为什么呢?今天来讲下onMeasure()

在自定义刷新控件的基础上重写onMeasure方法

根据上一篇自定义组件修改

注释在代码里

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    >
	<xue.test.CusView3
		android:id="@+id/cusview3"
		android:layout_width="wrap_content"
		android:layout_height="wrap_content"
		>
	</xue.test.CusView3>
	<TextView
	   android:layout_width="wrap_content"
	   android:layout_height="wrap_content"
	   android:text="我终于出现了" />
</LinearLayout>

这里的TextView无法显示,想要显示的话,要测量控件的大小

public class CusView3 extends View {

	private int color = 0;
	private String text = "点击我刷新";
	private Paint mPaint;
	private int mAscent;

	public CusView3(Context context, AttributeSet attrs) {
		super(context, attrs);
		mPaint = new Paint();
		mPaint.setStyle(Style.FILL);
		mPaint.setTextSize(35.0f);
		setPadding(20, 60, 0, 0); //设置padding
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		if (color > 2) {
			color = 0;
		}
		switch (color) {
		case 0:
			mPaint.setColor(Color.GREEN);
			break;
		case 1:
			mPaint.setColor(Color.RED);
			break;
		case 2:
			mPaint.setColor(Color.BLUE);
			break;

		default:
			break;
		}

		canvas.drawText(text, getPaddingLeft(), getPaddingTop(), mPaint);
	}

	public void changeColor() {
		color++;
	}

	/**
	 * 比onDraw先执行
	 * 
	 * 一个MeasureSpec封装了父布局传递给子布局的布局要求,每个MeasureSpec代表了一组宽度和高度的要求。
	 * 一个MeasureSpec由大小和模式组成
	 * 它有三种模式:UNSPECIFIED(未指定),父元素部队自元素施加任何束缚,子元素可以得到任意想要的大小;
	 *              EXACTLY(完全),父元素决定自元素的确切大小,子元素将被限定在给定的边界里而忽略它本身大小;
	 *              AT_MOST(至多),子元素至多达到指定大小的值。
	 * 
	 *   它常用的三个函数:   
	 * 1.static int getMode(int measureSpec):根据提供的测量值(格式)提取模式(上述三个模式之一)
	 * 2.static int getSize(int measureSpec):根据提供的测量值(格式)提取大小值(这个大小也就是我们通常所说的大小) 
	 * 3.static int makeMeasureSpec(int size,int mode):根据提供的大小值和模式创建一个测量值(格式)
	 */
	@Override
	protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
		setMeasuredDimension(measureWidth(widthMeasureSpec), measureHeight(heightMeasureSpec));
	}

	private int measureWidth(int measureSpec) {
		int result = 0;
		int specMode = MeasureSpec.getMode(measureSpec);
		int specSize = MeasureSpec.getSize(measureSpec);

		if (specMode == MeasureSpec.EXACTLY) {
			// We were told how big to be
			result = specSize;
		} else {
			// Measure the text
			result = (int) mPaint.measureText(text) + getPaddingLeft() + getPaddingRight();
			if (specMode == MeasureSpec.AT_MOST) {
				// Respect AT_MOST value if that was what is called for by
				// measureSpec
				result = Math.min(result, specSize);// 60,480
			}
		}

		return result;
	}

	private int measureHeight(int measureSpec) {
		int result = 0;
		int specMode = MeasureSpec.getMode(measureSpec);
		int specSize = MeasureSpec.getSize(measureSpec);

		mAscent = (int) mPaint.ascent();
		if (specMode == MeasureSpec.EXACTLY) {
			// We were told how big to be
			result = specSize;
		} else {
			// Measure the text (beware: ascent is a negative number)
			result = (int) (-mAscent + mPaint.descent()) + getPaddingTop() + getPaddingBottom();
			if (specMode == MeasureSpec.AT_MOST) {
				// Respect AT_MOST value if that was what is called for by
				// measureSpec
				result = Math.min(result, specSize);
			}
		}
		return result;
	}
}
效果图

代码 http://download.csdn.net/detail/ethan_xue/4178423

Android TextView重写onMeasure和onDraw显示无拉伸图片(含实现代码链接)

1. 摘要:         论坛上遇到个小伙伴求助,“如何防止Android的TextView背景图片被拉伸”。搜到了一篇博客《Android TextView里直接显示图片的三种方法》[1]。方...
  • afunx
  • afunx
  • 2017年04月08日 22:27
  • 1263

Android 关于自定义TextView的测量

1.如何测文本的宽度 Paint mPaint = new Paint(Paint.ANTI_ALIAS_FLAG); mPaint.setTextSize(mTextSize); priv...
  • lovoo
  • lovoo
  • 2016年04月23日 09:34
  • 242

Android 获取textView高度的N种方式

TextView在绘制完成之前不管是getHeight方法还是getMeasuredHeight方法拿到的都是0.然而有些地方需要在TextView绘制完毕后就拿到TextView的高度甚至行数,本文...
  • lvshaorong
  • lvshaorong
  • 2016年04月06日 20:09
  • 10559

Android中测量控件的宽和高

前言:在Android开发中,有时候我们需要测量控件的宽和高,而直接调用getHeight(),getWidth(),getMeasureHeight(),getMeasureWidth()方法, ...
  • listeners_Gao
  • listeners_Gao
  • 2016年03月28日 02:19
  • 3370

Android自定义控件系列七:详解onMeasure()方法中如何测量一个控件尺寸(一)

详细研究Android中自定义控件中用到的measure/onMeasure方法是如何实现测量控件大小,如何传递参数的。...
  • cyp331203
  • cyp331203
  • 2015年04月13日 18:02
  • 13970

Android自定义控件之onMeasure

在自定义view的时候,其实很简单,只需要知道3步骤: 1.测量——onMeasure():决定View的大小 2.布局——onLayout():决定View在ViewGroup中的位置 3.绘制——...
  • hudashi
  • hudashi
  • 2016年03月16日 18:06
  • 3213

Android自定义View(三、深入解析控件测量onMeasure)

转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51468648 本文出自:【openXu的博客】 目录:onMeasure什么...
  • u010163442
  • u010163442
  • 2016年05月24日 14:59
  • 20934

如何在onCreate中测量View的实际宽高

通常在实际开发中,为了适配,我们会把View设置为match_parent或者wrap_content、又或者是设置weight权重来分配宽高,而不是使用具体值。那么就出现一个问题了,如果动态测量Vi...
  • maxwell_nc
  • maxwell_nc
  • 2015年10月21日 13:49
  • 1753

带着问题学习Android中View的measure测量

在进行研究measure原理之前,我们先带着这三个问题来想想。因为我是遇到这三个问题才开始研究measure的源码,所以我也把下面的三个问题当做引子。 调用measure(int widthMeasu...
  • Mr_dsw
  • Mr_dsw
  • 2016年01月13日 14:48
  • 3577

Android View 测量流程(Measure)完全解析

本篇文章主要内容是:详细讲述View的测量(Measure)流程,主要以源码的形式呈现...
  • a553181867
  • a553181867
  • 2016年05月24日 22:15
  • 11555
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:android自定义控件(七) onMeasure() 测量尺寸
举报原因:
原因补充:

(最多只允许输入30个字)