观心静

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

版权声明

本文来自博客园,作者:观心静 ,转载请注明原文链接: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);

    }

}

 

posted on 2018-08-03 17:01  观心静  阅读(1664)  评论(0编辑  收藏  举报