ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

哈基米“点图播放”

哈基米“点图播放”

前两天用微信小程序的云开发做了个玩意儿:点一下哈基米,它就叫一声;再点一下,闭嘴;再点,又叫。中间折腾了一会儿,把过程写下来。

云开发解决了一个大麻烦

微信小程序有个硬性限制:主包不能超过 2M。

一开始我想着直接把图片、音频丢项目里算了,结果还没放几张图,包体积就快爆了。这就好比你出门旅游,行李箱就那么大,非要把棉被枕头锅碗瓢盆全塞进去,最后拉链都拉不上。

用云开发就不一样了:把素材传到云存储,小程序里只放个网络地址。相当于你把东西寄存到酒店前台,行李箱里只留一张取件码,轻装上阵。

所以这个案例的核心不是图片也不是音频,而是云开发的用法。

最终效果

  • 页面上趴着一张哈基米

  • 点一下 → 哈基米开始叫

  • 再点一下 → 闭嘴

  • 再点 → 继续叫

  • 控制台还会实时播报:当前叫到哪了、叫得多快

本质上就是个图片版的播放/暂停开关,但配上哈基米就莫名喜感。

开始动手

1. 新建项目

打开微信开发者工具:

  • 项目名称:随便,我就叫“图片与声音”

  • 后端服务:不使用云服务(没关系,云开发是后开的)

  • 模板:不使用模板

建完得到一个光秃秃的空项目。

2. 上传素材到云存储

进云开发控制台 →存储→ 先创建存储桶(没有桶你往哪儿装)。

然后建两个文件夹:

  • images→ 把mao.jpg丢进去

  • audios→ 把hajimi.mp3丢进去

3. 改权限

进存储权限标签页,选:

所有用户可读,仅创建者可读写

要是免费账号选不了这项,那就保持默认的“仅创建者可读写”。不过这种情况拿到的链接是带签名的,过一段时间会失效,到时候你得重新复制一遍。这就好比你拿的是临时门禁卡,过阵子就得去前台续一下。

4. 复制文件地址

回到存储管理:

  1. 点一下mao.jpg→ 右边弹出详情 → 复制“下载地址”

  2. 再点hajimi.mp3→ 复制它的“下载地址”

这俩地址一会儿要粘到代码里,别搞混了。

代码部分(直接抄)

app.json

json { "pages": [ "pages/index/index" ], "window": { "backgroundTextStyle": "light", "navigationBarBackgroundColor": "#fff", "navigationBarTitleText": "图片与声音", "navigationBarTextStyle": "black" }, "renderer": "webview", "style": "v2", "sitemapLocation": "sitemap.json" }

app.wxss

css /**app.wxss**/ .container { display: flex; flex-direction: column; align-items: center; box-sizing: border-box; } pages/index/index.json json { "usingComponents": {}, "navigationStyle": "custom" }

pages/index/index.wxml

html <!-- index.wxml --> <navigation-bar title="图片与声音" back="{{false}}" color="black" background="#FFF"></navigation-bar> <view class="container"> <view class="title">哈基米</view> <!-- 点图片触发 sing 事件 --> <image src="{{imgSrc}}" mode="widthFix" bind:tap="sing" /> </view>

pages/index/index.wxss

css /**index.wxss**/ page { height: 100vh; display: flex; flex-direction: column; }

pages/index/index.js

javascript // index.js let innerAudioContext; let start = false; // 控制播放/暂停状态 Page({ data: { // 把这里换成你自己云存储里的图片地址 imgSrc: '你的图片下载地址' }, onLoad() { // 创建音频上下文 innerAudioContext = wx.createInnerAudioContext(); // 把这里换成你自己云存储里的音频地址 innerAudioContext.src = '你的音频下载地址'; // 设成 1.5 倍速,声音快一点,但不会变粗 innerAudioContext.playbackRate = 1.5; }, sing() { start = !start; if (start == true) { innerAudioContext.play(); console.log("当前音频的播放位置:", innerAudioContext.currentTime); console.log("当前音频播放速率:", innerAudioContext.playbackRate); } else { innerAudioContext.pause(); console.log("当前音频的播放位置:", innerAudioContext.currentTime); console.log("当前音频播放速率:", innerAudioContext.playbackRate); } } })

顺手加的两个小功能

做完基础版之后,我又顺手加了两个小功能:

  1. 播放速度可调:在onLoad里写innerAudioContext.playbackRate = 1.5。我试过设成 0.5,声音直接变粗,像哈基米感冒了。1.5 倍速就正常多了,只是变快变尖,像哈基米被踩了尾巴。

  2. 控制台打印信息:在sing函数里播放和暂停的分支各加两行console.log,打印currentTime和playbackRate。控制台就能看到哈基米叫到哪了。

结果展示

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进