更新记录
1.0.0(2026-07-02)
新增
- 首发
xview-camera-view(Android / iOS / HarmonyOS / 微信小程序 / Web),统一 easycom 与跨平台事件。 - 方法:
open·reopen·close·destroyCamera·isOpened·openAppSettings·takePhoto·takeVideo·stopVideo·changeFacing·changeFlash·changeMode·changePhotoFormat·changeResolution·changeSaveToAlbum·changeWhiteBalance·changeHdr·changeExposure·changeAudio·changeLinearZoom·changeZoomRatio·switchUltraWide·resetZoom·changeGrid·changeCorner·changePreviewRotate·changeZoomGesture·changeTapFocus·changeTargetSize·changeKeyShortcut·changeRecordSound·changeFeedback
平台兼容性
uni-app(5.06)
| Vue2 | Vue3 | Chrome | Safari | app-vue | app-nvue | Android | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|
| × | × | × | × | × | × | × | × | × |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| × | × | × | × | × | × | × | × | × | × | × | × |
uni-app x(5.06)
| Chrome | Safari | Android | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|
| √ | √ | √ | √ | √ | √ |
xview-camera-view
xview-camera-view 是面向 uni-app x 的标准模式相机组件,提供 Android CameraX、iOS AVFoundation、HarmonyOS CameraKit、微信小程序内置 <camera>,以及 Web 浏览器原生摄像头能力。
仅支持 uni-app x(
.uvue+ UTS)。普通 uni-app / nvue 不在支持范围内。
能力概览
- easycom 组件:
<xview-camera-view />,放入uni_modules后无需手动注册 - 统一事件回调:打开/关闭、拍照、录像进度、聚焦、缩放、状态变化与异常
- 默认插槽:可在预览层之上叠加遮罩、按钮等人机界面(见示例「自拍遮罩」「身份证遮罩」)
- 组件挂载后自动
open();页面onShow可配合reopen()/close()管理生命周期
基础用法
组件需占满可用预览区域(建议绝对定位铺满父容器)。在 Options API 页面中,通过 ref + $callMethod 调用组件方法:
<template>
<view class="page">
<xview-camera-view
ref="cameraRef"
class="camera-view"
facing="back"
flash="off"
photo-format="jpg"
grid="draw_3X3"
:save-to-album="false"
@onPictureTaken="onPictureTaken"
@onCameraError="onCameraError"
@onCameraTakenError="onCameraTakenError"
/>
<image class="shutter" src="/static/camera/shutter.png" @click="takePhoto" />
</view>
</template>
<script lang="uts">
type XviewCameraViewElement = ComponentPublicInstance
export default {
methods: {
callCamera(action: (ref: XviewCameraViewElement) => void) {
const cameraRef = this.$refs['cameraRef'] as XviewCameraViewElement | null
if (cameraRef != null) {
action(cameraRef)
}
},
takePhoto() {
this.callCamera((ref) => {
ref.$callMethod('takePhoto')
})
},
onPictureTaken(e: any) {
// Android/iOS 原生层:e.detail 含 path、width、height、isFront 等
console.log('picture taken', e.detail)
},
onCameraError(e: any) {
console.log('camera error', e.detail)
}
}
}
</script>
<style>
.page {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: #000;
}
.camera-view {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
</style>
插槽与遮罩
组件提供默认插槽,内容渲染在预览层之上,适合实现取景框、水印、操作栏:
<xview-camera-view ref="cameraRef" class="camera-view" facing="front">
<!-- 遮罩层放在插槽外同级亦可,示例项目多采用绝对定位 overlay -->
</xview-camera-view>
<view class="camera-mask">
<image src="/static/mask/touxiang.png" />
</view>
遮罩层 z-index 应低于操作按钮,避免拦截快门点击。可参考 pages/camera/maskSelfie.uvue。
录像
// 开始录像(maxDuration 为最大时长毫秒数,0 或不传表示不限时,需手动 stopVideo)
ref.$callMethod('takeVideo', 0)
// 定时录像(10 秒后自动停止)
ref.$callMethod('takeVideo', 10000)
// 停止录像
ref.$callMethod('stopVideo')
Props
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| mode | string | picture |
拍摄模式;微信小程序映射为 camera 的 normal / scanCode |
| facing | string | back |
镜头方向:back / front |
| flash | string | off |
闪光灯:off / on / auto / torch |
| photoFormat | string | jpeg |
照片后缀:jpeg / jpg / png(iOS/Android 支持转换) |
| resolution | string | medium |
分辨率:low / medium / high / original(微信小程序生效) |
| saveToAlbum | boolean | false |
是否保存到系统相册 |
| grid | string | off |
网格:off / draw_3X3 / draw_4x4 / draw_phi(Android/iOS) |
| gridColor | string | #808080 |
网格线颜色 |
| whiteBalance | string | auto |
白平衡:auto / daylight / cloudy / incandescent / fluorescent(Android/iOS) |
| hdr | string | off |
HDR:off / on(Android/iOS) |
| audio | string | on |
录像音频:on / off |
| cornerRadius | number | 0 |
预览圆角半径(px) |
| cornerRatio | number | 0 |
预览圆角比例(0–1,与 radius 二选一) |
| previewRotate | number | 0 |
预览旋转角度(0/90/180/270,用于外接摄像头修正) |
| zoomGesture | boolean | true |
双指缩放(Android/iOS) |
| tapFocus | boolean | true |
点击对焦(Android/iOS) |
| keyShortcut | boolean | false |
Android 物理键快捷键(音量键拍照/录像等) |
| shutterFeedback | boolean | true |
拍照时是否触发快门反馈 |
| shutterSound | string | '' |
自定义快门音路径(空则系统默认) |
| vibrate | boolean | false |
拍照时是否震动 |
| vibrateDuration | number | 300 |
震动时长(ms) |
| recordSound | boolean | true |
是否启用录像提示音 |
| recordSoundFile | string | '' |
录像提示音路径 |
多数 props 支持运行时响应;也可通过同名 change* 方法动态修改。
组件方法
通过 ref.$callMethod('methodName', ...args) 调用。组件销毁前建议调用 destroyCamera()。
生命周期
| 方法 | 说明 |
|---|---|
open() |
打开相机预览 |
reopen() |
关闭后重新打开 |
close() |
关闭预览(保留实例) |
destroyCamera() |
销毁相机实例与资源 |
isOpened() |
返回预览是否已打开 |
openAppSettings() |
跳转系统设置(权限引导,Android/iOS) |
拍摄
| 方法 | 说明 |
|---|---|
takePhoto() |
拍照;触发 onPictureTaken |
takeVideo(maxDuration?) |
开始录像;maxDuration 为最大时长(ms),0 或不传需手动 stopVideo() |
stopVideo() |
停止录像;触发 onVideoTakenEnd |
镜头与画质
| 方法 | 说明 |
|---|---|
changeFacing(facing) |
切换前/后摄 |
changeFlash(flash) |
修改闪光灯模式 |
changeMode(mode) |
修改拍摄模式 |
changePhotoFormat(format) |
修改照片后缀 |
changeResolution(resolution) |
修改分辨率 |
changeSaveToAlbum(save) |
是否保存到相册 |
changeWhiteBalance(whiteBalance) |
白平衡 |
changeHdr(hdr) |
HDR 开关 |
changeExposure(exposure) |
曝光补偿(浮点数,如 ±0.1 步进) |
changeAudio(audio) |
录像音频开关 |
缩放
| 方法 | 说明 |
|---|---|
changeLinearZoom(zoom) |
线性缩放 0–1 |
changeZoomRatio(ratio) |
光学/数码变焦倍率(如 0.5、1、2) |
switchUltraWide() |
切换超广角 |
resetZoom() |
恢复标准主摄 |
预览与交互
| 方法 | 说明 |
|---|---|
changeGrid(grid, color) |
网格样式与颜色 |
changeCorner(radius?, ratio?) |
预览圆角 |
changePreviewRotate(degrees) |
预览旋转 |
changeZoomGesture(enabled) |
双指缩放开关 |
changeTapFocus(enabled) |
点击对焦开关 |
changeTargetSize(width, height?, tolerance?) |
指定目标分辨率(Android) |
changeKeyShortcut(enabled) |
Android 物理键快捷键 |
changeRecordSound(enabled, soundFile) |
录像提示音 |
changeFeedback(shutterFeedback, shutterSound, vibrate, vibrateDuration) |
拍照反馈 |
事件
事件名以 @onXxx 绑定,e.detail 为 payload(Web/小程序部分字段可能简化)。
| 事件 | 说明 |
|---|---|
| onCamera | 相机通用事件(打开时与 onCameraOpened 同时触发) |
| onCameraOpened | 相机打开 |
| onCameraClosed | 相机关闭 |
| onPictureTaken | 拍照完成 |
| onVideoTakenStart | 录像开始 |
| onVideoTakenProgress | 录像进度 |
| onVideoTakenEnd | 录像完成 |
| onFocusStart / onAutoFocusStart | 开始对焦 |
| onFocusEnd | 对焦结束 |
| onZoomChanged | 缩放变化 |
| onCameraChange | 参数变更或状态提示 |
| onCameraTakenError | 拍摄失败(拍照/录像) |
| onCameraError | 相机打开或运行异常 |
常用 payload 字段
onCameraOpened(Android/iOS)
| 字段 | 类型 | 说明 |
|---|---|---|
| facing | string | 当前镜头 front / back |
| physicalCameraId | string | 物理镜头 ID(可选) |
| cameraId | string | 逻辑相机 ID(可选) |
onPictureTaken(Android/iOS)
| 字段 | 类型 | 说明 |
|---|---|---|
| path | string | 本地文件路径 |
| uri | string | 相册 URI(保存到相册时) |
| isFront | boolean | 是否前置拍摄 |
| width / height | number | 图片宽高 |
| rotation | number | 旋转角度 |
onVideoTakenStart
| 字段 | 类型 | 说明 |
|---|---|---|
| path | string | 录像临时路径 |
| elapsed | number | 已录制毫秒 |
| timeText | string | 格式化时间文本 |
| duration | number | 最大时长(ms) |
onVideoTakenProgress
| 字段 | 类型 | 说明 |
|---|---|---|
| elapsed / duration / seconds | number | 进度相关 |
| timeText | string | 格式化时间 |
onVideoTakenEnd
| 字段 | 类型 | 说明 |
|---|---|---|
| path | string | 视频文件路径 |
| uri | string | 相册 URI(可选) |
| duration | number | 视频时长 |
| size | number | 文件大小(字节) |
| suffix | string | 视频后缀 |
onFocusStart / onFocusEnd
| 字段 | 类型 | 说明 |
|---|---|---|
| x / y | number | 归一化坐标 0–1 |
| success | boolean | 对焦是否成功(onFocusEnd) |
onZoomChanged
| 字段 | 类型 | 说明 |
|---|---|---|
| minZoomRatio / maxZoomRatio | number | 变焦范围 |
| linearZoom | number | 线性缩放 0–1 |
| zoomRatio | number | 当前变焦倍率 |
onCameraTakenError / onCameraError
| 字段 | 类型 | 说明 |
|---|---|---|
| message | string | 错误描述 |
| code | number | 错误码 |
| action | string | 触发动作(takeError) |
| isRecording / isCapturing | boolean | 繁忙状态(takeError) |
权限
Android:需在宿主 manifest.json 与插件 AndroidManifest.xml 中声明相机、录音、震动及媒体读写权限。示例项目已配置。
iOS:需在宿主 Info.plist 配置相机、麦克风、相册访问说明(NSCameraUsageDescription 等)。
HarmonyOS / 微信小程序 / Web:按各平台规范申请对应权限;Web 需用户授权浏览器摄像头/麦克风。
注意事项
- 预览组件应置于页面底层并铺满屏幕;操作 UI 使用更高
z-index的绝对定位层。 - APP 端页面若需滚动,请按 uni-app x 规范在 App 条件编译下使用
scroll-view包裹页面内容,相机页通常全屏固定布局。 takePhoto()会依据 propsshutterFeedback/shutterSound/vibrate/vibrateDuration触发快门反馈;动态修改请同步更新 props 或在拍照前通过原生层配置。- 跨页面回传拍摄结果时,示例项目使用
uni.$emit事件总线(如xview-camera-taken-result),可按业务自行替换。

收藏人数:
购买源码授权版(
试用
使用 HBuilderX 导入示例项目
赞赏(0)
下载 10
赞赏 0
下载 12378402
赞赏 1928
赞赏
京公网安备:11010802035340号