调用手机的相机功能并实现拍照和录像是很多APP与插件都必不可少的一个功能,今天智密科技就来分享一下如何基于uniapp + vue实现自定义相机界面,并且实现:

1: 自定义拍照

2: 自定义录像

3: 时长控制

4: 闪光灯控制

本文主要先分享前两条最基本的功能实现


先看效果:


技术实现

  • 开发环境:HbuilderX + nodejs
  • 技术框架:uniapp + vue2.x
  • 测试环境:App端(Android + IOS)
  • 代码:开源

效果概览


界面布局

这里主要是以自定义的样式为主,功能上使用了“智密相册-自定义相册相机”插件,插件提供了一个自定义相册的wrapper控件,因此我们只需要专注于ui即可,布局的代码如下

<view class="camera-container">
<zhimi_camera_view ref="camera" class="camera-elem"></zhimi_camera_view>
<view class="camera-methods">
<view class="camera-methods-item is-left" @click="doSwitchFlashLight()">
<image v-if="useFlashLight" class="camera-methods-item-image" src="../../static/icon_flash_start.png"></image>
<image v-else class="camera-methods-item-image" src="../../static/icon_flash_stop.png"></image>
</view>
<view class="camera-methods-capture">
<view
class="camera-methods-capture-elem"
:class="{
'camera-methods-capture-elem-recording': recording
}"
@click="doAction"
></view>
</view>
<view class="camera-methods-item is-right" @click="doSwitchCamera()">
<image class="camera-methods-item-image" src="../../static/icon_switch_camear.png"></image>
</view>
</view>
<text class="fit-left-btn" @click="doBack">退出</text>
<view class="fit-right-btn">
<text class="fit-right-btn-item" :class="{ 'fit-right-btn-item-is-active': cameraMode == 1 }" @click="setWrapperType(1)">拍照</text>
<text class="fit-right-btn-item" :class="{ 'fit-right-btn-item-is-active': cameraMode == 2 }" @click="setWrapperType(2)">录像</text>
</view>
</view>

这里有个重点,由于我们去掉了原生的标题栏,这需要在pages.json中进行配置,具体配置如下

{
"path":"pages/index/camera",
"style": {
"navigationStyle":"custom"
}
},

相机控件初始化

在这里我们主要是操作原生控件“zhimi_camera_view”提供的方法,首先我们需要设置回调事件以及相机的类型,比如摄像还是录像,前置还是后置相机

设置回调事件

let wrapper = this.$refs.camera
wrapper.setEventCallback(({ type, data }) => {
console.log(type, data)
});

设置相机类型

let wrapper = this.$refs.camera
// 设置相机模式 1 = 拍照模式,2 = 录像模式
wrapper.changeType(1)

设置前后置摄像头

let wrapper = this.$refs.camera
// 是否使用前置相机 true = 开启,false = 关闭
wrapper.useFrontCamera(false)

串联起来完整的初始化相机控件的代码就是这样的

let wrapper = this.$refs.camera
wrapper.setEventCallback(({ type, data }) => {
console.log(type, data)
});
wrapper.changeType(1) // 设置拍照
wrapper.useFrontCamera(false) // 设置后置摄像头

拍照录像与闪光灯控制

完成了相机的初始化之后,我们需要做一些业务上面的,比如拍照,录像,闪光灯开关等功能

闪光灯控制

let wrapper = this.$refs.camera
// 是否开启闪光灯 true = 开启,false = 关闭
wrapper.flashLightAction(true) // 开启闪光灯

拍照

let wrapper = this.$refs.camera
wrapper.takePhotoAction();

录像

let wrapper = this.$refs.camera
// true = 开始录像, false = 结束录像
wrapper.takeVideoAction(true);

对于闪光灯而言,开关闪光灯是控制闪光灯是否持续开启,也就是手电筒模式,而不是拍照的时候才闪的,效果上参考下面2张对比图

无闪光灯(无光点)                     有闪光灯(有光点)


获取拍照/录像结果

在前面我们已经通过setEventCallback绑定了回调事件,一般来说拍照/录像完成之后会通过回调事件反馈拍照录像结果,具体代码如下

cameraEventHanlder (res) {
let { type, data } = res
switch (type){
// 拍照模式返回图片路径数据
case 'imageType':
// 注意:此处返回的为平台路径,前端显示请加file://前缀
console.log(data)
break;
// 录像模式返回视频路径数据
case 'videoType':
// 注意:此处返回的为平台路径,前端显示请加file://前缀
console.log(data)
break;
default:
console.log(data)
break;
}
}

注意看注释,这里最大的重点是路径,如果说获取到的路径前端需要显示在界面前面,需要添加file://前缀,比如获取到的文件路径如下:

/var/data/Android/Album/timeStamp.png

前端显示的时候需要这样写

<image src="file:///var/data/Android/Album/timeStamp.png"/>

注意这里是3个斜杆,因为安卓这类移动端系统都是基于类unix开发的,因此都是从 / 根开始检索文件的,所以前端需要使用file协议,并且以/开头。

 
ok,到这里uniapp实现自定义相册的拍照和视频录制的功能就可以实现啦,下一次就分享如何自定义相册与压缩的功能!
对于这部分的代码使用到的原生插件,可以参考uniapp插件市场中的插件,在插件市场也有开源的代码工程哦,也可以添加QQ群755910061定制更多个性化的功能。

如何用uniapp+vue开发自定义相机插件——拍照+录像功能的更多相关文章

  1. [转]jquery开发自定义的插件总结

    本文转自:http://www.cnblogs.com/Jimmy009/archive/2013/01/17/jquery%E6%8F%92%E4%BB%B6.html 前几天在玩jquery,今天 ...

  2. Android—实现自定义相机倒计时拍照

    这篇博客为大家介绍Android自定义相机,并且实现倒计时拍照功能 首先自定义拍照会用到SurfaceView控件显示照片的预览区域,以下是布局文件: 两个TextView是用来显示提示信息和倒计时的 ...

  3. jquery开发自定义的插件总结

    1.第一种方式,有元素的插件 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "htt ...

  4. 一、Uniapp+vue+腾讯IM+腾讯音视频开发仿微信的IM聊天APP,支持各类消息收发,音视频通话,附vue实现源码(已开源)-项目引言

    项目文章索引 1.项目引言 2.腾讯云后台配置TXIM 3.配置项目并实现IM登录 4.会话好友列表的实现 5.聊天输入框的实现 6.聊天界面容器的实现 7.聊天消息项的实现 8.聊天输入框扩展面板的 ...

  5. vue 开发笔记

    vue 开发记录 marked 插件的使用 import marked from "marked"; import hljs from "highlight.js&quo ...

  6. 浅析vue封装自定义插件

    在使用vue的过程中,经常会用到Vue.use,但是大部分对它一知半解,不了解在调用的时候具体做了什么,因此,本文简要概述下在vue中,如何封装自定义插件. 在开始之前,先补充一句,其实利用vue封装 ...

  7. Vue 3自定义指令开发

    本文由葡萄城技术团队原创并首发 转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 什么是指令(directive) 在Angular和Vue中都有Direct ...

  8. vue中自定义组件(插件)

    vue中自定义组件(插件) 原创 2017年01月04日 22:46:43 标签: 插件 在vue项目中,可以自定义组件像vue-resource一样使用Vue.use()方法来使用,具体实现方法: ...

  9. Android H5混合开发(2):自定义Cordova插件

    前言 Cordova虽然定义了很多基础的插件,供H5端使用原生设备的功能. 但是,如果业务相关的功能,需要提供给H5端使用,那么,就需要我们自定义插件了. 这个"自定义"不是指由A ...

随机推荐

  1. 9.3 k8s结合ELK实现日志收集

    数据流: logfile -> filebeat > kafka(依赖zookeeper)-> logstash -> elasticsearch -> kibana 1 ...

  2. BehaviorTree.CPP行为树BT的队列节点(三)

    Sequences(队列) 只要序列的所有子代返回SUCCESS,它便会对其进行Tick. 如果有任何子级返回FAILURE,则序列中止. 当前,该框架提供三种节点: Sequence Sequenc ...

  3. 贪心/构造/DP 杂题选做

    本博客将会收录一些贪心/构造的我认为较有价值的题目,这样可以有效的避免日后碰到 P7115 或者 P7915 这样的题就束手无策进而垫底的情况/dk 某些题目虽然跟贪心关系不大,但是在 CF 上有个 ...

  4. [NOI2020] 超现实树

    我们定义链树为:在该树上的任意节点,左右子树大小的最小值小于2. 举个例子: 那么我们思考,链树显然可以在叶子节点任意替换成其他子树. 那么在主链上,我们可以做到生成任意深度大于主链长度的树. 反过来 ...

  5. 洛谷 P4062 - [Code+#1]Yazid 的新生舞会 的线性做法

    洛谷题面传送门 一个线性做法. \(n\log n\) 解法可以戳这里查看 首先回顾一下 \(n\log n\) 解法的过程:我们对于每一个数 \(x\),考察其出现位置,设为 \(t_1,t_2,t ...

  6. [Codeforces Global Round 14]

    打挺差的. 不过\(C,D\)一眼秒了,大概是对这几个月努力的一个结果? \(B\)玄学错误挂了两发. 脑子痛然后打到一半就去睡觉了. -------------------------------- ...

  7. 洛谷 P7516 - [省选联考 2021 A/B 卷] 图函数(Floyd)

    洛谷题面传送门 一道需要发现一些简单的性质的中档题(不过可能这道题放在省选 D1T3 中偏简单了?) u1s1 现在已经是 \(1\text{s}\)​ \(10^9\)​ 的时代了吗?落伍了落伍了/ ...

  8. Atcoder Grand Contest 015 F - Kenus the Ancient Greek(找性质+乱搞)

    洛谷题面传送门 & Atcoder 题面传送门 一道难度 Au 的 AGC F,虽然看过题解之后感觉并不复杂,但放在现场确实挺有挑战性的. 首先第一问很简单,只要每次尽量让"辗转相除 ...

  9. 【Linux】tmux安装(非root)及其使用

    tmux(terminal multiplexer)是Linux上的终端复用神器. 1. 安装 (1)下载 下载及其依赖软件. wget -c https://github.com/tmux/tmux ...

  10. 查看nginx(Web网页服务器)状态是否正常

    Linux每个应用运行都会产生一个进程,那么我们就可以通过查看Nginx进程是否存在来判断它是否启动. 1.有时想知道nigix是否在正常运行,需要用linux命令查看nginx运行情况.执行命令:p ...