CameraViewBase Constructor uno
Creates a new CameraViewBase
This package provides a cross-platform abstraction over the native camera APIs on Android and iOS. In order to use this package you must add a reference to Fuse.Controls.CameraView
in your unoproj
.
The CameraView
API is mostly exposed as a Promise
based API in JavaScript. Lets have a look at how to get up and running:
<DockPanel>
<NativeViewHost Dock="Fill">
<!-- The size and aspect of the camera live preview
does not always match they size your cameraview
is given by layout. Set stretchmode to either Uniform
or Fill to deal with this
-->
<CameraView ux:Name="_cameraView" StretchMode="Fill" />
<JavaScript>
var Observable = require("FuseJS/Observable");
var Camera = _cameraView;
// Observables for dealing with
// the different states of the camera
var captureMode = Observable();
var cameraFacing = Observable();
var flashMode = Observable();
var cameraReady = Observable(false);
// getCamereInfo will resolve when the camera is fully loaded
Camera.getCameraInfo()
.then(function(info) {
captureMode.value = info[Camera.INFO_CAPTURE_MOE];
cameraFacing.value = info[Camera.INFO_CAMERA_FACING];
flashMode.value = info[Camera.INFO_FLASH_MODE];
cameraReady.value = true;
})
.catch(function(error) {
console.log("Failed to get camera info: " + error);
});
</JavaScript>
</NativeViewHost>
</DockPanel>
The <CameraView />
tag is the UI element that will display a live preview from the camera. The camera is loading asynchronously and the getCameraInfo
promise wont resolve until it is loaded. This can be used to reflect if the camera is ready and its initial state in your UI.
To capture a photo, make sure the camera is loaded as discussed above and set its capture mode to photo. If a photo capture was successful you will get an object representing the native photo result, you can call save()
to store the photo on disk and get a filepath. A photo may require a lot of memory on your device, make sure to call release()
on it when you are done using it. It is considered bad practice to keep many photo objects around as this can lead to out-of-memory crashes.
Camera.setCaptureMode(Camera.CAPTURE_MODE_PHOTO)
.then(function(newCaptureMode) { /* ready to capture photo */ })
.catch(function(error) { /* failed */ });
function capturePhoto() {
Camera.capturePhoto()
.then(function(photo) {
photo.save()
.then(function(filePath) {
console.log("Photo saved to: " + filePath);
photo.release();
})
.catch(function(error) {
console.log("Failed to save photo: " + error);
photo.release();
});
})
.catch(function(error) {
console.log("Failed to capture photo: " + error);
});
}
Make sure the capture mode is set to video. When you start a recording you get a session object which you need to hold onto. When you call stop()
on the recording session you will get a file path to the result.
Camera.setCaptureMode(Camera.CAPTURE_MODE_VIDEO)
.then(function(newCaptureMode) { /* ready to record video */ })
.catch(function(error) { /* failed */ });
var recordingSession = null;
function startRecording() {
Camera.startRecording()
.then(function(session) {
console.log("Video recording started!");
recordingSession = session;
})
.catch(function(error) {
console.log("Failed to start recording: " + error);
});
}
function stopRecording() {
if (session == null)
return;
session.stop()
.then(function(recording) {
console.log("Recording stopped, saved to: " + recording.filePath());
session = null;
})
.catch(function(error) {
console.log("Failed to stop recording: " + error);
session = null;
});
}
You can change the camera facing when the camera is not busy. For example, you cannot change camera facing while recording video or capturing a photo.
var currentFacing = Camera.CAMERA_FACING_BACK;
function flipFacing() {
var facing = currentFacing == Camera.CAMERA_FACING_BACK
? Camera.CAMERA_FACING_FRONT
: Camera.CAMERA_FACING_BACK;
Camera.setCameraFacing(facing)
.then(function(newCameraFacing) {
console.log("Camera facing set to: " + newCameraFacing);
})
.catch(function(error) {
console.log("Failed to set camera facing: " + error);
});
}
On iOS you cannot specify an output resoltuion for captured photos, however on Android you must specify what resolution you want your photos captured in. There is no sensible default value, so if not explicilty set this abstraction will chose a resolution based on the current aspect ratio of your <CameraView />
. But you have the option to set this yourself, although that code will only work on Android.
Camera.getCameraInfo()
.then(function(info) {
// If we are running on android, the info object should contain
// an array of available resolutions for the current camera facing
if (Camera.INFO_PHOTO_RESOLUTIONS in info) {
var supportedResolutions = info[Camera.INFO_PHOTO_RESOLUTIONS];
// Make a function that picks the resolution you want
var resolution = pickResolution(supportedResolutions);
// Put your resolution in an object with the photo resolution key
var options = {};
options[Camera.OPTION_PHOTO_RESOLUTION] = resolution;
Camera.setPhotoOptions(options)
.then(function() { /* success */ })
.catch(function(error) {
console.log("Failed to set photo options: " + error);
});
}
});
Creates a new CameraViewBase
The Alignment of the Element
.
Determines how the aspect ratio is maintained in a situation when it violates the min or max sizing constraints.
The manner in which the size and position of the element is calculated.
Clips the child elements to the bounds of this element visually.
Specifies how hit tests should be performed on this element.
The height limit for an element using BoxSizing="Limit"
.
The width limit for an element using BoxSizing="Limit"
.
The Visibility of the Element
.
Begins removing a given node, playing all RemovedAnimations before actual removal.
Begins removing a given visual, playing all RemovedAnimations before actual removal.
Requests that this visual be brought into the visible are of the screen. Typically a containing
ScrollView
will scroll to ensure it is visible.
Brings the given child to the front of the Z-order. In UX markup, use the BringToFront trigger action instead.
The number of child nodes of this visual.
The children of the visual. All nodes placed inside the visual in UX markup are assigned to this list. The order of Visuals this list determines the order of layout. The Z-order of the children is by default equal to this order, but can be manipulated separately using methods like BringToFront and SendToBack.
Whether this visual has any visual child nodes.
Indicates the visual for this node has changed. This allows the root-level node to know that it must draw, and any caching that it must invalidate the cache for this node.
Indicates the composition of the visual has changed, but that the visual drawing itself is still valid (for example a position change).
Whether this node is in an enabled context.
The context is disabled if one of the ancestor nodes have IsEnabled set to false
.
Returns whether this visual is visible without concern for whether an ancestor visual is hidden or collapsed.
Returns whether this visual is currently visible. Will return false if any of the ancestor visuals are hidden or collapsed. This property can not be used to check whether a visual is hidden because it is occluded by another visual, or is outside the view but otherwise visible.
The layer this visual belongs to in the Parent container.
Describes how this visual participates in layout.
Converts a coordinate from the local space into the parent space.
The list of resources defined at this node.
Sends the given child to the back of the Z-order. In UX markup, use the SendToBack trigger action instead.
Whether to snap the result of layout of this visual to physical device pixels.
Converts a coordinate from the parent space into the local space.
The number of child visuals of this visual.
The list of bindings belonging to this node.
The context parent is the semantic parent of this node. It is where non-UI structure should be resolved, like looking for the DataContext, a Navigation, or other semantic item.
Finds the first node with a given name that satisfies the given acceptor. The serach algorithm works as follows: Nodes in the subtree are matched first, then it matches the nodes in the subtrees ofthe ancestor nodes by turn all the way to the root. If no matching node is found, the function returns null.
Whether rooting for this node is completed. Returns false if unrooting has started.
Whether rooting of this node has started. Note that even if this property returns true, rooting may not yet be completed for the node. See also IsRootingCompleted.
Run-time name of the node. This property is automatically set using the ux:Name attribute.
Returns the next sibling node of the given type.
If you override OnRooted
you must call base.OnRooted()
first in your derived class. No other processing should happen first, otherwise you might end up in an undefined state.
The parent Visual of this node. Will return null if the node is not rooted.
Returns the next sibling node of the given type.
A linked list holding data for extrinsic properties.
hide
hide
Interface for objects that can have a script engine representation
hide