简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网

我猜去全部机翻+个人修改补充+demo测试的形式,对expo进行一次大补血!欢迎加入expo兴趣学习交流群:597732981

【之前我写过一些列关于expo和rn入门配置的东i西,大家可以点击这里查看:从零学习rn开发

相关文章:

Expo大作战(一)--什么是expo,如何安装expo clinet和xde,xde如何使用

Expo大作战(二)--expo的生命周期,expo社区交流方式,expo学习必备资源,开发使用expo时关注的一些问题

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

Expo大作战(四)--快速用expo构建一个app,expo中的关键术语

Expo大作战(五)--expo中app.json 文件的配置信息

Expo大作战(六)--expo开发模式,expo中exp命令行工具,expo中如何查看日志log,expo中的调试方式

Expo大作战(七)--expo如何使用Genymotion模拟器

Expo大作战(八)--expo中的publish以及expo中的link,对link这块东西没有详细看,大家可以来和我交流

更多>>

写在二十三章以后的话,之前的翻译,不管如何,好与不好,终究是告一段落,也把expo基础理论的东西又深入的理解了一遍,后续expo大作战系列将主要介绍expo sdk的api。


ImageManipulator

修改存储在应用程序范围中的图像的API。

Expo.ImageManipulator.manipulate(uri,actions,saveOptions)
操作通过uri提供的图像。可用的修改是旋转,翻转(镜像),调整大小和裁剪。每次调用都会生成一个新文件。通过一次调用,您可以提供一组要在图像上执行的操作。随着图像被缓存,覆盖源文件不会影响显示结果。

参数
uri(string) - 要操作的文件的URI。应该在应用程序的范围内。

actions(array) -

表示操作选项的对象数组。每个对象都应该具有下列其中一个键:

  • resize (object) 调整大小(对象) - 形状为{width,height}的对象。值对应于结果图像尺寸。如果只指定一个值,则另一个值将自动设置以保持图像比例。
  • rotate (number) 旋转(数字) - 度旋转图像。正值时顺时针旋转,负值时逆时针旋转。
  • flip (object) 翻转(对象) - 形状{垂直,水平}({ vertical, horizontal })的对象。将字段设置为true,将图像翻转到指定的轴。
  • crop (object)  裁切(对象) - 形状为{originX,originY,width,height}的对象。字段指定裁剪矩形的左上角和尺寸。

saveOptions(对象) - 定义应如何保存已修改图像的映射:

  • compress(number) - 范围为0 - 1的值,指定结果图像的压缩级别。 1表示不压缩,0表示最高压缩。
  • format (string)  - 'jpeg'或'png'。指定应使用哪种类型的压缩以及结果文件扩展名是什么。 PNG压缩是无损但更慢,JPEG更快,但图像有可见的文物。默认为'jpeg'。(JPEG is faster but the image has visible artifacts. Defaults to 'jpeg'.)
  • base64(boolean) - 是否还包含Base64格式的图像数据。

返回
返回{uri,width,height}其中uri是修改后图像的URI(可用作图像/视频元素的源),width,height指定图像的尺寸。它还可以包含base64 - 如果base64 saveOption真的是包含的,并且是包含Base64中图像的JPEG / PNG(取决于格式)数据的字符串,则预先使用''data:image/xxx;base64,'取数据URI,您可以将其用作Image元素的源(例如,xxx是'jpeg'或'png')。

基本示例
这将首先顺时针旋转图像90度,然后垂直翻转旋转的图像并将其保存为PNG。

import React from 'react';
import { Button, TouchableOpacity, Text, View, Image } from 'react-native';
import { Asset, ImageManipulator } from 'expo'; import Colors from '../constants/Colors'; export default class ImageManipulatorSample extends React.Component {
state = {
ready: false,
image: null,
}; componentWillMount() {
(async () => {
const image = Asset.fromModule(require('../path/to/image.jpg'));
await image.downloadAsync();
this.setState({
ready: true,
image,
});
})();
} render() {
return (
<View style={{ flex: }>
<View style={{ padding: }}>
<Button onPress={this._rotate90andFlip} />
{this.state.ready && this._renderImage()}
</View>
</View>
);
} _rotate90andFlip = async () => {
const manipResult = await ImageManipulator.manipulate(
this.state.image.localUri || this.state.image.uri,
[{ rotate: }, { flip: { vertical: true }}],
{ format: 'png' }
);
this.setState({ image: manipResult });
} _renderImage = () => {
return (
<View style={{marginVertical: , alignItems: 'center', justifyContent: 'center'}}>
<Image
source={{ uri: this.state.image.localUri || this.state.image.uri }}
style={{ width: , height: , resizeMode: 'contain' }}
/>
</View>
);
};
}

ImagePicker

提供系统用户界面的访问权限,用于从手机库中选择图像和视频,或者使用相机拍摄照片。

Expo.ImagePicker.launchImageLibraryAsync(options)

显示用于从手机库中选择图像或视频的系统UI。

参数
options(object) -

两种选项的地图:

  • mediaTypes(string) - 选择要选择的媒体类型。用法:ImagePicker.MediaTypeOptions.<Type>,其中<Type>是以下其中一个:Images,Videos,All。
  • allowsEditing (boolean) - 是否显示一个用户界面以便在选取后编辑图像/视频。图像:在Android上,用户可以裁剪和旋转图像,并在iOS上裁剪。视频:在iOS用户可以修剪视频。默认为false。

图像选项的地图:

  • aspect(array) - 一个包含两个条目[x,y]的数组,指定要允许用户编辑图像的宽高比(通过传递allowedEditing:true)。这仅适用于Android,因为iOS上的裁剪矩形总是正方形。
  • quality (number)  - 指定压缩质量,从0到1. 0表示小尺寸压缩,1表示压缩以获得最高质量。
  • base64(boolean) - 是否还包含Base64格式的图像数据。
  • exif(boolean) - 是否也包含图像的EXIF数据。

返回
如果用户取消选择,则返回{cancel:true}。

否则,返回{cancel:false,uri,width,height,type}其中uri是本地媒体文件的URI(可用作Image / Video元素的源),width,height指定媒体的尺寸和类型是图像或视频的一种,告诉我们选择了哪种媒体。图像也可以包含base64和exif键。如果base64选项是真的,则包含base64,并且是包含Base64中图像的JPEG数据的字符串(使用'data:image / jpeg; base64'),以获取数据URI,您可以将其用作源例如,一个Image元素。如果exif选项是真的,则包含exif,并且是包含图像的EXIF数据的对象 - 其属性的名称是EXIF标签,其值是这些标签的值。如果选择了视频,则返回对象包含额外的键持续时间,以毫秒为单位指定视频的持续时间。

import React from 'react';
import { Button, Image, View } from 'react-native';
import { ImagePicker } from 'expo'; export default class ImagePickerExample extends React.Component {
state = {
image: null,
}; render() {
let { image } = this.state; return (
<View style={{ flex: , alignItems: 'center', justifyContent: 'center' }}>
<Button
title="Pick an image from camera roll"
onPress={this._pickImage}
/>
{image &&
<Image source={{ uri: image }} style={{ width: , height: }} />}
</View>
);
} _pickImage = async () => {
let result = await ImagePicker.launchImageLibraryAsync({
allowsEditing: true,
aspect: [, ],
}); console.log(result); if (!result.cancelled) {
this.setState({ image: result.uri });
}
};
}

Expo.ImagePicker.launchCameraAsync(toptions)
显示用相机拍摄照片的系统UI。

参数
options(object) -

选项图:

  • allowsEditing(boolean) - 是否显示UI以在拾取后编辑图像。在Android上,用户可以裁剪和旋转图像,并在iOS上裁剪。默认为false。
  • aspect(array) - 一个包含两个条目[x,y]的数组,指定要允许用户编辑图像的宽高比(通过传递allowsEditing:true)。这仅适用于Android,因为iOS上的裁剪矩形总是正方形。
  • quality (number)  - 指定压缩质量,从0到1. 0表示小尺寸压缩,1表示压缩以获得最高质量。
  • base64(boolean) - 是否还包含Base64格式的图像数据。
  • exif(boolean) - 是否也包含图像的EXIF数据。在iOS上,EXIF数据不包括相机外壳中的GPS标签。

返回
如果用户取消拍摄照片,则返回{cancel:true}。

否则,返回{取消:false,uri,width,height,exif,base64}其中uri是本地图像文件的URI(可用作Image元素的源),width,height指定图像的尺寸。如果base64选项是真的,则包含base64,并且是包含Base64中图像的JPEG数据的字符串(使用'data:image / jpeg; base64'),以获取数据URI,您可以将其用作源例如,一个Image元素。如果exif选项是真的,则包含exif,并且是包含图像的EXIF数据的对象 - 其属性的名称是EXIF标签,其值是这些标签的值。

当你运行上个例子并选择一个图像时,你会看到你选择的图像出现在你的应用程序中,并且类似于以下内容的信息被记录到控制台中:

{
"cancelled":false,
"height":,
"width":,
"uri":"file:///data/user/0/host.exp.exponent/cache/cropped1814158652.jpg"
}

相机(Camera)

React组件,用于呈现设备的前置或后置摄像头的预览。 相机的参数,如变焦,自动对焦,白平衡和闪光灯模式均可调节。 通过使用相机,您还可以拍摄照片并录制保存在应用程序缓存中的视频。 此外,该组件还能够检测出现在预览中的人脸和条形码。

注意:Expo现在只支持一个Camera预览。 使用导航时,最佳做法是卸载先前渲染的摄像头组件,以便下一个屏幕可以毫无问题地使用摄像头。

需要PermissionsCAMERA。 视频录制需要Permissions.AUDIO_RECORDING。

基本示例

import React from 'react';
import { Text, View, TouchableOpacity } from 'react-native';
import { Camera, Permissions } from 'expo'; export default class CameraExample extends React.Component {
state = {
hasCameraPermission: null,
type: Camera.Constants.Type.back,
}; async componentWillMount() {
const { status } = await Permissions.askAsync(Permissions.CAMERA);
this.setState({ hasCameraPermission: status === 'granted' });
} render() {
const { hasCameraPermission } = this.state;
if (hasCameraPermission === null) {
return <View />;
} else if (hasCameraPermission === false) {
return <Text>No access to camera</Text>;
} else {
return (
<View style={{ flex: }}>
<Camera style={{ flex: }} type={this.state.type}>
<View
style={{
flex: ,
backgroundColor: 'transparent',
flexDirection: 'row',
}}>
<TouchableOpacity
style={{
flex: 0.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: , marginBottom: , color: 'white' }}>
{' '}Flip{' '}
</Text>
</TouchableOpacity>
</View>
</Camera>
</View>
);
}
}
}

综合实例

查看expo / camerja的完整示例。你可以在@ community / camerja上用Expo来试试。

props

  • type

相机面对(Camera facing)。使用Camera.Constants.Type之一。在Type.front时,请使用前置摄像头。 Type.back时,请使用背面照相机。默认值:Type.back。

  • flashMode

相机闪光模式。使用Camera.Constants.FlashMode之一。启用时,设备上的闪光灯将在拍摄时开启,关闭时不会。设置为Type.auto会在需要时触发闪光灯,Type.torch在预览过程中打开闪光灯。默认:关闭。

  • autoFocus

相机自动对焦的状态。使用Camera.Constants.AutoFocus之一。启用时,将启用自动对焦,关闭时不启用,焦点将锁定为更改时的状态,但可以通过focusDepth支架在某些设备上进行调整。

  • zoom (float)缩放(浮动)

介于0和1之间的值是设备最大变焦的百分比。 0 - 未缩放,1 - 最大缩放。默认值:0。

  • whiteBalance 白平衡

相机白平衡。使用Camera.Constants.WhiteBalance之一:自动,晴天,阴天,阴影,荧光灯,白炽灯。如果设备不支持以前使用的任何一个值。

  • focusDepth(float)

距离飞机最锋利的焦点(Distance to plane of sharpest focus. )。介于0和1之间的值:0 - 无穷远焦点,1 - 尽可能靠近焦点。默认值:0。

  • ratio (string) 比率(字符串)

仅限Android。表示预览的宽高比的字符串,例如。 4:3,16:9,1:1。要检查设备是否支持比率,请使用getSupportedRatiosAsync。默认值:4:3。

  • onCameraReady(function)

当相机预览已设置时调用回调。

  • onFacesDetected(function)

在预览中使用面部检测结果调用回调。它将收到一个对象,其中包含:

faces(array) - array of faces objects:

  • faceID(number) - 一个脸部标识符(用于跟踪,如果同一张脸出现在连续帧上,它将具有相同的faceID)。
  • bounds (object)  - 包含以下内容的对象:
  • origin ({ x: number, y: number })  - 包含视图坐标的正方形左上角的位置,
  • size({width:number,height:number}) - 包含视图坐标中的脸部的正方形的大小,
  • rollAngle(number) - 面部(银行)的滚动角度,
  • yawAngle(number) - 面部的偏航角度(航向,转向头左或右),
  • smileProbability(number) - 面部微笑的概率,
  • leftEarPosition({x:number,y:number}) - 左耳在视图坐标中的位置,
  • rightEarPosition({x:number,y:number}) - 右耳在视图坐标中的位置,
  • leftEyePosition({x:number,y:number}) - 左眼在视图坐标中的位置,
  • leftEyeOpenProbability(数字) - 左眼打开的概率,
  • rightEyePosition({x:number,y:number}) - 右眼在视图坐标中的位置,
  • rightEyeOpenProbability(数字) - 右眼是开放的概率,
  • leftCheekPosition({x:number,y:number}) - 左侧脸颊在视图坐标中的位置,
  • rightCheekPosition({x:number,y:number}) - 右侧脸颊在视图坐标中的位置,
  • mouthPosition({x:number,y:number}) - 嘴中心在视图坐标中的位置,
  • leftMouthPosition({x:number,y:number}) - 在视图坐标中嘴巴左边缘的位置,
  • rightMouthPosition({x:number,y:number}) - 在视图坐标中嘴巴右侧边缘的位置,
  • noseBasePosition({x:number,y:number}) - 鼻座在视图坐标中的位置。

仅当faceDetectionClassifications属性设置为.all时才返回smilingProbability,leftEyeOpenProbability和rightEyeOpenProbability。

仅当faceDetectionLandmarks属性设置为.all时才会返回人脸地标的位置。

另请参阅FaceDetector组件。

faceDetectionMode(Camera.Constants.FaceDetection.Mode)

人脸检测模式。使用Camera.Constants.FaceDetection.Mode.{fast, accurate}之一。

faceDetectionLandmarks(Camera.Constants.FaceDetection.Landmarks)

是否检测脸上的标志。使用Camera.Constants.FaceDetection.Landmarks。{all,none}之一。有关详细信息,请参阅FaceDetector文档。

faceDetectionClassifications(Camera.Constants.FaceDetection.Classifications)

是否在脸上运行其他分类。使用Camera.Constants.FaceDetection.Classifications。{all,none}之一。有关详细信息,请参阅FaceDetector文档。

onMountError(function)

无法启动相机预览时调用回调。它提供了一个包含消息的错误对象。

onBarCodeRead(function)

当条码被成功读取时调用的回调。该回调提供了一个形状为{type:string,data:string}的对象,其中的type是指扫描的条形码类型,data是条形码中编码的信息(在这种情况下是QR码,这通常是一个URL)

barCodeTypes(array)

条形码类型的数组。用法:Camera.Constants.BarCodeType.<codeType>其中,codeType是上面列出的之一。默认值:所有支持的条码类型。例如:barCodeTypes = {[Camera.Constants.BarCodeType.qr]}

方法
要使用Camera公开的方法,必须创建一个组件ref并使用它调用它们。

// ...
<Camera ref={ref => { this.camera = ref; }} />
// ...
snap = async () => {
if (this.camera) {
let photo = await this.camera.takePictureAsync();
}
};

takePictureAsync

拍摄照片并将其保存到应用的缓存目录。旋转照片以匹配设备的方向并缩放以匹配预览。无论如何,在Android上设置比例支持以获得具有正确尺寸的图片是非常重要的。

参数
options(object) -

选项图:

  • quality (number)  - 指定压缩质量,从0到1. 0表示小尺寸压缩,1表示压缩以获得最高质量。
  • base64(boolean) - 是否还包含Base64格式的图像数据。
  • exif(boolean) - 是否也包含图像的EXIF数据。

返回
返回解析为对象的Promise:{uri,width,height,exif,base64}其中uri是本地图像文件的URI(可用作Image元素的源)和width,height指定图像的尺寸。如果base64选项是true,则包含base64,并且是包含Base64中图像的JPEG数据的字符串(预先使用data:image / jpg; base64)来获取数据URI,您可以将其用作源例如,一个Image元素。如果exif选项是真true,则包含exif,并且是包含图像的EXIF数据的对象 - 其属性的名称是EXIF标签,其值是这些标签的值。

本地图像URI是临时的。使用Expo.FileSystem.copyAsync制作图像的永久副本。

recordAsync
开始录制将保存到缓存目录的视频。旋转视频以匹配设备的方向。在录制过程中翻转相机会导致停止。

参数
options(object) -

选项图:

  • quality (VideoQuality) - 指定录制视频的质量。用法:Camera.Constants.VideoQuality ['<value>'],可能的值:用于16:9分辨率2160p,1080p,720p,480p(仅限Android)和4:3 4:3(大小为640x480)。如果所选质量不适用于设备,则选择最高可用质量。
  • maxDuration(数字) - 以秒为单位的最大视频持续时间。
  • maxFileSize(数字) - 最大视频文件大小(以字节为单位)。
  • mute (boolean) 静音(布尔) - 如果存在,视频将被录制,没有声音。

返回
返回解析为包含视频文件uri属性的对象的Promise。如果调用stopRecording,则返回Promise,达到maxDuration和maxFileSize之一或停止相机预览。

stopRecording
如果正在进行,停止录制。

getSupportedRatiosAsync
仅限Android。获取设备支持的纵横比,可以通过比例prop传递。

返回
返回解析为表示比率的字符串数组的Promise,例如。 ['4:3','1:1']。

支持的条码格式

有时当ITF-14条形码被识别时,它的类型被设置为交错2of5。


下一张继续介绍,这一篇主要介绍了:expo sdk api之 ImagePickerImageManipulatorCamera欢迎大家关注我的微信公众号,这篇文章是否被大家认可,我的衡量标准就是公众号粉丝增长人数。欢迎大家转载,但必须保留本人博客链接!

 

Expo大作战(三十六)--expo sdk api之 ImagePicker,ImageManipulator,Camera的更多相关文章

  1. Expo大作战(三十九)--expo sdk api之 DocumentPicker,Contacts(获取手机联系人信息),Branch

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  2. Expo大作战(三十八)--expo sdk api之 FileSystem(文件操作系统)

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  3. Expo大作战(三十五)--expo sdk api之Location!

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  4. Expo大作战(三十四)--expo sdk api之LinearGradient(线性渐变),KeepAwake(保持屏幕不休眠),IntentLauncherAndroid,Gyroscope,

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  5. Expo大作战(三十二)--expo sdk api之Noifications

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  6. Expo大作战(二十六)--expo sdk api之Video和WebBrowser

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  7. Expo大作战(三十)--expo sdk api之Permissions(权限管理模块),Pedometer(计步器api)

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  8. Expo大作战(二十九)--expo sdk api之registerRootComponent(注册跟组件),ScreenOrientation(屏幕切换),SecureStore,

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  9. Expo大作战(二十八)--expo sdk api之Speach(语音文字转换),Segment

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

随机推荐

  1. python实用基本之--golb.glob

    python的强大的原因就是有很多非常实用的模块.今天用到了一个读取文件内容的小模块,做个记录: #!/usr/bin/python # -*- coding: utf-8 -*- import os ...

  2. 使用autogen生成应用程序遇到问题及解决方法

    从github上下载的代码,运行autogen.sh的时候,上报错误: $ ./autogen.sh --prefix=/usr./autogen.sh: 10: ./autogen.sh: auto ...

  3. Testing - 软件测试知识梳理 - 相关词汇

    测试策略 描述测试工程的总体方法和目标:根据测试需求,描述在什么测试阶,依据什么测试要素和目标,进行什么种类的测试,使用什么样的测试方法和工具. 测试策略的制定主要包含如下内容: 确定测试过程要使用的 ...

  4. 在word 2010中采用EndNote X7插入引用

    本文只供入门操作,记于此以防自己忘记,或帮助走过路过的你解决一时之需,即便是只能帮助到一个人,我的辛苦也就没有白费. 用EndNote向Word中直接插入参考文献能极大的提高论文写作的速度.在此以En ...

  5. 使用Jexus服务器运行Asp.Net Core2.0程序

    前段时间写了篇关于.net core跨平台部署的文章.https://my.oschina.net/lichaoqiang/blog/1861977 主要讲述了,利用Nginx+CentOS+Supe ...

  6. 使用InstallUtil发布windows服务

    发布Windows Service的方法 1. 在默认窗口Service1中右键Add Install,自动生成两个类. 2. 修改serviceInstaller1的属性:  a)ServiceNa ...

  7. 扩展方法IEnumerable<T>转换为IList<SelectListItem> ,提供@Html.DropDownList使用

    由于在MVC中经常会使用到@Html.DropDownList方法,而该方法接收的是List<SelectListItem> 参数,因此就想着写一个扩展方法,直接把IEnumerable转 ...

  8. Kafka实战解惑

    目录 一. kafka简介二. Kafka架构方案三. Kafka安装四. Kafka Client API 4.1 Producers API 4.2 Consumers API 4.3 消息高可靠 ...

  9. SpringBoot 三种方式配置 Druid(包括纯配置文件配置)

    记录一下在项目中用纯 YML(application.yml 或者 application.properties)文件.Java 代码配置 Bean 和注解三种方式配置 Alibaba Druid 用 ...

  10. 动态规划法(五)钢条切割问题(rod cutting problem)

      继续讲故事~~   我们的主人公现在已经告别了生于斯,长于斯的故乡,来到了全国最大的城市S市.这座S市,位于国家的东南部,是全国的经济中心,工商业极为发达,是这个国家的人民所向往的城市.这个到处都 ...