通过自定义View,我们可以画出一些简单的图形并进行应用。上一篇中我讲了自己对onDraw()方法的一些理解和运用,今天就来讲讲onMeasure()和onLayout()两个方法的理解和使用。在自定义View当中呢,我们对于onMeasure()和onLayout()方法基本上是不需要重写的,所以我这边新建了一个工程,自定义一个MyView2继承于ViewGroup,同样地它会自动提示添加一些构造方法,这些就不细说了,当然也包括其中什么Paint对象的实例化。
首先,讲一下onMeasure()方法,它呢,主要是用来确定子控件的规格的,何为规格?也就是大小和模式。下面是我重写的代码,根据代码来进行一下分析。
@Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); int viewGroupWidth = MeasureSpec.getSize(widthMeasureSpec) - getPaddingLeft() - getPaddingRight(); int viewGroupHeight = MeasureSpec.getSize(heightMeasureSpec) - getPaddingBottom() - getPaddingTop(); int viewCount = getChildCount(); for (int i = 0; i < viewCount; i++) { View view = getChildAt(i); int widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); view.measure(MeasureSpec.makeMeasureSpec(widthSize, MeasureSpec.AT_MOST), MeasureSpec.makeMeasureSpec(heightSize, MeasureSpec.AT_MOST)); } setMeasuredDimension(viewGroupWidth, viewGroupHeight); }
首先是onMeasure方法里面的两个参数,widthMeasureSpec和heightMeasureSpec,它们是父容器传给子容器的宽高规格,通过这两个参数的getSize()方法可以得到父容器的宽高&#