# SysCamera SysCamera 是一个用于从系统摄像头拍照的容器控件,继承自 `SysVideoRecorder`。它本质上是一个媒体录制弹窗控件的特化版本,将“录制视频”功能替换为“单次拍摄照片”,适用于需要用户拍照上传的场景(如头像设置、证件照采集等)。该控件属于**容器控件**。 --- ## 主要方法 - **`switch_record()`** 重写了父类的录屏/录音切换方法,改为执行拍照操作。停止预览流任务,派发 `shot` 事件并携带拍摄的图片 URL 和 File 对象,随后关闭摄像头。 - **`show_picture()`** 继承自 `SysVideoRecorder`,通过 `ImageCapture.takePhoto()` 持续获取当前帧图像,并显示在内置的 Image 控件中,形成实时预览效果。 - **`close_recorder()`** 清理资源:取消定时任务、停止媒体流轨道、释放 DOM 元素,最后调用 `dismiss()` 隐藏弹窗。 --- ## 主要事件 - **`shot`** 当用户点击拍照按钮时触发。携带数据: ```json { "url": "data:image/jpeg;base64,...", // 图片 Data URL "file": FileObject // 图片对应的 File 实例 } ``` 可用于上传或展示拍摄结果。 - **`record_started`**(继承) 启动预览流时触发,表示摄像头已打开。 - **`record_end`**(继承) 不适用此控件,不会触发。 --- ## 源码例子 ```json { "id": "camera_popup", "widgettype": "SysCamera", "options": { "title": "Take a Photo", // 弹窗标题 "width": 400, // 弹窗宽度 "height": 500, // 弹窗高度 "fps": 30 // 视频预览帧率 }, "subwidgets": [], // SysCamera 自行管理子控件,无需手动定义 "binds": [ { "actiontype": "event", "wid": "open_camera_btn", // 假设页面上有一个按钮 ID 为 open_camera_btn "event": "click", // 点击时打开摄像头 "target": "camera_popup", "method": "present" // 显示弹窗 }, { "actiontype": "event", "wid": "camera_popup", "event": "shot", // 监听拍照完成事件 "target": "photo_preview_img", // 假设有一个 Image 控件用于显示照片 "method": "set_url", // 调用 set_url 方法更新图片 "datawidget": "camera_popup", // 数据来源是 camera_popup "datamethod": "getValue", // getValue 应返回 { url: ..., file: ... } "dataparams": {} }, { "actiontype": "script", "wid": "camera_popup", "event": "shot", "script": "console.log('Photo taken:', params.file.name); uploadFile(params.file);", "params": { "file": "{source.file}" // 使用表达式注入文件对象 } } ] } ``` > ✅ **注释说明:** > - `SysCamera` 控件自动构建内部 UI(包括预览区和拍照按钮),开发者只需配置选项并绑定事件。 > - `present()` 方法由 `Popup` 基类提供,用于显示模态窗口。 > - `binds` 中监听 `shot` 事件后,可将图片传递给其他控件或执行上传逻辑。 > - 利用 `script` 类型绑定可以实现复杂业务逻辑,例如调用全局上传函数 `uploadFile`。 --- # WidgetRecorder WidgetRecorder 是一个用于录制指定 HTML 媒体元素(如 `