跳到教程内容
教程首页
App Inventor 2 教程 拍照混搭
准备开始

先了解你将做出什么

应用介绍

这次做一个简单的照片涂鸦板:点按钮拍照,照片自动铺到 画布 背景上,然后用手指画线。 画错了不用重新拍,摇一摇手机就能清空涂鸦。相机返回结果是异步事件,正好练习“发起动作、等待回调”的流程。

教程主图

拍照混搭教程(难度系数:★★)

准备组件

组件类型 组件名称 关键设置
按钮 按钮_拍照 拍摄照片
按钮 按钮_清空 清除贴纸
标签 标签_状态 显示操作提示
画布 画布1 宽高填满父容器,线宽:5
照相机 照相机1 非可视组件
加速度传感器 加速度传感器1 非可视组件

点击按钮拍照

when 按钮_拍照.Click() {
  标签_状态.Text = "正在打开相机……"
  照相机1.TakePicture()
}

按钮只负责打开相机,不要在这里读取照片路径;照片还没有返回。

把照片放到画布背景

用户完成拍摄后,AfterPicture 事件的 image 参数才是照片路径。收到它以后再设置背景, 并更新提示文字。

when 照相机1.AfterPicture(image) {
  画布1.BackgroundImage = image
  标签_状态.Text = "可以在照片上涂鸦了"
}

拖动手指画线

Dragged 同时给出上一点和当前点。用上一点到当前点画线,手指移动时就会得到连续笔画; 只画当前点会变成一串孤立的点。

when 画布1.Dragged(startX, startY, prevX, prevY, currentX, currentY, draggedAnySprite) {
  画布1.DrawLine(prevX, prevY, currentX, currentY)
}

清除涂鸦

摇动事件只清除画布上的线条和背景图。如果你想保留照片、只清除线条,可以把照片路径保存到全局变量, 清除后再设置回背景;这里先做一个简单、明确的版本。

when 按钮_清空.Click() {
  画布1.Clear()
  标签_状态.Text = "画布已清空,可以重新拍照"
}

when 加速度传感器1.Shaking() {
  画布1.Clear()
  标签_状态.Text = "摇一摇清空完成"
}

开始测试

  1. 点按钮拍一张照片,返回后照片是否出现在画布上。
  2. 在照片上拖动手指,线条是否连续而不是断成点。
  3. 点清除按钮,背景和线条是否一起消失。
  4. 真机摇动手机,是否触发清除;模拟器通常无法模拟摇动。
  5. 取消拍照时,App 是否仍保持原来的画面。

剩余工作

可以增加颜色按钮、线宽滑块、画圆和文字工具;还可以调用 画布1.SaveAs 保存涂鸦, 再用分享组件发送给朋友。保存前要提醒用户相机和存储权限。