开发者社区
社区提问意见反馈
开发者钉组织
扫描二维码
加入支付宝开发者钉组织
基础 api
基础
应用级事件
界面
导航栏
tabbar
路由
交互反馈
下拉刷新
联系人
选择城市
选择日期
动画
画布
canvas
canvasrenderingcontext2d
canvaspattern
offscreencanvas
旧版接口(停止更新)
地图
计算路径
键盘
滚动
节点查询
选项选择器
级联选择
设置窗口背景
设置页面是否支持下拉
字体
跳转
多媒体
缓存
文件
位置
网络
设备
worker
数据安全
分享
收藏
自定义通用菜单
更新管理
web-view组件控制
升级支付宝最新版本
隐私信息授权
小程序广告
开放能力 api
开发 > api > 基础 api > 界面 > 画布 > canvasrenderingcontext2d > canvasrenderingcontext2d.clip
收藏
订阅更新
我的文档
设置

canvasrenderingcontext2d.clip(string fillrule)

基础库  或更高版本; 若版本较低,建议采取 兼容处理

小程序开发者工具: 支持。 path2d 需要 ide 3.8.2 及以上版本支持。

主体: 企业支付宝小程序个人支付宝小程序

使用当前路径,或指定的 path2d 路径剪切画布。

剪切之后,所有的绘图都将限制在被剪切的区域内。可以在使用 clip 方法前通过使用 save 方法对当前画布区域进行保存,并在以后的任意时间通过 restore 方法对其进行恢复。

此 api 支持两种用法:

canvasrenderingcontext2d.clip(string fillrule)

canvasrenderingcontext2d.clip(path2d path, string fillrule)

效果示例

代码示例执行效果

原图

裁剪后

path2d path

指定裁剪的路径。可选。不传将使用当前路径裁剪画布。ide 3.8.2 及以上版本支持。

string fillrule

填充规则,用于判断一个点是否在路径内。可选,默认为 nonzero。
枚举值描述兼容性
nonzero-
evenodd-
使用当前路径裁剪画布
使用指定 path2d 路径裁剪画布
填充路径
.js
.axml
page({
    oncanvasready() {
        my.createselectorquery().select('#canvas').node().exec((res) => {
            const canvas = res[0].node
            const ctx = canvas.getcontext('2d')
            let img = canvas.createimage()
            img.src = 'https://mdn.alipayobjects.com/huamei_esgcm9/afts/img/a*vlkfqkogboqaaaaaaaaaaaaadsajaq/original'
            img.onload = () => {
                ctx.save()
                ctx.beginpath()
                // 构造圆形路径
                ctx.arc(145, 75, 60, 0, 2 * math.pi)
                // 使用圆形路径剪切画布
                ctx.clip()
                ctx.beginpath()
                // 构造方形路径
                ctx.rect(95, 25, 100, 100)
                // 使用方形路径再次剪切画布
                ctx.clip()
        
                // 画支付宝 logo,绘制将限制在裁剪区域内
                ctx.drawimage(img, 85, 10, 130, 130)
                
                // 恢复保存的绘图上下文,后续绘制不再限于剪切区域
                ctx.restore()
            }
        })
    },
})
<canvas id="canvas" type="2d" onready="oncanvasready">canvas>
.js
.axml
page({
    oncanvasready() {
        my.createselectorquery().select('#canvas').node().exec((res) => {
            const canvas = res[0].node
            const ctx = canvas.getcontext('2d')
            // 圆形路径
            let p1 = ctx.createpath2d()
            p1.arc(145, 75, 60, 0, 2 * math.pi)
            // 方形路径
            let p2 = ctx.createpath2d()
            p2.rect(95, 25, 100, 100)
            let img = canvas.createimage()
            img.src = 'https://mdn.alipayobjects.com/huamei_esgcm9/afts/img/a*vlkfqkogboqaaaaaaaaaaaaadsajaq/original'
            img.onload = () => {
                ctx.save()
                ctx.clip(p1)
                ctx.clip(p2)
        
                // 画支付宝 logo,绘制将限制在裁剪区域内
                ctx.drawimage(img, 85, 10, 130, 130)
                
                // 恢复保存的绘图上下文,后续绘制不再限于剪切区域
                ctx.restore()
            }
        })
    },
})
<canvas id="canvas" type="2d" onready="oncanvasready">canvas>
.js
.axml
page({
    oncanvasready() {
        my.createselectorquery().select('#canvas').node().exec((res) => {
            const canvas = res[0].node
            const ctx = canvas.getcontext('2d')
            let img = canvas.createimage()
            img.src = 'https://mdn.alipayobjects.com/huamei_esgcm9/afts/img/a*vlkfqkogboqaaaaaaaaaaaaadsajaq/original'
            img.onload = () => {
                ctx.save()
                ctx.beginpath()
                ctx.moveto(90, 70)
                ctx.lineto(130, 30)
                ctx.lineto(120, 100)
                ctx.lineto(90, 20)
                ctx.lineto(150, 80)
                ctx.closepath()
                ctx.clip('nonzero')
                ctx.