首页 > 技术文章 > android 开发 View _15_canvas的裁剪clipPath,clipRect

guanxinjing 2018-08-03 17:01 原文

前言

  在自定义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);

    }

}

 

推荐阅读