Add resize mode cover/contain (#644)
* Add resize mode cover/contain * Add resize to simulator, change type enum and add listener for resize * Add resize to camera example * Add description of resizeMode to readme * Add description of resizeMode to readme * Update ios/ReactNativeCameraKit/CameraView.swift --------- Co-authored-by: Seph Soliman <github@seph.dk>
This commit is contained in:
parent
eb96b531ac
commit
80c517dc68
59
README.md
59
README.md
@ -55,9 +55,10 @@ https://github.com/zoontek/react-native-permissions#ios-flow
|
||||
### Why no permissions API?
|
||||
|
||||
Conceptually, permissions are simple: Granted / Denied.
|
||||
However, in reality it's not that simple due to privacy enhancements on iOS and Android.
|
||||
However, in reality it's not that simple due to privacy enhancements on iOS and Android.
|
||||
|
||||
[Here's an example diagram from react-native-permissions's README](https://github.com/zoontek/react-native-permissions#ios-flow), which illustrates the complexity of the user-experience, which we don't want to duplicate in a camera library:
|
||||
|
||||
```
|
||||
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
|
||||
┃ check(PERMISSIONS.IOS.CAMERA) ┃
|
||||
@ -149,7 +150,7 @@ import { Camera, CameraType } from 'react-native-camera-kit';
|
||||
<Camera
|
||||
ref={(ref) => (this.camera = ref)}
|
||||
cameraType={CameraType.Back} // front/back(default)
|
||||
flashMode='auto'
|
||||
flashMode="auto"
|
||||
/>
|
||||
```
|
||||
|
||||
@ -171,34 +172,35 @@ Additionally, the Camera can be used for barcode scanning
|
||||
|
||||
### Camera Props (Optional)
|
||||
|
||||
| Props | Type | Description |
|
||||
| ------------------------------ | -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `ref` | Ref | Reference on the camera view |
|
||||
| `style` | StyleProp\<ViewStyle> | Style to apply on the camera view |
|
||||
| `flashMode` | `'on'`/`'off'`/`'auto'` | Camera flash mode. Default: `auto` |
|
||||
| `focusMode` | `'on'`/`'off'` | Camera focus mode. Default: `on` |
|
||||
| `zoomMode` | `'on'`/`'off'` | Enable the pinch to zoom gesture. Default: `on` |
|
||||
| `zoom` | `number` | Control the zoom. Default: `1.0` |
|
||||
| `maxZoom` | `number` | Maximum zoom allowed (but not beyond what camera allows). Default: `undefined` (camera default max) |
|
||||
| `onZoom` | Function | Callback when user makes a pinch gesture, regardless of what the `zoom` prop was set to. Returned event contains `zoom`. Ex: `onZoom={(e) => console.log(e.nativeEvent.zoom)}`. |
|
||||
| `torchMode` | `'on'`/`'off'` | Toggle flash light when camera is active. Default: `off` |
|
||||
| `cameraType` | CameraType.Back/CameraType.Front | Choose what camera to use. Default: `CameraType.Back` |
|
||||
| `onOrientationChange` | Function | Callback when physical device orientation changes. Returned event contains `orientation`. Ex: `onOrientationChange={(event) => console.log(event.nativeEvent.orientation)}`. Use `import { Orientation } from 'react-native-camera-kit'; if (event.nativeEvent.orientation === Orientation.PORTRAIT) { ... }` to understand the new value |
|
||||
| **Android only** |
|
||||
| `onError` | Function | Android only. Callback when camera fails to initialize. Ex: `onError={(e) => console.log(e.nativeEvent.errorMessage)}`. |
|
||||
| `shutterPhotoSound` | `boolean` | Android only. Enable or disable the shutter sound when capturing a photo. Default: `true` |
|
||||
| Props | Type | Description |
|
||||
| ------------------------------ | -------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| `ref` | Ref | Reference on the camera view |
|
||||
| `style` | StyleProp\<ViewStyle> | Style to apply on the camera view |
|
||||
| `flashMode` | `'on'`/`'off'`/`'auto'` | Camera flash mode. Default: `auto` |
|
||||
| `focusMode` | `'on'`/`'off'` | Camera focus mode. Default: `on` |
|
||||
| `zoomMode` | `'on'`/`'off'` | Enable the pinch to zoom gesture. Default: `on` |
|
||||
| `zoom` | `number` | Control the zoom. Default: `1.0` |
|
||||
| `maxZoom` | `number` | Maximum zoom allowed (but not beyond what camera allows). Default: `undefined` (camera default max) |
|
||||
| `onZoom` | Function | Callback when user makes a pinch gesture, regardless of what the `zoom` prop was set to. Returned event contains `zoom`. Ex: `onZoom={(e) => console.log(e.nativeEvent.zoom)}`. |
|
||||
| `torchMode` | `'on'`/`'off'` | Toggle flash light when camera is active. Default: `off` |
|
||||
| `cameraType` | CameraType.Back/CameraType.Front | Choose what camera to use. Default: `CameraType.Back` |
|
||||
| `onOrientationChange` | Function | Callback when physical device orientation changes. Returned event contains `orientation`. Ex: `onOrientationChange={(event) => console.log(event.nativeEvent.orientation)}`. Use `import { Orientation } from 'react-native-camera-kit'; if (event.nativeEvent.orientation === Orientation.PORTRAIT) { ... }` to understand the new value |
|
||||
| **Android only** |
|
||||
| `onError` | Function | Android only. Callback when camera fails to initialize. Ex: `onError={(e) => console.log(e.nativeEvent.errorMessage)}`. |
|
||||
| `shutterPhotoSound` | `boolean` | Android only. Enable or disable the shutter sound when capturing a photo. Default: `true` |
|
||||
| **iOS only** |
|
||||
| `ratioOverlay` | `'int:int'` | Show a guiding overlay in the camera preview for the selected ratio. Does not crop image as of v9.0. Example: `'16:9'` |
|
||||
| `ratioOverlayColor` | Color | Any color with alpha. Default: `'#ffffff77'` |
|
||||
| `resetFocusTimeout` | `number` | Dismiss tap to focus after this many milliseconds. Default `0` (disabled). Example: `5000` is 5 seconds. |
|
||||
| `resetFocusWhenMotionDetected` | Boolean | Dismiss tap to focus when focus area content changes. Native iOS feature, see documentation: https://developer.apple.com/documentation/avfoundation/avcapturedevice/1624644-subjectareachangemonitoringenabl?language=objc). Default `true`. |
|
||||
| `scanThrottleDelay` | `number` | Duration between scan detection in milliseconds. Default 2000 (2s) |
|
||||
| `ratioOverlay` | `'int:int'` | Show a guiding overlay in the camera preview for the selected ratio. Does not crop image as of v9.0. Example: `'16:9'` |
|
||||
| `ratioOverlayColor` | Color | Any color with alpha. Default: `'#ffffff77'` |
|
||||
| `resetFocusTimeout` | `number` | Dismiss tap to focus after this many milliseconds. Default `0` (disabled). Example: `5000` is 5 seconds. |
|
||||
| `resetFocusWhenMotionDetected` | Boolean | Dismiss tap to focus when focus area content changes. Native iOS feature, see documentation: https://developer.apple.com/documentation/avfoundation/avcapturedevice/1624644-subjectareachangemonitoringenabl?language=objc). Default `true`. |
|
||||
| `resizeMode` | `'cover' / 'contain'` | Determines the scaling and cropping behavior of content within the view. `cover` (resizeAspectFill on iOS) scales the content to fill the view completely, potentially cropping content if its aspect ratio differs from the view. `contain` (resizeAspect on iOS) scales the content to fit within the view's bounds without cropping, ensuring all content is visible but may introduce letterboxing. Default behavior depends on the specific use case. |
|
||||
| `scanThrottleDelay` | `number` | Duration between scan detection in milliseconds. Default 2000 (2s) |
|
||||
| **Barcode only** |
|
||||
| `scanBarcode` | `boolean` | Enable barcode scanner. Default: `false` |
|
||||
| `showFrame` | `boolean` | Show frame in barcode scanner. Default: `false` |
|
||||
| `laserColor` | Color | Color of barcode scanner laser visualization. Default: `red` |
|
||||
| `frameColor` | Color | Color of barcode scanner frame visualization. Default: `yellow` |
|
||||
| `onReadCode` | Function | Callback when scanner successfully reads barcode. Returned event contains `codeStringValue`. Default: `null`. Ex: `onReadCode={(event) => console.log(event.nativeEvent.codeStringValue)}` |
|
||||
| `scanBarcode` | `boolean` | Enable barcode scanner. Default: `false` |
|
||||
| `showFrame` | `boolean` | Show frame in barcode scanner. Default: `false` |
|
||||
| `laserColor` | Color | Color of barcode scanner laser visualization. Default: `red` |
|
||||
| `frameColor` | Color | Color of barcode scanner frame visualization. Default: `yellow` |
|
||||
| `onReadCode` | Function | Callback when scanner successfully reads barcode. Returned event contains `codeStringValue`. Default: `null`. Ex: `onReadCode={(event) => console.log(event.nativeEvent.codeStringValue)}` |
|
||||
|
||||
### Imperative API
|
||||
|
||||
@ -269,7 +271,6 @@ If you are using Expo Managed Workflow, you can use this library with a third-pa
|
||||
|
||||
[See more here](https://github.com/avantstay/expo-react-native-camera-kit)
|
||||
|
||||
|
||||
## Contributing
|
||||
|
||||
- Pull Requests are welcome, if you open a pull request we will do our best to get to it in a timely manner
|
||||
|
||||
BIN
example/images/resize.png
Normal file
BIN
example/images/resize.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 587 B |
@ -36,6 +36,7 @@ const CameraExample = ({ onBack }: { onBack: () => void }) => {
|
||||
const [showImageUri, setShowImageUri] = useState<string>('');
|
||||
const [zoom, setZoom] = useState<number | undefined>();
|
||||
const [orientationAnim] = useState(new Animated.Value(3));
|
||||
const [resize, setResize] = useState<'contain' | 'cover'>('contain');
|
||||
|
||||
// iOS will error out if capturing too fast,
|
||||
// so block capturing until the current capture is done
|
||||
@ -65,6 +66,14 @@ const CameraExample = ({ onBack }: { onBack: () => void }) => {
|
||||
setFlashData(flashArray[newPosition]);
|
||||
};
|
||||
|
||||
const onSetResize = () => {
|
||||
if (resize === 'contain') {
|
||||
setResize('cover');
|
||||
} else {
|
||||
setResize('contain');
|
||||
}
|
||||
};
|
||||
|
||||
const onSetTorch = () => {
|
||||
setTorchMode(!torchMode);
|
||||
};
|
||||
@ -91,13 +100,37 @@ const CameraExample = ({ onBack }: { onBack: () => void }) => {
|
||||
console.log('image', image);
|
||||
};
|
||||
|
||||
function CaptureButton({ onPress, children }: { onPress: () => void, children?: React.ReactNode }) {
|
||||
const w = 80, brdW = 4, spc = 6;
|
||||
const cInner = 'white', cOuter = 'white';
|
||||
function CaptureButton({ onPress, children }: { onPress: () => void; children?: React.ReactNode }) {
|
||||
const w = 80,
|
||||
brdW = 4,
|
||||
spc = 6;
|
||||
const cInner = 'white',
|
||||
cOuter = 'white';
|
||||
return (
|
||||
<TouchableOpacity onPress={onPress} style={{ width: w, height: w }}>
|
||||
<View style={{ position: 'absolute', left: 0, top: 0, width: w, height: w, borderColor: cOuter, borderWidth: brdW, borderRadius: w / 2 }} />
|
||||
<View style={{ position: 'absolute', left: brdW + spc, top: brdW + spc, width: w - ((brdW + spc) * 2), height: w - ((brdW + spc) * 2), backgroundColor: cInner, borderRadius: (w - ((brdW + spc) * 2)) / 2 }} />
|
||||
<View
|
||||
style={{
|
||||
position: 'absolute',
|
||||
left: 0,
|
||||
top: 0,
|
||||
width: w,
|
||||
height: w,
|
||||
borderColor: cOuter,
|
||||
borderWidth: brdW,
|
||||
borderRadius: w / 2,
|
||||
}}
|
||||
/>
|
||||
<View
|
||||
style={{
|
||||
position: 'absolute',
|
||||
left: brdW + spc,
|
||||
top: brdW + spc,
|
||||
width: w - (brdW + spc) * 2,
|
||||
height: w - (brdW + spc) * 2,
|
||||
backgroundColor: cInner,
|
||||
borderRadius: (w - (brdW + spc) * 2) / 2,
|
||||
}}
|
||||
/>
|
||||
{children}
|
||||
</TouchableOpacity>
|
||||
);
|
||||
@ -111,7 +144,7 @@ const CameraExample = ({ onBack }: { onBack: () => void }) => {
|
||||
inputRange: [1, 4],
|
||||
outputRange: ['180deg', '-90deg'],
|
||||
});
|
||||
const uiRotationStyle = rotateUi ? {transform: [{ rotate: uiRotation }]} : undefined;
|
||||
const uiRotationStyle = rotateUi ? { transform: [{ rotate: uiRotation }] } : undefined;
|
||||
|
||||
function rotateUiTo(rotationValue: number) {
|
||||
Animated.timing(orientationAnim, {
|
||||
@ -128,12 +161,20 @@ const CameraExample = ({ onBack }: { onBack: () => void }) => {
|
||||
<SafeAreaView style={styles.topButtons}>
|
||||
{flashData.image && (
|
||||
<TouchableOpacity style={styles.topButton} onPress={onSetFlash}>
|
||||
<Animated.Image source={flashData.image} resizeMode="contain" style={[styles.topButtonImg, uiRotationStyle]} />
|
||||
<Animated.Image
|
||||
source={flashData.image}
|
||||
resizeMode="contain"
|
||||
style={[styles.topButtonImg, uiRotationStyle]}
|
||||
/>
|
||||
</TouchableOpacity>
|
||||
)}
|
||||
|
||||
<TouchableOpacity style={styles.topButton} onPress={onSwitchCameraPressed}>
|
||||
<Animated.Image source={require('../images/cameraFlipIcon.png')} resizeMode="contain" style={[styles.topButtonImg, uiRotationStyle]} />
|
||||
<Animated.Image
|
||||
source={require('../images/cameraFlipIcon.png')}
|
||||
resizeMode="contain"
|
||||
style={[styles.topButtonImg, uiRotationStyle]}
|
||||
/>
|
||||
</TouchableOpacity>
|
||||
|
||||
<TouchableOpacity style={styles.topButton} onPress={() => setZoom(1)}>
|
||||
@ -149,6 +190,14 @@ const CameraExample = ({ onBack }: { onBack: () => void }) => {
|
||||
style={[styles.topButtonImg, uiRotationStyle]}
|
||||
/>
|
||||
</TouchableOpacity>
|
||||
|
||||
<TouchableOpacity style={styles.topButton} onPress={onSetResize}>
|
||||
<Animated.Image
|
||||
source={require('../images/resize.png')}
|
||||
resizeMode="contain"
|
||||
style={[styles.topButtonImg, uiRotationStyle]}
|
||||
/>
|
||||
</TouchableOpacity>
|
||||
</SafeAreaView>
|
||||
|
||||
<View style={styles.cameraContainer}>
|
||||
@ -160,6 +209,7 @@ const CameraExample = ({ onBack }: { onBack: () => void }) => {
|
||||
style={styles.cameraPreview}
|
||||
cameraType={cameraType}
|
||||
flashMode={flashData?.mode}
|
||||
resizeMode={resize}
|
||||
resetFocusWhenMotionDetected
|
||||
zoom={zoom}
|
||||
maxZoom={10}
|
||||
@ -265,7 +315,7 @@ const styles = StyleSheet.create({
|
||||
flex: 1,
|
||||
},
|
||||
cameraPreview: {
|
||||
aspectRatio: 3 / 4,
|
||||
flex: 1,
|
||||
width: '100%',
|
||||
},
|
||||
bottomButtons: {
|
||||
|
||||
@ -20,6 +20,7 @@ RCT_EXPORT_VIEW_PROPERTY(flashMode, CKFlashMode)
|
||||
RCT_EXPORT_VIEW_PROPERTY(torchMode, CKTorchMode)
|
||||
RCT_EXPORT_VIEW_PROPERTY(ratioOverlay, NSString)
|
||||
RCT_EXPORT_VIEW_PROPERTY(ratioOverlayColor, UIColor)
|
||||
RCT_EXPORT_VIEW_PROPERTY(resizeMode, CKResizeMode)
|
||||
|
||||
RCT_EXPORT_VIEW_PROPERTY(scanBarcode, BOOL)
|
||||
RCT_EXPORT_VIEW_PROPERTY(onReadCode, RCTDirectEventBlock)
|
||||
|
||||
@ -41,4 +41,9 @@ RCT_ENUM_CONVERTER(CKZoomMode, (@{
|
||||
@"off": @(CKZoomModeOff)
|
||||
}), CKZoomModeOn, integerValue)
|
||||
|
||||
RCT_ENUM_CONVERTER(CKResizeMode, (@{
|
||||
@"cover": @(CKResizeModeCover),
|
||||
@"contain": @(CKResizeModeContain)
|
||||
}), CKResizeModeCover, integerValue)
|
||||
|
||||
@end
|
||||
|
||||
@ -18,6 +18,7 @@ protocol CameraProtocol: AnyObject, FocusInterfaceViewDelegate {
|
||||
func update(onZoom: RCTDirectEventBlock?)
|
||||
func update(zoom: Double?)
|
||||
func update(maxZoom: Double?)
|
||||
func update(resizeMode: ResizeMode)
|
||||
|
||||
func zoomPinchStart()
|
||||
func zoomPinchChange(pinchScale: CGFloat)
|
||||
|
||||
@ -33,6 +33,7 @@ class CameraView: UIView {
|
||||
// props
|
||||
// camera settings
|
||||
@objc var cameraType: CameraType = .back
|
||||
@objc var resizeMode: ResizeMode = .contain
|
||||
@objc var flashMode: FlashMode = .auto
|
||||
@objc var torchMode: TorchMode = .off
|
||||
// ratio overlay
|
||||
@ -163,6 +164,10 @@ class CameraView: UIView {
|
||||
if changedProps.contains("onZoom") {
|
||||
camera.update(onZoom: onZoom)
|
||||
}
|
||||
|
||||
if changedProps.contains("resizeMode") {
|
||||
camera.update(resizeMode: resizeMode)
|
||||
}
|
||||
|
||||
// Ratio overlay
|
||||
if changedProps.contains("ratioOverlay") {
|
||||
|
||||
@ -30,6 +30,7 @@ class RealCamera: NSObject, CameraProtocol, AVCaptureMetadataOutputObjectsDelega
|
||||
private let photoOutput = AVCapturePhotoOutput()
|
||||
private let metadataOutput = AVCaptureMetadataOutput()
|
||||
|
||||
private var resizeMode: ResizeMode = .contain
|
||||
private var flashMode: FlashMode = .auto
|
||||
private var torchMode: TorchMode = .off
|
||||
private var resetFocus: (() -> Void)?
|
||||
@ -295,6 +296,17 @@ class RealCamera: NSObject, CameraProtocol, AVCaptureMetadataOutputObjectsDelega
|
||||
}
|
||||
}
|
||||
|
||||
func update(resizeMode: ResizeMode) {
|
||||
DispatchQueue.main.async {
|
||||
switch resizeMode {
|
||||
case .cover:
|
||||
self.cameraPreview.previewLayer.videoGravity = .resizeAspectFill
|
||||
case .contain:
|
||||
self.cameraPreview.previewLayer.videoGravity = .resizeAspect
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func capturePicture(onWillCapture: @escaping () -> Void,
|
||||
onSuccess: @escaping (_ imageData: Data, _ thumbnailData: Data?, _ dimensions: CMVideoDimensions) -> Void,
|
||||
onError: @escaping (_ message: String) -> Void) {
|
||||
|
||||
@ -17,6 +17,7 @@ class SimulatorCamera: CameraProtocol {
|
||||
private var wideAngleZoomFactor: Double = 2.0
|
||||
private var zoom: Double?
|
||||
private var maxZoom: Double?
|
||||
private var resizeMode: ResizeMode = .contain
|
||||
|
||||
var previewView: UIView { mockPreview }
|
||||
|
||||
@ -127,7 +128,6 @@ class SimulatorCamera: CameraProtocol {
|
||||
func update(cameraType: CameraType) {
|
||||
DispatchQueue.main.async {
|
||||
self.mockPreview.cameraTypeLabel.text = "Camera type: \(cameraType)"
|
||||
|
||||
self.mockPreview.randomize()
|
||||
}
|
||||
}
|
||||
@ -161,6 +161,14 @@ class SimulatorCamera: CameraProtocol {
|
||||
}
|
||||
}
|
||||
|
||||
func update(resizeMode: ResizeMode) {
|
||||
DispatchQueue.main.async {
|
||||
self.mockPreview.resizeModeLabel.text = "Resize mode: \(resizeMode)"
|
||||
self.mockPreview.randomize()
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
func isBarcodeScannerEnabled(_ isEnabled: Bool,
|
||||
supportedBarcodeTypes: [CodeFormat],
|
||||
onBarcodeRead: ((_ barcode: String,_ codeFormat:CodeFormat) -> Void)?) {}
|
||||
|
||||
@ -11,6 +11,7 @@ class SimulatorPreviewView: UIView {
|
||||
let torchModeLabel = UILabel()
|
||||
let flashModeLabel = UILabel()
|
||||
let cameraTypeLabel = UILabel()
|
||||
let resizeModeLabel = UILabel()
|
||||
|
||||
var balloonLayer = CALayer()
|
||||
|
||||
@ -30,7 +31,7 @@ class SimulatorPreviewView: UIView {
|
||||
stackView.translatesAutoresizingMaskIntoConstraints = false
|
||||
stackView.topAnchor.constraint(equalTo: safeAreaLayoutGuide.topAnchor).isActive = true
|
||||
stackView.leadingAnchor.constraint(equalTo: leadingAnchor, constant: 10).isActive = true
|
||||
[zoomLabel, focusAtLabel, torchModeLabel, flashModeLabel, cameraTypeLabel].forEach {
|
||||
[zoomLabel, focusAtLabel, torchModeLabel, flashModeLabel, cameraTypeLabel, resizeModeLabel].forEach {
|
||||
$0.numberOfLines = 0
|
||||
stackView.addArrangedSubview($0)
|
||||
}
|
||||
|
||||
@ -105,6 +105,19 @@ public enum ZoomMode: Int, CustomStringConvertible {
|
||||
}
|
||||
}
|
||||
|
||||
@objc(CKResizeMode)
|
||||
public enum ResizeMode: Int, CustomStringConvertible {
|
||||
case cover
|
||||
case contain
|
||||
|
||||
public var description: String {
|
||||
switch self {
|
||||
case .cover: return "cover"
|
||||
case .contain: return "contain"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@objc(CKSetupResult)
|
||||
enum SetupResult: Int {
|
||||
case notStarted
|
||||
|
||||
3
src/Camera.d.ts
vendored
3
src/Camera.d.ts
vendored
@ -1,4 +1,4 @@
|
||||
import { CameraApi, FlashMode, FocusMode, ZoomMode, TorchMode, CameraType, CodeFormat } from './types';
|
||||
import { CameraApi, FlashMode, FocusMode, ZoomMode, TorchMode, CameraType, CodeFormat, ResizeMode } from './types';
|
||||
import { Orientation } from './index';
|
||||
|
||||
export type OnReadCodeData = {
|
||||
@ -96,6 +96,7 @@ export interface CameraProps {
|
||||
ratioOverlayColor?: number | string;
|
||||
resetFocusTimeout?: number;
|
||||
resetFocusWhenMotionDetected?: boolean;
|
||||
resizeMode?: ResizeMode;
|
||||
/** **iOS Only**. Throttle how often the barcode scanner triggers a new scan */
|
||||
scanThrottleDelay?: number;
|
||||
/** **Android only**. Play a shutter capture sound when capturing a photo */
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
import { NativeModules } from 'react-native';
|
||||
|
||||
import Camera from './Camera';
|
||||
import { CameraApi, CameraType, CaptureData, FlashMode, FocusMode, TorchMode, ZoomMode } from './types';
|
||||
import { CameraApi, CameraType, CaptureData, FlashMode, FocusMode, TorchMode, ZoomMode, ResizeMode } from './types';
|
||||
|
||||
const { CameraKit } = NativeModules;
|
||||
|
||||
@ -15,4 +15,4 @@ export const Orientation = {
|
||||
|
||||
export default CameraKit;
|
||||
|
||||
export { Camera, CameraType, TorchMode, FlashMode, FocusMode, ZoomMode, CameraApi, CaptureData };
|
||||
export { Camera, CameraType, TorchMode, FlashMode, FocusMode, ZoomMode, CameraApi, CaptureData, ResizeMode };
|
||||
|
||||
@ -13,6 +13,8 @@ export type FocusMode = 'on' | 'off';
|
||||
|
||||
export type ZoomMode = 'on' | 'off';
|
||||
|
||||
export type ResizeMode = 'cover' | 'contain';
|
||||
|
||||
export type CaptureData = {
|
||||
uri: string;
|
||||
name: string;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user