【问题标题】:android split the circle without taking the origin into considerationandroid在不考虑原点的情况下分割圆
【发布时间】:2015-02-20 16:15:37
【问题描述】:

我正在尝试将圆圈分割成这样的东西: 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();
    }



}

对此有什么帮助吗?

【问题讨论】:

    标签: android canvas drawable


    【解决方案1】:

    您可以尝试使用画布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();
    

    【讨论】:

    • 太棒了,现在剪切区域在说西北角,我想把它拉到底部(南),我也想增加一点红色区域的区域,我该怎么做都..再次感谢,你救了我
    • 使用path在底部构建三角形,如下所示:path.reset(); path.lineTo(0, mRectF.height());path.lineTo(x, mRectF.height());path.lineTo(0, y);path.close();改变x和y达到欲望效果。
    • 我试过这样的方法,在底部形成一个三角形,但没有运气 path.lineTo(mRectF.width()/2f,-mRectF.width()/2f); path.lineTo(-mRectF.width()/2f,-mRectF.width()/2f); path.close();
    • 为什么要用负值?使用上面的示例并设置x = mRectF.width() / 2fy = mRectF.height() / 2f
    猜你喜欢
    • 1970-01-01
    • 2013-11-13
    • 2015-02-28
    • 2013-08-22
    • 1970-01-01
    • 2016-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多