React Native开发之expo中camera的基本使用

Posted bai1218

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 - 如何构建 expo react native 应用程序,使其不需要 Expo android 应用程序打开

在 expo/react-native 中发送图像时随机出现“错误处理请求正文”

Expo大作战--针对已经开发过react native项目开发人员有针对性的介绍了expo,expo的局限性,开发时项目选型注意点等

使用 react native / expo app (android) 打开已安装的应用程序

带有 Expo 的 React-Native Shake 事件检测器

使用expo的react-native消息队列