React Native开发之expo中camera的基本使用
之前做RN项目没调用过本地摄像头,今天下班早,做了一个简单的小demo:主要实现的功能:点击拍照按钮进入拍照界面,点击flip进行前后摄像头转换,点击开始拍照实现拍照功能(没写保存到本地的功能,大家可以自主开发),代码是参照expo官网的Camera写的一个小demo,大家可以结合的expo官网来看,该加注释的地方都在代码中加了,希望能对你有所帮助。
import React from 'react'
import {
View,
Text,
TouchableOpacity,
Button,
Image
} from 'react-native'
import { Camera, Permissions } from 'expo';
interface Props{
}
//定义Camera的两个属性
interface State{
hasCameraPermission?:any,
type?:any,
isShowCamera: Boolean,
uri:string
}
export default class componentName extends React.Component<Props,State> {
public camera:any //定义一个camera来拿到Camera节点
constructor(props:Props) {
super(props)
this.state = {
hasCameraPermission: null, //照相机权限
type: Camera.Constants.Type.back, //照相机类型
isShowCamera: false, //是否开启照相机
uri: ''
}
}
async componentWillMount() {
const { status } = await Permissions.askAsync(Permissions.CAMERA);
this.setState({ hasCameraPermission: status === 'granted' });
}
//把官网里面的render粘过来
render() {
const { hasCameraPermission } = this.state;
if (hasCameraPermission === null) {
return <View />;
} else if (hasCameraPermission === false) {
return <Text>没有权限打开照相机</Text>;
} else {
return (
<View style={{ flex: 1, paddingTop: 20 }}>
{
!this.state.isShowCamera ?
<View>
<View>
<Image source={{uri:this.state.uri}} style={{width: 200, height: 200}}></Image>
</View>
<Button
onPress={this.takePicture.bind(this)}
title='拍照'
></Button>
</View>:
<Camera
style={{ flex: 1 }}
type={this.state.type}
ref={(el:any)=>this.camera=el} //参照官网的Methods
>
<View
style={{
flex: 1,
backgroundColor: 'transparent',
flexDirection: 'row',
}}>
<TouchableOpacity
style={{
flex: 1,
alignSelf: 'flex-end',
alignItems: 'center',
}}
onPress={() => {
this.setState({
type: this.state.type === Camera.Constants.Type.back
? Camera.Constants.Type.front
: Camera.Constants.Type.back,
});
}}>
<Text
style={{ fontSize: 18, marginBottom: 10, color: 'white' }}>
{' '}Flip{' '}
</Text>
</TouchableOpacity>
{/* 复制一个开始拍照的点击按钮 */}
<TouchableOpacity
style={{
flex: 1, //flex为0.1改成flex为1
alignSelf: 'flex-end',
alignItems: 'center',
}}
//参照官网的Methods
onPress={async () => {
if (this.camera) {
let photo = await this.camera.takePictureAsync();
console.log(photo)
this.setState({
isShowCamera: false,
uri: photo.uri
})
}
}}>
<Text
style={{ fontSize: 18, marginBottom: 10, color: 'white' }}>
{' '}开始拍照{' '}
</Text>
</TouchableOpacity>
</View>
</Camera>
}
</View>
);
}
}
takePicture(){
this.setState({
isShowCamera: true
})
}
}
控制台打印的photo结果:

React Native开发之expo中camera的基本使用的更多相关文章
- React Native开发之npm start加速
在Windows下好不容易安装好React Native环境之后,运行npm start,结果就是无限被等待,快的话160秒(将近3分钟啊....) 而Mac下因为有watchman所以是飞一样的速度 ...
- 转 : React Native 开发之 IDE 选型和配置
转:https://mp.weixin.qq.com/s?__biz=MzA3ODg4MDk0Ng==&mid=2651112392&idx=1&sn=135e29ddde30 ...
- React Native开发之IDE(Atom+Nuclide)安装,运行,调试
版权声明:本文为博主原创文章,如需转载请注明出处 目录(?)[-] 前言 MacWindowsLinux 准备工作 安装Atom 安装Nuclide 新建一个工程 自动补全 类型标注 语法检查 跳 ...
- React—Native开发之 Could not connect to development server(Android)解决方法
作为初学者昨天还好好能跑的项目今天就会遇到突然爆红出错是经常的事,让我们来看下是什么错吧 先来翻译: 连接不到开发的服务器. 请按照以下的步骤来修复此问题: 确保包服务器在运行确保你的设备或者模拟器连 ...
- Android安全开发之WebView中的地雷
Android安全开发之WebView中的地雷 0X01 About WebView 在Android开发中,经常会使用WebView来实现WEB页面的展示,在Activiry中启动自己的浏览器,或者 ...
- JavaEE开发之Spring中Bean的作用域、Init和Destroy方法以及Spring-EL表达式
上篇博客我们聊了<JavaEE开发之Spring中的依赖注入以及AOP>,本篇博客我们就来聊一下Spring框架中的Bean的作用域以及Bean的Init和Destroy方法,然后在聊一下 ...
- JavaEE开发之Spring中的多线程编程以及任务定时器详解
上篇博客我们详细的聊了Spring中的事件的发送和监听,也就是常说的广播或者通知一类的东西,详情请移步于<JavaEE开发之Spring中的事件发送与监听以及使用@Profile进行环境切换&g ...
- JavaEE开发之Spring中的条件注解组合注解与元注解
上篇博客我们详细的聊了<JavaEE开发之Spring中的多线程编程以及任务定时器详解>,本篇博客我们就来聊聊条件注解@Conditional以及组合条件.条件注解说简单点就是根据特定的条 ...
- JavaEE开发之SpringMVC中的自定义拦截器及异常处理
上篇博客我们聊了<JavaEE开发之SpringMVC中的路由配置及参数传递详解>,本篇博客我们就聊一下自定义拦截器的实现.以及使用ModelAndView对象将Controller的值加 ...
随机推荐
- Android学习——文件存储
在Andriod开发中,文件存储和Java的文件存储类似.但需要注意的是,为了防止产生碎片垃圾,在创建文件时,要尽量使用系统给出的函数进行创建,这样当APP被卸载后,系统可以将这些文件统一删除掉.获取 ...
- C# FTP操作类(获取文件和文件夹列表)
一.如何获取某一目录下的文件和文件夹列表. 由于FtpWebRequest类只提供了WebRequestMethods.Ftp.ListDirectory方式和WebRequestMethods.Ft ...
- SVNKit学习——wiki+简介(二)
这篇文章是参考SVNKit官网在wiki的文档,做了个人的理解~ 首先抛出一个疑问,Subversion是做什么的,SVNKit又是用来干什么的? 相信一般工作过的同学都用过或了解过svn,不了解的同 ...
- 【Leetcode】【Easy】Path Sum
Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all ...
- oracle 插入大于4000字符的 clob代码
OracleConnection connection = new OracleConnection(conn); OracleCommand command = new OracleCommand( ...
- Python学习---重点模块之json
注意:JSON不能转换类,不能转换函数 重点方法示例 json.dumps():实现文件写入,字符串转换[写入文件当然是JSON字符串楼] 实际上,json.dumps()只是帮我们做了一个字符串的转 ...
- IERS-OSPF基本工作原理
IERS-OSPF基本工作原理 一.邻居建立建立过程 1.Router ID 用于在自治系统中唯一标识一台运行OSPF的路由器,每台运行OSPF的路由器都有一个ROUTER ID Route ID 是 ...
- linux中无法使用sudo的方法
xxx is not in the sudoers file.This incident will be reported.的解决方法 1.切换到root用户下. 2.添加sudo文件的写权限,命令是 ...
- bzoj3609 [Heoi2014]人人尽说江南好
Description 小 Z 是一个不折不扣的 ZRP(Zealot Round-game Player,回合制游戏狂热玩家),最近他 想起了小时候在江南玩过的一个游戏. 在过去,人们是要边玩 ...
- 【深入理解JVM】:Java内存模型JMM
多任务和高并发的内存交互 多任务和高并发是衡量一台计算机处理器的能力重要指标之一.一般衡量一个服务器性能的高低好坏,使用每秒事务处理数(Transactions Per Second,TPS)这个指标 ...