android 不考虑原点分割圆

android split the circle without taking the origin into consideration

我正在尝试将圆圈拆分成这样的东西: http://i.stack.imgur.com/hNg3E.png 我想用透明色为圆的主要圆弧部分着色,用黑色为圆的次要圆弧着色。这是我尝试过的,但无法达到最终目标:

public class SplitCircleDrawable extends Drawable {

    private final Bitmap mBitmap;

    private final Paint mPaint;

    private final Paint mBackGroundPaint,mTransparentPaint;



    private final RectF mRectF;

    private final int mBitmapWidth;

    private final int mBitmapHeight;

    private Context mCtx;


    public SplitCircleDrawable(Bitmap bitmap, Context mContext) {

        mCtx = mContext;
        mBitmap=bitmap;
        mRectF = new RectF();
        mPaint = new Paint();
        mBackGroundPaint = new Paint();
        mTransparentPaint=new Paint();
        mBackGroundPaint.setColor(0x97021829);
        mTransparentPaint.setColor(Color.TRANSPARENT);
        mBackGroundPaint.setDither(true);
        mBackGroundPaint.setAntiAlias(true);

        mPaint.setAntiAlias(true);
        mPaint.setDither(true);
        final BitmapShader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
        mPaint.setShader(shader);

        // NOTE: we assume bitmap is properly scaled to current density
        mBitmapWidth = mBitmap.getWidth();
        mBitmapHeight = mBitmap.getHeight();
    }


    @Override
    public void draw(Canvas canvas) {
        canvas.drawOval(mRectF, mPaint);
        canvas.drawArc(mRectF, 0, 180, false, mBackGroundPaint);
//        canvas.drawArc(mRectF, 0, 45, true, mTransparentPaint);
//        canvas.drawArc(mRectF, 45, 135, true, mBackGroundPaint);
//        canvas.drawArc(mRectF, 135, 180, true, mTransparentPaint);
    }

    @Override
    protected void onBoundsChange(Rect bounds) {
        super.onBoundsChange(bounds);

        mRectF.set(bounds);
    }

    @Override
    public void setAlpha(int alpha) {
        if (mPaint.getAlpha() != alpha) {
            mPaint.setAlpha(alpha);
            invalidateSelf();
        }
    }

    @Override
    public void setColorFilter(ColorFilter cf) {
        mPaint.setColorFilter(cf);
    }

    @Override
    public int getOpacity() {
        return PixelFormat.TRANSLUCENT;
    }

    @Override
    public int getIntrinsicWidth() {
        return mBitmapWidth;
    }

    @Override
    public int getIntrinsicHeight() {
        return mBitmapHeight;
    }

    public void setAntiAlias(boolean aa) {
        mPaint.setAntiAlias(aa);
        invalidateSelf();
    }

    @Override
    public void setFilterBitmap(boolean filter) {
        mPaint.setFilterBitmap(filter);
        invalidateSelf();
    }

    @Override
    public void setDither(boolean dither) {
        mPaint.setDither(dither);
        invalidateSelf();
    }



}

请问有什么帮助吗?

您可以尝试使用 canvas clipPath():

    // First we draw draw backgroudn, it should be cropped with path too
    canvas.drawOval(mRectF, paintBackground);

    // Creating path that will cover small area on the circle, 
    // it might be triangle or rectancel or what ever. 
    // Currently it is triangle between top and left rect centers.
    path.reset();
    path.moveTo(0, 0);
    path.lineTo(0, mRectF.width() / 2f);
    path.lineTo(mRectF.height() / 2f, 0);
    path.close();

    // Clipping canvas to path and drawing small area
    canvas.save();
    canvas.clipPath(path);
    canvas.drawOval(mRectF, paintArc);
    canvas.restore();