微信小程序为开发者提供了大量的 API。开发者通过 API 可以获得微信底层封装的高级特性, 同时可以很方便地调用微信提供的各种能力,例如网络请求、获取用户信息、本地存储等 能力。


学习目标:

  • 掌握 scroll-view 组件,能够完成视图区域的横向滚动或者纵向滚动
  • 掌握 slider 组件,能够运用 slider 组件完成滑动选择器的制作
  • 掌握 <include> 标签,能够运用 < include > 标签引用其他文件中的代码
  • 掌握背景音频 API,能够运用背景音频 API 实现音频后台播放、音频暂停等功能
  • 掌握录音 API,能够运用录音 API 实现录音功能
  • 掌握音频 API,能够运用音频 API 实现音频播放、暂停等功能
  • 掌握选择媒体 API,能够运用 wx.chooseMedia () 方法选择图片或视频
  • 掌握图片预览 APIreviewlmage () 方法预览图片
  • 掌握文件上传 API,能够实现将本地资源上传到服务器中
  • 能够运用 wx.downloadFile0) 方法实现资源文件的下载掌握文件下载 API
  • 掌握 canvas 组件,能够灵活运用 canvas 组件创建画布
  • 掌握画布 API,能够运用画布 API 完成图形的绘制

# 1.scroll-view

当一个容器中的内容有很多时,如果容器无法完整显示内容,则可以通过滚动操作来查看完整内容。

在微信小程序中,可以通过 scroll-view 组件来实现滚动效果,它支持横向滚动和纵向滚动, 默认是不滚动的, 需要通过 scroll-x 和 scroll-y 属性允许横向和纵向滚动。

scroll-view 组件的常用属性如下表所示:

属性类型说明
scroll-xboolean允许横向滚动,默认值为 false
scroll-yboolean允许纵向滚动,默认值为 false
scroll-topnumber/string设置竖向滚动条的位置,默认值为空
scroll-leftnumber/string设置横向滚动条的位置,默认值为空
scroll-into-viewstring当前可在哪个方向滚动,则在哪个方向滚动到该 元素。值为某子元素 id(id 不能以数字开头)
scroll-with-animationboolean在设置滚动条位置时是否使用动画过渡,默认值 为 false
bindscrolltouppereventhandle滚动到顶部 / 左边时触发的事件
bindscrolltolowereventhandle滚动到底部 / 右边时触发的事件
bindscrolleventhandle滚动时触发的事件

允许横向滚动、纵向滚动后, 还需要使 scroll- view 组件中内容的宽度和高度大于 scroll-view 组件本身的宽度和高度,这样才能滚动。

在实际开发中,由于 scroll-view 组件的默认宽度为 100%,会占满整个屏幕,所以当内容的宽度超出屏幕宽度显示范围时,即可横向滚动。

若要实现纵向滚动,则需要在样式中为 scroll-view 组件设置一个固定高度,否则 scroll-view 组件会被内容撑大,导致无法纵向滚动。

scroll-view 组件的使用案例:

①在 pages/index/index.wxml 文件中编写页面结构。

<scroll-view scroll-x="true" scroll-y="true" style="height: 200px;" bindscroll="scroll">  
    <view style="width: 200%; height: 400px; background-image: linear-gradient(to bottom right, red, yellow);">
    </view>
</scroll-view>
<!-- scroll-view 组件设置了允许横向滚动和纵向滚动。-->

②在 pages/index/index.js 文件中添加 scroll () 事件处理函数输出 e.detail 的值。

scroll: function (e) {
  console.log(e.detail)
}
// 通过 e.detail 获取滚动时的位置信息。

拖曳滚动条使 scroll () 函数执行,然后在控制台中查看输出结果如下图所示:

image-20240608190115198

e.detail 为自定义事件所携带的数据,下面对上图中获取到的信息进行讲解,具体如下。

  • scrollLeft:横向滚动条左侧到视图左边的距离。
  • scrollTop:纵向滚动条上端到视图顶部的距离。
  • scrollHeight:纵向滚动条在 Y 轴上最大滚动距离。
  • scrollWidth:横向滚动条在 X 轴上最大的滚动距离。
  • deltaX:横向滚动条的滚动状态。
  • deltaY:纵向滚动条的滚动状态。

# 2.slider 组件

在微信小程序中,通过 slider 组件可以定义一个滑动选择器。

slider 组件是微信小程序表单组件中的一种, 用于滑动选择某一个值。用户可以通过拖曳滑块在一个固定区间内进行选择。

slider 组件的常用属性如下表所示:

属性类型说明
minnumber最小值,默认值为 0
maxnumber最大值,默认值为 100
stepnumber步长,取值大于 0,可被 max-min 整除,默认值为 1
valuenumber当前取值,默认值为 0
activeColorcolor已选择的颜色,默认值为 #1aad19
backgroundColorcolor背景条的颜色,默认值为 #e9e9e9
block-sizenumber滑块的大小,取值范围为 12~28,默认值为 28
block-colorcolor滑块的颜色,默认值为 #ffffff
show-valueboolean是否显示当前值,默认值为 false
bindchangeeventhandle完成一次拖曳后触发的事件
bindchangingeventhandle拖曳过程中触发的事件

slider 组件的使用

①在 pages/index/index.wxml 文件中编写页面结构。

<slider bindchanging="sliderChanging" show-value="true" />
<!-- 当拖曳 slider 组件的滑块时,会执行 sliderChanging () 事件处理函数 -->
<!-- 通过设置 show-value 属性可将当前值显示出来 -->

②在 pages/index/index.js 文件中编写事件处理函数 sliderChanging ()。

sliderChanging: function (e){
  console.log(e.detail.value)
}
//e.detail.value 表示当前 slider 组件的值

保存代码后,会看到页面中显示了一个滑动选择器。拖曳滑块到 13 的页面效果

如下图所示:

image-20240608190317944

在控制台中可以看到 sliderChanging () 函数执行时输出的当前 slider 值如下图所示:

image-20240619101313690

# 3.<include> 标签

<include> 标签用于引用其他文件的代码, 相当于把引用的代码复制到 < include > 标签的位置。

<include> 标签的用途主要有以下两点,具体如下:

  • 当一个 WXML 页面中的代码过多时,会给代码的维护带来麻烦,有时为了找到某一处代码可能需要翻阅几百行。这时可以利用 <include> 标签将代码拆分到多个文件中,从而可以更方便地查找代码。
  • 当多个 WXML 页面中有相同的部分时,可以将这些公共部分抽取出来,保存到一个单独的 WXML 文件中,然后在用到的地方通过 <include> 标签引入。这样可以减少重复的代码,并且修改时只需要修改一次。

<include> 标签的使用案例:

假设在 index.wxml 文件中,页面的头部和尾部是公共部分,可将头部代码抽取到 header.wxml 文件中、尾部代码抽取到 footer.wxml 文件中,然后在 index.wxml 文件中使用标签进行引入。

  1. 在 pages/index/index.wxml 文件中编写页面结构。

    <!-- index.wxml -->
    <include src="header.wxml" />
    <view>body</view>
    <include src="footer.wxml" />
  2. 在 pages/index/header.wxml 文件中编写头部的页面结构

    <view>header</view>
  3. 在 pages/index/footer.wxml 文件中编写尾部的页面结构

    <view>footer</view>

    当上述代码运行后,实际得到的 pages/index/index.wxml 文件的页面结构如下所示

    <view>header</view>
    <view>body</view>
    <view>footer</view>

# 4. 背景音频 API

在微信小程序中,使用背景音频 API 可以实现音频的后台播放

在使用背景音频 API 前,需要在 app.json 文件中配置 requiredBackgroundModes 属性,开启微信小程序后台音频播放功能,示例代码如下。

"requiredBackgroundModes":  ["audio"]  //requiredBackgroundModes 属性值为数组类型,在数组中添加 audio 项表示开启后台音频播放功能。

背景音频 API 的使用方法如下:

第一步:通过 wx.getBackgroundAudioManager () 方法获取到一个 BackgroundAudioManager 实例;

var audioGbam =  wx.getBackgroundAudioManager()  //BackgroundAudioManager 实例

第二步:通过 BackgroundAudioManager 实例的相关属性和方法实现背景音频的播放。

BackgroundAudioManager 实例常用的属性和方法:

** 类型 **名称说明
属性src背景音频的数据源,默认值为空字符串,当设置了新的 src 时,会自动开始播放,目前支持的格式有 M4A、AAC、MP3、WAV
属性startTime背景音频开始播放的位置(单位:秒)
属性title背景音频标题,用于原生音频播放器的背景音频标题
属性playbackRate播放速率,范围 0.5∼2.00.5∼2.0 倍,默认值为 1 倍
属性duration当前背景音频的长度(单位:秒),只有在有合法 src 时有效(只读)
属性currentTime当前背景音频的播放位置(单位:秒),只有在有合法 src 时有效(只读)
属性paused当前是否暂停或停止(只读)
方法play()播放背景音频
方法pause()暂停背景音频
方法seek()跳转到指定位置
方法stop()停止背景音频
方法onCanplay()背景音频进入可以播放状态的事件(参数为回调函数)
方法onWaiting()监听背景音频加载中事件,当背景音频因为数据不足需要停下来加载时会触发
方法onError()监听背景音频播放错误事件
方法onPlay()监听背景音频播放事件
方法onPause()监听背景音频暂停事件
方法onSeeking()监听背景音频开始跳转操作事件
方法onSeeked()监听背景音频完成跳转操作事件
方法onEnded()监听背景音频自然播放结束事件
方法onStop()监听背景音频停止事件
方法onTimeUpdate()监听背景音频播放进度更新事件,只有微信小程序在前台时会回调

背景音频 API 的使用案例:

在 pages/index/index.js 文件中的 onReady () 函数中编写如下代码。

onReady: function () {    
      // 创建 BackgroundAudioManager 实例     
      var audio = wx.getBackgroundAudioManager()     
      // 当开始播放音乐时,输出调试信息     
      audio.onPlay(function () { console.log('开始播放') })   
      // 设置背景音频的标题     
      audio.title = '音乐标题'     
      // 设置背景音频的资源地址     
      audio.src = 'http://127.0.0.1:3000/1.mp3'  
  }

# 5. 录音 API

录音功能在日常生活中使用很广泛,使用该功能可以记录重要的工作内容、优美的歌声等。那么在微信小程序中如何实现录音功能呢?微信小程序为开发者提供了录音 API。

录音 API 的使用方法如下:

第一步:通过 wx.getRecorderManager () 方法获取到一个 RecorderManager 实例,该实例是一个全局唯一的录音管理器,用于实现录音功能;

var recorderManager =  wx.getRecorderManager()  //RecorderManager 实例

第二步:通过 RecorderManager 实例的方法实现录音功能。

RecorderManager 实例的常用方法如下表所示。

方法名称说明
start()开始录音
pause()暂停录音
resume()继续录音
stop()停止录音
onStart()监听录音开始事件
onResume()监听录音继续事件
onPause()监听录音暂停事件
onStop()监听录音结束事件
onFrameRecord监听已录制完指定帧大小的文件事件。如果设置了 frameSize, 则会回调此事件
onError()监听录音错误事件
onInterruptionBegin监听录音因为系统占用而被中断开始事件。以下场景会触发此事件:微信语音聊天、微信视频聊天,此事件触发后,录音会被暂停。pause 事件在此事件后触发
onInterruptionEnd监听录音中断结束事件。在收到 interruptionBegin 事件后,微信小程序内所有录音会暂停,收到此事件之后才可再次录音成功

录音 API 的使用案例:

在 pages/index/index.js 文件中的 onReady () 函数中编写如下代码。

// 获取全局唯一的录音管理器 RecorderManager  
var recorderManager =  wx.getRecorderManager()  
// 监听录音开始事件  
recorderManager.onStart(() => {     
    console.log('录音开始');  
})  
// 监听录音停止事件  
recorderManager.onStop(res => {     
    console.log('录音停止')     
    console.log(res.tempFilePath)  
})  // 开始录音  
recorderManager.start()  
// 5 秒后自动停止录音  
setTimeout(() => {     
    recorderManager.stop()  
}, 5000)

# 6. 音频 API

在微信小程序中,除了背景音频 API 可以实现播放音频的功能外,还可以通过音频 API 来播放音乐。

背景音频 API 与音频 API 的区别在于背景音频 API 支持后台播放,而音频 API 不支持后台播放。

音频 API 的使用方法如下:

第一步:通过 wx.createInnerAudioContext () 方法获取到一个 InnerAudioContext 实例;

var audioCtx =  wx.createInnerAudioContext()  //InnerAudioContext 实例

第二步:通过 InnerAudioContext 实例的属性和方法实现音频播放功能。

InnerAudioContext 实例常用的属性和方法与 BackgroundAudioManager 实例常用的属性和方法相同,但是 InnerAudioContext 实例没有 title 属性。InnerAudioContext 实例特有的属性和方法如下表所示

类型名称说明默认值
属性autoplay是否自动开始播放,默认值为 falsefalse
属性loop是否循环播放,默认值为 falsefalse
属性volume音量,范围 0∼10∼1 , 默认值为 11
方法destroy()销毁当前实例

音频 API 的使用案例:

// 创建 InnerAudioContext 实例  
var audioCtx =  wx.createInnerAudioContext()  
// 设置音频资源地址  
audioCtx.src =  'http://127.0.0.1:3000/1.mp3'  
// 当开始播放音频时,输出调试信息  
audioCtx.onPlay(() => {     
    console.log('开始播放')  
})  // 开始播放  audioCtx.play ()

# 7. 媒体 API

微信小程序提供了选择媒体 API,其用于选择图片或视频,一般用于上传头像、上传照片和上传视频等功能中。

通过调用 wx.chooseMedia () 方法即可使用选择媒体 API,该方法执行后,会提示用户拍摄图片或视频,或从手机相册中选择图片或视频。

wx.chooseMedia () 方法的常用选项如下表所示

选项类型说明
countnumber最多可以选择的文件个数,默认值为 9
mediaTypeArray.< string>文件类型,默认值为 ['image', 'video']
sourceTypeArray.< string>图片和视频选择的来源,默认值为 ['album', 'camera']
maxDurationnumber拍摄视频最长拍摄时间,单位秒。时间范围为 3~60 秒之间。 不限制相册,默认值为 10
camerastring仅在 sourceType 为 camera 时生效,可设置使用前置或后置 摄像头,默认值为 back
successfunction接口调用成功的回调函数
failfunction接口调用失败的回调函数
completefunction接口调用结束的回调函数(调用成功、失败都会执行)

mediaType 选项的合法值有 3 个:

  • image(只能拍摄图片或从相册选择图片);
  • video(只能拍摄视频或从相册选择视频);
  • mix(可同时选择图片和视频)。

sourceType 选项的合法值有 2 个:

  • album(从相册选择);
  • camera(使用相机拍摄)。

媒体 API 的使用:

  1. 在 pages/index/index.wxml 文件中编写页面结构

    <button bindtap="test">选择图片</button>

    为按钮绑定了 test () 函数

  2. 在 pages/index/index.js 文件中编写事件处理函数 test ()

    test: function () { 
        wx.chooseMedia({
            count: 9,	
            // 最多可以选择 9 个文件
            mediaType: ['image'],	
            // 文件类型为只能拍摄图片或从相册中选图片 s
            ourceType: ['album', 'camera'], 
            // 图片来源为从相册选择和使用相机拍摄 success (res) 
            {
            // 获取用户选择的文件
            const tempFilePath =res.tempFiles[0].tempFilePath
                       console.log(tempFilePath)
       }
     })
    }

# 8. 图片预览 API

微信小程序提供了图片预览 API,通过图片预览 API 可以预览图片,且在预览过程中用户可以进行保存图片、发送给朋友等操作。

通过调用 wx.previewImage () 方法即可使用预览图片 API。

wx.previewImage () 方法的常用选项如下表所示:

选项类型说明
urlsArray.< string>需要预览的图片链接,为必填项,默认值为 ""
showmenuboolean是否显示长按菜单,默认值为 true
currentstring当前显示图片的链接,默认值为 urls 的第一张
successfunction接口调用成功的回调函数
failfunction接口调用失败的回调函数
completefunction接口调用结束的回调函数(调用成功、失败都会执行)

urls 选项支持 http 或者 https 协议的网络图片地址,如果使用本地图片进行预览,会出现黑屏加载不出图片的情况。

通过 wx.previewImage () 方法预览图片:

  1. 在 pages/index/index.js 文件的 Page ({}) 中定义页面所需的数据。

    data: {
        url:'http://127.0.0.1:3000/tree.jpg'
    },

    定义了 url 属性,表示图片地址,该图片来自本地服务器

  2. 在 pages/index/index.wxml 文件中编写页面结构

    <image src="" bindtap="previewImage"

    为 image 组件绑定 tap 事件,事件处理函数为 previewImage () 函数, 点击按钮可实现图片的预览

  3. 在 pages/index/index.js 文件的 Page ({}) 中添加 previewImage () 函数,实现图片的预览

    previewImage() { 
        wx.previewImage({ 
            urls: [
                this.data.url	// 需要预览的图片链接列表
            ]
        })
    }

    运行程序,单击图片前后的对比如下图所示:

    image-20240619103622537

# 9. 文件上传 API

在生活中,经常需要进行文件上传操作,例如更改头像需要将新的头像上传到服务器中。微信小程序提供了文件上传 API,使用文件上传 API 可以在微信小程序中发起一个 POST 请求,将本地资源上传到服务器。通过调用 wx.uploadFile () 方法即可使用文件上传 API。

wx.uploadFile () 方法的常用选项:

选项类型说明
urlstring开发者服务器地址,该项为必填项
headerobjectHTTP 请求的 Header, Header 中不能设置 Referer
timeoutnumber超时时间,单位为毫秒
namestring文件对应的 key, 开发者在服务器端可以通过这个 key 获取文件的二进制内容,该项为必填项
filePathstring要上传的文件资源的路径(本地路径),该项为必填项
successfunction接口调用成功的回调函数
failfunction接口调用失败的回调函数
completefunction接口调用结束的回调函数(接口调用成功、失败都会执行)

文件上传 API 的使用案例:

wx.uploadFile({  
      filePath: '文件路径',   
      name: 'image',   
      url: 'http://127.0.0.1:3000/upload',   
      success: res => {    
          console.log(res)   
      }  
  })

# 10. 下载 API

在生活中,经常需要下载一些文件,例如将网络中某个参考资料下载到本地进行查看。

微信小程序提供了文件下载 API,使用文件下载 API 可以实现文件下载功能。通过调用 wx.downloadFile () 方法即可使用文件下载 API。

wx.downloadFile () 方法的常用选项如下表:

选项类型说明
urlstring下载资源 url, 该项为必填项
headerobjectHTTP 请求的 Header,Header 中不能设置 Referer
timeoutnumber超时时间,单位为毫秒
filePathstring指定文件下载后存储的路径(本地路径)
successfunction接口调用成功的回调函数
failfunction接口调用失败的回调函数
completefunction接口调用结束的回调函数(接口调用成功、失败都会执行)

文件下载 API 的使用案例:

wx.downloadFile({  
    url: 'http://127.0.0.1:3000/tree.jpg',   
    success: res => {    
        // 判断服务器响应的状态码    
        if (res.statusCode === 200) {     
            console.log(res.tempFilePath)    
        }   
    }  
})

# 11.canvas 组件

在 HTML 中,<canvas> 标签可用于图形的绘制,也可用于创建图片特效和动画。在微信小程序中,canvas 组件也起着类似作用,可用于自定义绘制图形,该组件支持 2D 和 WebGL 的绘图。

canvas 组件的常用属性如下表:

属性类型说明
typestring指定 canvas 组件的类型,支持 2D 和 WebGL
canvas-idstringcanvas 组件的唯一标识符,若指定了 type 属性则无须再指定该属性
disable-scrollboolean当在 canvas 中移动时且有绑定手势事件时,禁止屏幕滚动及下拉刷新,默认值为 false
bindtouchstarteventhandle手指触摸动作开始
bindtouchmoveeventhandle手指触摸后移动
bindtouchendeventhandle手指触摸动作结束
bindtouchcanceleventhandle手指触摸动作被打断,例如来电提醒,弹窗等
bindlongtapeventhandle手指长按 500 毫秒之后触发,触发了长按事件后进行移动不会触发屏幕的滚动
binderror Grilleventhandle当发生错误时触发 error 事件

canvas 组件的使用案例:

①在 pages/index/index.wxml 文件中编写页面结构。

<canvas id="myCanvas" type="2d"></canvas>  
<!-- 定义了 canvas 组件,用于创建画布。其中,type 属性值为 2d,表示使用 Canvas 2D 接口。 -->

②在 pages/index/index.wxss 文件中编写 canvas 组件的页面样式。

#myCanvas {     
    display: block;     
    width: 300px;     
    height: 150px;     
    position: relative;    
    border: 1px solid red;  
}

为了方便查看默认 canvas 组件的大小,设置了 1px 的红色实心边框,页面效果如下图所示。

image-20240608191216979

# 12. 画布 API

概念:通过 canvas 组件创建画布后,要想在画布中绘制图案,需要通过画布 API 来完成。

画布 API 的使用方法如下:

  1. 第一步:获取 Canvas 实例;
  2. 第二步:通过 Canvas 实例获取 RenderingContext(渲染上下文)实例;
  3. 第三步:通过 RenderingContext 实例的属性和方法完成绘图操作。

获取 Canvas 实例的示例代码如下:

wx.createSelectorQuery()  
.select('#myCanvas')             
// 页面中 & lt;canvas > 标签的 id  
.fields({ node: true, size: true })  
.exec(res => {     
    // 获取 Canvas 实例     
    const canvas = res[0].node     
    // 调用 getContext () 方法获取 RenderingContext 实例     
    const ctx = canvas.getContext('2d')  
    })

RenderingContext 实例的常用属性和方法如下表所示:

类型名称说明
属性width画布宽度
属性height画布高度
属性fillStyle设置或返回用于填充绘画的颜色、渐变或模式
属性strokeStyle设置描边颜色
属性lineWidth设置或返回当前的线条宽度
属性font设置或返回文本内容的当前字体属性
属性textBaseline设置或返回在绘制文本时使用的当前文本基线

方法表

类型名称说明
方法rect()创建矩形
方法fillRect()绘制 “被填充” 的矩形
方法strokeRect()绘制矩形(无填充)
方法clearRect()在给定的矩形内清除指定的像素
方法stroke()绘制已定义的路径
方法beginPath()开始创建一个路径
方法closePath()创建从当前点回到起始点的路径
方法moveTo()把路径移动到画布中的指定点,不创建线条
方法arc()创建一条弧线
方法rotate()以原点为中心顺时针旋转当前坐标轴。多次调用旋转的角度会叠加。原点可以用 translate () 方法修改,旋转角度为正数,顺时针旋转,否则逆时针旋转
方法translate()对当前坐标系的原点 (0,0) 进行变换。默认的坐标系原点为页面左上角
方法fillText()在画布上绘制被填充的文本
方法restore()恢复之前保存的绘图上下文
方法save()保存绘图上下文

Canvas 绘制的基本步骤

①在 pages/index/index.wxml 文件中编写页面结构。

<canvas  id="draw" type="2d"></canvas>  
<!-- 定义了 canvas 组件,用于创建画布。其中,type 属性值为 2d,表示使用 Canvas  2D 接口。-->

②在 pages/index/index.js 文件中编写代码获取 Canvas 实例。

onReady:  function () {
    wx.createSelectorQuery().select('#draw')   
    .fields({ node: true, size: true })   
     .exec(res => {    
        const canvas = res[0].node    
        const ctx = canvas.getContext('2d')    
        this.drawRect(ctx)    
        this.drawSmile(ctx)   
    }) 
},  
drawRect:  function (ctx) {   
    // 绘制矩形,在后面的步骤中实现  
},  
drawSmile:  function (ctx) {   
    // 绘制笑脸,在后面的步骤中实现  
}

③编写绘制矩形函数 drawRect ()。

drawRect:  function (ctx) {   
      ctx.fillStyle = 'rgba(0, 0, 200, 0.5)'   
    ctx.fillRect(10, 10, 150, 50)  
},

矩形的绘制效果如下图所示

image-20240608191626985

④接下来绘制笑脸,先把调用绘制矩形的方法注释起来。

// this.drawRect(ctx)

⑤编写绘制笑脸函数 drawSmile ()。

drawSmile: function (ctx) {   
      // 设置线条颜色为红色,线条宽度为 2px     
      ctx.strokeStyle = '#f00'     
      ctx.lineWidth = '2'   
      // 移动画笔坐标位置,绘制外部大圆    
      ctx.moveTo(160, 80)     
      ctx.arc(100, 80, 60, 0, 2 * Math.PI, true)   
      // 移动画笔坐标位置,绘制外部嘴巴线条     
      ctx.moveTo(140, 80)     
      ctx.arc(100, 80, 40, 0, Math.PI, false)  }             drawSmile: function (ctx) {
  原有代码……
  // 移动画笔坐标位置,绘制左眼圆圈
  ctx.moveTo(85, 60)
  ctx.arc(80, 60, 5, 0, 2 * Math.PI, true)
  // 移动画笔坐标位置,绘制右眼圆圈
  ctx.moveTo(125, 60)
  ctx.arc(120, 60, 5, 0, 2 * Math.PI, true)
  ctx.stroke()
}

笑脸的绘制效果如下图所示:

image-20240608191856755

更新于 阅读次数

请我喝[茶]~( ̄▽ ̄)~*

萝卜仔 微信支付

微信支付

萝卜仔 支付宝

支付宝