onDraw用来来描绘控件是什么样子的
onLayOut、onMeasure、onDraw我觉得调用时机应该是这样子的;
我是一个view,外部的父容器调用我layout,measure,draw方法,
触发我的onLayOut、onMeasure、onDraw方法
我可以再layOut中放置我的子控件的位置,可以再onMeasure中觉得我自身的大小,可以再onDraw中决定我自身的长相
package com.ymtj.test.myapplication; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Rect; import android.util.AttributeSet; import android.util.Log; import android.view.View; import android.view.ViewGroup; /** * Created by fei on 2015/10/22. */ public class MyViewGroup extends ViewGroup { // 子View的水平间隔 private final static int padding = 20; public MyViewGroup(Context context, AttributeSet attrs) { super(context, attrs); // TODO Auto-generated constructor stub } /** * 是ViewGroup的方法,用于定义这个子控件如何摆放 * @param changed * @param l * @param t * @param r * @param b */ @Override protected void onLayout(boolean changed, int l, int t, int r, int b) { // TODO Auto-generated method stub // 动态获取子View实例 for (int i = 0, size = getChildCount(); i < size; i++) { View view = getChildAt(i); // 放置子View,宽高都是100 view.layout(l, t, l + 100, t + 100); l += 100 + padding; } } /** * 当前这个容器测量的方法,接收这个容器的父亲传过来的可用空间,然后决定当前这个view的大小 * @param widthMeasureSpec * @param heightMeasureSpec */ @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { int wMode = MeasureSpec.getMode(widthMeasureSpec); int hMode = MeasureSpec.getMode(heightMeasureSpec); if(MeasureSpec.AT_MOST == hMode){ Log.i("main","出现1"); } if(MeasureSpec.EXACTLY == hMode){ Log.i("main","出现2"); } int widthMeasure = MeasureSpec.getSize(widthMeasureSpec); int heightMeasure = MeasureSpec.getSize(heightMeasureSpec); setMeasuredDimension(widthMeasure*4, heightMeasure*4); } /** * 描绘当前view的外观 * @param canvas */ @Override protected void onDraw(Canvas canvas) { // 首先定义一个paint Paint paint = new Paint(); // 绘制矩形区域-实心矩形 // 设置颜色 paint.setColor(Color.WHITE); // 设置样式-填充 paint.setStyle(Paint.Style.FILL); // 绘制一个矩形 canvas.drawRect(new Rect(0, 0, getWidth(), getHeight()), paint); // 绘空心矩形 // 设置颜色 paint.setColor(Color.RED); // 设置样式-空心矩形 paint.setStyle(Paint.Style.STROKE); // 绘制一个矩形 canvas.drawRect(new Rect(10, 10, 50, 20), paint); // 绘文字 // 设置颜色 paint.setColor(Color.GREEN); // 绘文字 canvas.drawText("hello", 30, 30, paint); // 绘图 // 从资源文件中生成位图 // Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.aa); // 绘图 // canvas.drawBitmap(bitmap, 10, 10, paint); super.onDraw(canvas); } }
<RelativeLayout android:padding="10dp" android:layout_height="100dp" android:layout_width="match_parent" xmlns:tools="http://schemas.android.com/tools" xmlns:android="http://schemas.android.com/apk/res/android"> <com.ymtj.test.myapplication.MyViewGroup android:layout_height="50dp" android:layout_width="match_parent" android:background="#0000ff"> <!-- <View android:layout_height="match_parent" android:layout_width="match_parent" android:background="#ff0000" /> <View android:layout_height="match_parent" android:layout_width="match_parent" android:background="#00ff00" />--> </com.ymtj.test.myapplication.MyViewGroup> </RelativeLayout>