2015-02-20 2 views
0

Я пытаюсь разбить круг на что-то в этом роде: 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(); 
    } 



} 

Любая помощь на этом PLS?

ответ

0

Вы можете попробовать сделать это с холстом 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(); 

Drawing arc on Android

+0

, что удивительно, теперь вырезанная область находится говорят северо-западном углу, я хочу, чтобы получить его вниз (юг), а также Я хочу немного увеличить область красной зоны, как мне это сделать. Это намного больше, вы сохранили меня – GeekyCoder

+0

используйте «путь», чтобы построить треугольник внизу, что-то вроде этого: 'path.reset() ; path.lineTo (0, mRectF.height()); path.lineTo (x, mRectF.height()); path.lineTo (0, y); path.close(); 'изменение x и y для достижения эффекта желания , – andrew

+0

Я пробовал что-то вроде этого, чтобы образовать треугольник внизу, но не удачу path.lineTo (mRectF.width()/2f, -mRectF.width()/2f); path.lineTo (-mRectF.width()/2f, -mRectF.width()/2f); path.close(); – GeekyCoder

Смежные вопросы