前言
在自定义View中在正常绘制的情况下,我们的canvas都是正方形的。假如我们有需求将Canvas变成圆形或者三角形或者将一个图片裁剪成圆形。我们就需要使用Canvas提供的三个方法clipPath,clipOutPath,clipRect,clipOutRect来实现。其中clipOutPat与clipOutRecth是Android Api26以后提供的方法。之前的没什么区别。
简单的Demo
这里我们依靠裁剪来实现一个圆形的Canvas,请注意,这里有一个关键点,那就是裁剪clipPath一定最先执行的代码。不能在执行完其他绘制代码后在执行clipPath。另外自定义形状的裁剪使用clipPath,关键点是Path,如果你不太了解Path,建议你先了解它。
效果图:
代码:
public class ProgressView extends View {
private int mWidth;
private int mHeight;
private int mWavesHeight = 10;
public ProgressView(Context context) {
super(context);
}
public ProgressView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public ProgressView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public ProgressView(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
super.onMeasure(widthMeasureSpec, heightMeasureSpec);
mWidth = MeasureSpec.getSize(widthMeasureSpec);
mHeight = MeasureSpec.getSize(heightMeasureSpec);
setMeasuredDimension(mWidth, mHeight);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Path path = new Path();
path.addCircle(mWidth / 2, mHeight / 2, mWidth / 2, Path.Direction.CCW);
canvas.clipPath(path);//请注意,裁剪一定要最先执行,否则会无效
canvas.drawColor(Color.GREEN);
}
}