//自定义测量值
private int measureWidth(int measureSpe){
int result=0;
int specMode=MeasureSpec.getMode(measureSpe);//从MeasureSpec中获取测量模式
int specSize=MeasureSpec.getSize(measureSpe);//从MeasureSpec中获取测量大小
if (specMode==MeasureSpec.EXACTLY){//精确模式(系统默认模式) ,即:如果我们为宽或者高指定固定值为xxdp时,或者match_parent 为该模式
result=specSize; //如果specMode为EXACTLY,直接指定即可
}else {
result=200; //如果specMode为其他两种模式时,它需要一个默认值,特别是如果指定宽高属性为wrap_content时(即,AT_MOST模式)需要我们取出我们测量值做一个计算,保证我们的控件小于父控件的最大值
if (specMode==MeasureSpec.AT_MOST){//最大值模式 ,当指定控制的宽或者高为wrap_content时,控制随子控件大小而变化,且不超过父控件最大值即刻
result=Math.min(result,specSize);
}
}
return result;
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
// super.onMeasure(widthMeasureSpec, heightMeasureSpec);
setMeasuredDimension(
measureWidth( widthMeasureSpec),
measureWidth( heightMeasureSpec));
}
//绘制
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Bitmap bitmap=BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher_background);
Paint paint=new Paint();
canvas.drawBitmap(bitmap,300,200,paint);
Canvas canvas1 = new Canvas(bitmap);
canvas1.drawArc(100,100,200,200,10,10,true,paint);//画在bitmap上
}
//ViewGroup 的测量
//当ViewGroup的宽高设置为warp_content时,VG(ViewGroup)就会对子view遍历,获取所以view的大小,决定自己的大小
//在自定义VG时候,通常重写onLayout控制其子view的位置,如果要支持wrap_content属性,还有重写onMeasure,这点与view是一样的
//ViewGroup的绘制
//如果不指定ViewGroup的背景色,ViewGroup的onDraw方法不回被调用,以disPathDraw来遍历子view