android 如何画不规则半圆

如图如何画,请大神看下
图片说明

画一个半圆,上面盖一个矩形,矩形向右移动实现你的效果

可以先画一个半面,然后设置左边不需要的部分的透明度为0

使用圆形view或者设置outline,然后直接画矩形就好,在outline之外的矩形部分是不可见的,所以不会有影响

感觉空白的方法应该可以

设置边框高度,移动另一侧边框位置

已经解决:Bezier曲线画的,如下:
private PointF mPointF1;

private PointF mControl;

private PointF touchPoint;

private float startAngle = 180;
private float sweepAngle = 60;
private float radius = 100;
private float LEFT = 100;
private float TOP = LEFT + radius;
private float RIGHT = 300;
private float BOTTOM = 400;
private RectF mRectF;
    private void init() {
    mPaint = new Paint();
    mPaint.setAntiAlias(true);
    mPaint.setStyle(Paint.Style.FILL);
    mPaint.setColor(Color.BLACK);
    mPath = new Path();
    mPointF1 = new PointF(LEFT, RIGHT);
    touchPoint = new PointF(0,0);
    mControl = new PointF(0,0);
    mRectF = new RectF(LEFT,TOP,RIGHT,BOTTOM);
}
        @Override
public boolean onTouchEvent(MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            touchPoint.x = event.getX();
            touchPoint.y = event.getY();
            float d = BOTTOM - radius - touchPoint.y;
            float l = touchPoint.x - LEFT - radius;
            Log.e("jyg","onTouchEvent,d="+d);
            Log.e("jyg","onTouchEvent,l="+l);
            float angle = (float)Math.toDegrees(Math.atan (d/l));
            Log.e("jyg","onTouchEvent,angle="+angle);
            if(angle < 0){
                sweepAngle = Math.abs(angle);
            } else if(angle < 180){
                sweepAngle = 180 - angle;
            }

            Log.e("jyg","onTouchEvent,touchPoint="+touchPoint);
            Log.e("jyg","onTouchEvent,sweepAngle="+sweepAngle);
            invalidate();
            break;
    }
    return true;
}

private Paint mPaint;

private Path mPath;

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    mPath.reset();
    draw1(canvas);
}

private void draw1(Canvas canvas) {
mPath.moveTo(mPointF1.x, mPointF1.y);
mPath.arcTo(mRectF,startAngle,sweepAngle);

    float xx,yy;
    xx = LEFT+radius - (float)(Math.cos(Math.toRadians(sweepAngle)) * radius);
    yy = BOTTOM - radius - (float) Math.sin(Math.toRadians(sweepAngle)) * radius;

    Log.e("jyg","xx="+xx);
    Log.e("jyg","yy="+yy);
    mControl.x = xx;
    mControl.y = yy;
    mPath.moveTo(mControl.x, mControl.y);
    mPath.lineTo(mControl.x,BOTTOM-radius);
    mPath.lineTo(mPointF1.x,mPointF1.y);
    canvas.drawPath(mPath, mPaint);
}