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结果:

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM