版权声明
本文来自博客园,作者:观心静 ,转载请注明原文链接:https://www.cnblogs.com/guanxinjing/p/9708589.html
本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
前言
在自定义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); } }
本文来自博客园,作者:观心静 ,转载请注明原文链接:https://www.cnblogs.com/guanxinjing/p/9708589.html
本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。