安卓方法DrawArc()用于在画布上绘制圆弧,主要方法是通过指定圆弧所在的椭圆对象、起始角度、终止角度来实现。
1. 基本语法:
public void drawArc (RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)
参数说明
oval:圆弧所在的椭圆对象。
startAngle:圆弧的起始角度。
sweepAngle:圆弧的角度。
useCenter:是否显示半径连线,true表示显示圆弧与圆心的半径连线,false表示不显示。
paint:绘制时所使用的画笔。
注意:Rect类使用需要小心,详见文末附注。
2. 示例
以下代码示范了如何在画布上绘制圆弧:
protected void onDraw(Canvas canvas) { // TODO Auto-generated method stub super.onDraw(canvas); paint.setAntiAlias(true); //设置画笔为无锯齿 paint.setColor(Color.BLACK); //设置画笔颜色 canvas.drawColor(Color.WHITE); //白色背景 paint.setStrokeWidth((float) 3.0); //线宽 paint.setStyle(Style.STROKE); RectF oval=new RectF(); //RectF对象 oval.left=100; //左边 oval.top=100; //上边 oval.right=400; //右边 oval.bottom=300; //下边 canvas.drawArc(oval, 225, 90, false, paint); //绘制圆弧 //RectF oval=new RectF(); //RectF对象 oval.left=100; //左边 oval.top=400; //上边 oval.right=400; //右边 oval.bottom=700; //下边 canvas.drawArc(oval, 200, 135, true, paint); //绘制圆弧 }
代码中,首先设置了Paint画笔的颜色,并设置Canvas画布为白色背景。接着设置画笔的线宽以及空心效果。然后,定义一个RectF对象,并设置了坐标,调用drawArc方法绘制第一个圆弧,此处设置为不显示半径连线。最后,重新设置了RectF对象坐标,调用drawArc方法绘制第二个圆弧,此例显示半径连线。运行代码,可在手机屏幕上看到下图图所示显示效果。
---------------
附注:
Android中的Rect类——奇葩的思维
最近在工作中遇到了一些问题,总结下来就是Android中Rect这个类造成的。不得不说,不知道Android SDK的开发人员是怎么想的, 这个类设计的太奇葩了。首先介绍一下Rect类:Rect类主要用于表示坐标系中的一块矩形区域,并可以对其做一些简单操作。这块矩形区域,需要用左上右下两个坐标点表示(left,top,right,bottom),你也可以获取一个Rect实例的Width和Height。就在这里,奇葩的事情来了,作为一个有一点经验的做图像或者矩阵运算或者编程的程序员来说,大家的共识是,如果一个矩阵是MxN的,也就是M行N列,那么行号是[0,M-1],列号是[0,N-1]。可是奇葩的Rect类并不是这样的!如果你这么声明一个Rect类:
Rect rect=new Rect(100,50,300,500);那么右下角(300,500)其实是不在这个矩形里面的,但是左上角(100,50)在,也就是说,这个矩形实际表示的区域是:(100,50,299,499)。另外,Rect计算出的Height和Width倒是对的。所以,在此告诫各位程序员,在涉及Rect运算的时候,尽量不要使用它的右下角左边,即right和bottom。因为他们是错的。当然,在你调用android自己的函数时,是可以使用的,因为Android里面一直保持这么奇葩的思维。
public void drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)
oval :指定圆弧的外轮廓矩形区域。
startAngle: 圆弧起始角度,单位为度。
sweepAngle: 圆弧扫过的角度,顺时针方向,单位为度。
useCenter: 如果为True时,在绘制圆弧时将圆心包括在内,通常用来绘制扇形。
paint: 绘制圆弧的画板属性,如颜色,是否填充等。
本例演示了drawArc的四种不同用法,
1. 填充圆弧但不含圆心:
mPaints[0] = new Paint();
mPaints[0].setAntiAlias(true);
mPaints[0].setStyle(Paint.Style.FILL);
mPaints[0].setColor(0x88FF0000);
mUseCenters[0] = false;
2. 填充圆弧带圆心(扇形)
mPaints[1] = new Paint(mPaints[0]);
mPaints[1].setColor(0x8800FF00);
mUseCenters[1] = true;
3. 只绘圆周,不含圆心
mPaints[2] = new Paint(mPaints[0]);
mPaints[2].setStyle(Paint.Style.STROKE);
mPaints[2].setStrokeWidth(4);
mPaints[2].setColor(0x880000FF);
mUseCenters[2] = false;
4. 只绘圆周,带圆心(扇形)
mPaints[3] = new Paint(mPaints[2]);
mPaints[3].setColor(0x88888888);
mUseCenters[3] = true;