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

原文地址:https://www.cnblogs.com/bai1218/p/10098655.html

时间: 2024-10-05 06:16:57

React Native开发之expo中camera的基本使用的相关文章

React—Native开发之 Could not connect to development server(Android)解决方法

写在最前面: 本来,我是有一篇博客 RN开发之BUG 总结(持续更新) 来专门总结自己在React-Native开发中遇到的各种BUG 以及其解决办法的. 但是,由于 Could not connect to development server是我深恶痛绝的一个超级大BUG. 为什么这么说呢? 因为这个BUG并不容易在网上找到解决方法.网上确实有这个BUG,但是大部分都是解决IOS开发中遇到的,一 些老外的网站中也在讨论这个问题,好不容易找到点和我问题相似的,还并没有给出确定的解决方案,实在是

转 : React Native 开发之 IDE 选型和配置

转:https://mp.weixin.qq.com/s?__biz=MzA3ODg4MDk0Ng==&mid=2651112392&idx=1&sn=135e29ddde3050d469be98db815c267e&scene=0&key=18e81ac7415f67c4bcc2eaac3ca13f8d294ec1b8fa5828d4d7f13f2e81cc62f72e55e828ee04e2002284521336a3766d&ascene=0&

React Native开发之npm start加速

在Windows下好不容易安装好React Native环境之后,运行npm start,结果就是无限被等待,快的话160秒(将近3分钟啊....) 而Mac下因为有watchman所以是飞一样的速度,1秒不到,一般几十到几百毫秒.此处一千一万只草泥飞在胸中奔腾-   所幸找到一个解决方案了,能让npm start也飞起来(500毫秒左右),操作步骤如下: 1.安装watchman,在Windows下暂时处于alpha版本但是可以使用,是一个zip包 https://facebook.githu

React Native开发之IDE(Atom+Nuclide)安装,运行,调试

版权声明:本文为博主原创文章,如需转载请注明出处 目录(?)[-] 前言 MacWindowsLinux 准备工作 安装Atom 安装Nuclide 新建一个工程 自动补全 类型标注 语法检查 跳转到方法或者类型定义 在Nuclide运行项目 在Nuclide中调试 添加断点 Element Inspector 总结 欢迎Follow我的Github,博客会同步在Github的Blog仓库更新.也可以关注CSDN博客的React Native分类 Github地址: LeoMobileDevel

React Native开发之FlexBox代码+图解

来自Leo的原创博客,转载请著名出处 我的stackoverflow 前言 FlexBox布局是React Native的布局核心,鉴于自己对FlexBox还有很多概念不太清楚,这篇文章就当成是总结,并且分享出来给大家. FlexBox布局能够帮助你更好的帮助你控制控件的大小和位置,Flexbox非常适合Mobile端的适配,我想这也是FaceBook为什么选择FlexBox作为React Native布局的原因吧. 本文参考文章如下 A Complete Guide to Flexbox re

JavaEE开发之Spring中的条件注解、组合注解与元注解

上篇博客我们详细的聊了<JavaEE开发之Spring中的多线程编程以及任务定时器详解>,本篇博客我们就来聊聊条件注解@Conditional以及组合条件.条件注解说简单点就是根据特定的条件来选择Bean对象的创建.条件注解就是可以根据不同的条件来做出不同的事情.在Spring中条件注解可以说是设计模式中状态模式的一种体现方式,同时也是面向对象编程中多态的应用部分.而组合注解就是将现有的注解进行组合.下方会给出具体的介绍和实例. 一.条件注解[email protected] 本篇博客的本部分

Android React Native在Android Studio中执行bundleReleaseJsAndAssets 打包失败的解决方法

这个坑在文章记一次在Windows上搭建React Native Android环境踩过的坑中我已经提到过,当时找不到解决方法,只能开一个命令提示符终端独立执行打包.就像这样子 react-native bundle --platform android --dev false --entry-file index.android.js --bundle-output C:\Users\Administrator\Desktop\AwesomeProject\android\app\build\

react native的环境搭建中常见问题

搭建完成android的环境,我们就可以继续我们的react native环境的搭建了. 当然,按照fb的安装流程来完成rn的搭建. http://facebook.github.io/react-native/docs/getting-started.html 1.install python2 一定要安装python2.X.X的版本,切记不要安装pythn3+以上的. 2.rn的安卓sdk要是23.0.1,要不然会报在目录下找不到对应的sdk. 3.在目录下无法找到local.propert

react native 开发报错

1:oc对象名是RCTPoctalk 2:js中导入原生方法 3:报错:对象没有定义 出现这样的问题可能是react native 不允许使用"RCT"开头的前缀 4:解决办法:"RCT_EXPORT_MODULE()" 导出对象方法的宏默认是OC对象名 ,  在宏中添加另起一个名字,js导出方法也修改下