原理很简单,在dispatchDraw方法绘制子View时先裁剪画布为圆角
/** * 圆角LinearLayout * Created by wanghaibo on 2018/6/28. */ public class CornersLinearLayout extends LinearLayout { private float round = 0f;//圆角半径像素值 public CornersLinearLayout(Context context) { super(context); } public CornersLinearLayout(Context context, AttributeSet attrs) { super(context, attrs); } public CornersLinearLayout(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } public void setRound(float round) { this.round = round; } @Override protected void dispatchDraw(Canvas canvas) { if (round > 0) { Path path = new Path(); RectF rectF = new RectF(getPaddingLeft(), getPaddingTop(), getWidth() - getPaddingRight(), getHeight() - getPaddingBottom()); path.addRoundRect(rectF, round, round, Path.Direction.CW); // 先对canvas进行裁剪 canvas.clipPath(path, Region.Op.INTERSECT); } super.dispatchDraw(canvas); } }