Skip to content

Instantly share code, notes, and snippets.

@rdelrosario
Last active August 17, 2017 05:15
Show Gist options
  • Save rdelrosario/55d48380000bf7809bab59109318aba9 to your computer and use it in GitHub Desktop.
Save rdelrosario/55d48380000bf7809bab59109318aba9 to your computer and use it in GitHub Desktop.
using System;
using OverlayCameraSample.Controls;
using OverlayCameraSample.Droid.Renderers;
using OverlayCameraSample.Droid.Views;
using Xamarin.Forms;
using Xamarin.Forms.Platform.Android;
using static OverlayCameraSample.Droid.Views.BaseCameraView;
using Android.OS;
[assembly: ExportRenderer(typeof(CameraPreview), typeof(CameraPreviewRenderer))]
namespace OverlayCameraSample.Droid.Renderers
{
public class CameraPreviewRenderer : ViewRenderer<CameraPreview, BaseCameraView>
{
public CameraImplementation CameraImplementation { get; }
BaseCameraView cameraPreview;
public CameraPreviewRenderer()
{
CameraImplementation = (Build.VERSION.SdkInt >= BuildVersionCodes.Lollipop) ? CameraImplementation.NewCamera2API
: CameraImplementation.DefaultCameraAPI;
}
protected override void OnElementChanged(ElementChangedEventArgs<OverlayCameraSample.Controls.CameraPreview> e)
{
base.OnElementChanged(e);
if (Control == null)
{
var camFacing = ((Element.Camera == OverlayCameraSample.Controls.CameraOptions.Front) ? Android.Hardware.CameraFacing.Front : Android.Hardware.CameraFacing.Back);
switch (CameraImplementation)
{
case CameraImplementation.DefaultCameraAPI:
cameraPreview = new CameraView(Context, camFacing, Element?.ShowCircleOverlayMask ?? false, Element.CameraMode);
break;
case CameraImplementation.NewCamera2API:
cameraPreview = new Camera2View(Context, camFacing, Element?.ShowCircleOverlayMask ?? false, Element.CameraMode);
break;
}
SetNativeControl(cameraPreview);
}
if (e.OldElement != null)
{
// Unsubscribe
cameraPreview.ImageCaptured -= OnImageCaptured;
}
if (e.NewElement != null)
{
try
{
cameraPreview.FaceOverlayColor = Element.CircleOverlayColor.ToAndroid();
cameraPreview.FaceOverlayOpacity = Element.CircleOverlayOpacity;
cameraPreview.StopOnCapture = Element.CameraStopOnImageCapture;
Element.TakePictureCommand = new Command(() => Control.CaptureImage());
Element.PrepareCameraCommand = new Command(() => cameraPreview.StartCamera());
Element.StopCameraCommand = new Command(() => cameraPreview.StopCamera());
}
catch (Exception ex)
{
System.Diagnostics.Debug.WriteLine(ex.Message);
}
// Subscribe
cameraPreview.ImageCaptured += OnImageCaptured;
}
}
protected override void OnElementPropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
base.OnElementPropertyChanged(sender, e);
if (OverlayCameraSample.Controls.CameraPreview.FlashProperty.PropertyName == e.PropertyName)
{
cameraPreview.SwitchFlash(Element.Flash);
}
else if (OverlayCameraSample.Controls.CameraPreview.CameraProperty.PropertyName == e.PropertyName)
{
Element.Flash = false;
cameraPreview.FlipCamera();
}
else if (OverlayCameraSample.Controls.CameraPreview.ShowCircleOverlayMaskProperty.PropertyName == e.PropertyName)
{
cameraPreview.ShowOverlay = Element.ShowCircleOverlayMask;
}
else if (OverlayCameraSample.Controls.CameraPreview.CircleOverlayColorProperty.PropertyName == e.PropertyName)
{
cameraPreview.FaceOverlayColor = Element.CircleOverlayColor.ToAndroid();
}
else if (OverlayCameraSample.Controls.CameraPreview.CircleOverlayOpacityProperty.PropertyName == e.PropertyName)
{
cameraPreview.FaceOverlayOpacity = Element.CircleOverlayOpacity;
}
else if (OverlayCameraSample.Controls.CameraPreview.CameraStopOnImageCaptureProperty.PropertyName == e.PropertyName)
{
cameraPreview.StopOnCapture = Element.CameraStopOnImageCapture;
}
}
void OnImageCaptured(object sender, Tuple<string, bool, long> imageParams)
{
Element?.OnPictureTaken(this, imageParams);
}
protected override void OnLayout(bool changed, int l, int t, int r, int b)
{
base.OnLayout(changed, l, t, r, b);
if (CameraImplementation == CameraImplementation.NewCamera2API)
{
var camera2Preview = cameraPreview as Camera2View;
camera2Preview?.OnLayout(l, t, r, b);
}
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
this.Control?.CloseCamera();
}
base.Dispose(disposing);
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment