Android绘图-LOGO-实现2

首先对半圆的绘制考虑到之前版本并不能精确的满足绘制的要求(内圆和外圆并不一定是同心圆,用Path.FillType.EVEN_ODD来实现的话可能会产生多余的部分),要是能够像ps中单纯对路径进行相加相减就好了。所幸在Path中找到了一个Op的枚举类型(和FillType距离不远),最终就是用Path的这个属性完美的解决了这个问题

@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private void drawRing(Canvas canvas, Paint paint,float interX, float innerY,float outerX, float outerY,float startAngle,float sweepAngle,float inner_circle,float outter_circle) {

    Path outterpath = new Path();

    outterpath.moveTo(outerX, outerY);
    outterpath.lineTo(outerX, outerY - outter_circle);
    outterpath.arcTo(outerX - outter_circle, outerY - outter_circle, outerX + outter_circle, outerY + outter_circle, startAngle, sweepAngle, true);
    outterpath.lineTo(outerX, outerY);
    outterpath.close();

    Path innerpath = new Path();

    innerpath.moveTo(interX, innerY);
    innerpath.lineTo(interX, innerY - inner_circle);
    innerpath.arcTo(interX - inner_circle, innerY - inner_circle, interX + inner_circle, innerY + inner_circle, startAngle, -360, true);
    innerpath.lineTo(interX, innerY);
    innerpath.close();

    outterpath.op(innerpath,Path.Op.DIFFERENCE);
    canvas.drawPath(outterpath,paint);
}

最终整个动画由一个定时器控制速率,通过定时重绘View实现了整个动画,最后的退出动画是通过对画布操作完成的(对画布的操作必须在绘制之前)。

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);

    canvas.translate(TRACK1_OUTTER_CIRCLE * 1.5f, TRACK1_OUTTER_CIRCLE * 1.5f);
    scaleAnim(canvas);

    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
    paint.setStyle(Paint.Style.FILL);
    track1(canvas, paint);
    track2(canvas, paint);
    track3(canvas, paint);

    if(!isTimerRunning){
        mHandler.post(mRunnable);
        isTimerRunning = true;
    }else{
        mHandler.postDelayed(mRunnable, mFrameTime);
    }
    if(mFrameNumber>60){
        resetAnim();
    }
}
Loading Disqus comments...
Table of Contents