天天看点

Android Api Demos登顶之路(六十七)Graphics-->Arcs

Canvas提供了drawArc来绘制圆弧。

public void drawArc(RectF oval, float startAngle, float sweepAngle, boolean useCenter, Paint paint)

oval :指定圆弧的外轮廓矩形区域。

startAngle: 圆弧起始角度,单位为度。

sweepAngle: 圆弧扫过的角度,顺时针方向,单位为度。

useCenter: 如果为True时,在绘制圆弧时将圆心包括在内,通常用来绘制扇形。

paint: 绘制圆弧的画板属性,如颜色,是否填充等。

本例演示了drawArc的四种不同用法:

1.填充圆弧但不含圆心、

2.填圆弧含圆心(扇形)

3.绘制圆周但不含圆心

4.绘制圆周含圆心(扇形)

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new SampleView(this));
    }

    private class SampleView extends View{
        //定义绘制四种圆弧时使用的不同画笔
        private Paint[] mPaints;
        //定义绘制边框时的画笔
        private Paint mFramePaint;
        //是否包含圆心
        private boolean[] mUseCenter;
        //定义绘制四种圆弧时的边框
        private RectF mOvals[];
        //定义绘制大圆弧时的边框
        private RectF mBigOval;
        //定义起始的角度和圆弧扫过的角度
        private float mStart;
        private float mSweep;
        private int mBigIndes;

        //定义角度和扫过的角度的变化幅度
        private static final float START_INC=;
        private static final float SWEEP_INC=;
        public SampleView(Context context) {
            super(context);

            mPaints=new Paint[];
            mUseCenter=new boolean[];
            mOvals=new RectF[];

            //定义第一种画笔,用88%透明度的红色填充,不包含圆心
            mPaints[]=new Paint();
            mPaints[].setAntiAlias(true);
            mPaints[].setStyle(Paint.Style.FILL);
            mPaints[].setColor();
            mUseCenter[]=false;
            //定义第二种画笔,用88%透明度的绿色填充,包含圆心
            mPaints[]=new Paint(mPaints[]);
            mPaints[].setColor();
            mUseCenter[]=true;
            //定义第三种画笔,用88%透明度的蓝色绘制圆周,不包含圆心
            mPaints[]=new Paint(mPaints[]);
            mPaints[].setStyle(Paint.Style.STROKE);
            mPaints[].setStrokeWidth();
            mPaints[].setColor();
            mUseCenter[]=false;
            //定义第四种画笔,用88%透明度的灰色绘制圆周,包含圆心
            mPaints[]=new Paint(mPaints[]);
            mPaints[].setColor();
            mUseCenter[]=true;

            //定义绘制包含圆弧的边框
            //大圆弧的边框
            mBigOval=new RectF(, , , );
            //四个小圆弧边框
            mOvals[]=new RectF(, , , );
            mOvals[]=new RectF(, , , );
            mOvals[]=new RectF(, , , );
            mOvals[]=new RectF(, , , );

            //定义绘制边框的画笔
            mFramePaint=new Paint();
            mFramePaint.setAntiAlias(true);
            mFramePaint.setStyle(Paint.Style.STROKE);
            //设置空心线宽
            mFramePaint.setStrokeWidth();
        }

        //重写ondraw方法绘制图形
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            canvas.drawColor(Color.WHITE);
            //绘制大的圆弧和边框
            drawArcs(canvas,mBigOval,mUseCenter[mBigIndes],mPaints[mBigIndes]);
            //绘制小的圆弧和边框
            for(int i=;i<mOvals.length;i++){
                drawArcs(canvas, mOvals[i], mUseCenter[i], mPaints[i]);
            }

            mSweep+=SWEEP_INC;
            //当绘制完整个圆形后,在新的位置重新开始绘制另一个圆弧
            if(mSweep>){
                mSweep-=;
                mStart+=START_INC;
                if(mStart>){
                    mStart-=;
                }
                mBigIndes=(mBigIndes+)%mOvals.length;
            }
            invalidate();
        }

        //绘制边框的圆弧
        private void drawArcs(Canvas canvas, RectF oval, boolean useCenter,
                Paint paint) {
            //绘制边框
            canvas.drawRect(oval, mFramePaint);
            //绘制圆弧
            canvas.drawArc(oval, mStart, mSweep, useCenter, paint);
        }

    }
}