在Xamarin中禁用触摸屏幕上的特定组件



这里是可复制的演示https://github.com/x0axz/CustomRenderer

在我的Xamarin应用程序中,有一个Android的自定义相机渲染器,它是通过MessagingCenter.Send<object>(this, "A");从Xaml调用的。

工作原理

通过点击按钮,相机预览停止&然后它执行所有的过程(拍照,存储等)。但是当我触摸相机预览区域时,它只会停止预览,不会做其他事情。因为有适当的事件调用后面按钮,没有任何后面的相机预览区域。

误差

点击相机预览区域后,当我点击按钮时,它没有找到任何打开的相机预览(因为之前通过点击它停止了预览),所以现在它抛出takePicture failed异常(它来自相机渲染器而不是按钮)。

相机预览视图

<local:CameraPreview
x:Name="CameraPreview"
Camera="Rear"/>
<<p>按钮代码/strong>
<Button
Clicked="Camera_Clicked">
</Button>
public void Camera_Clicked(object sender, EventArgs args)
{
try
{
MessagingCenter.Send<object>(this, "A");
}
catch (Exception error)
{
if (error.InnerException != null)
{
DisplayAlert("Error", error.InnerException.Message, "Ok");
}
}
}

CameraPreviewRenderer.cs

轻按"摄像机预览"区域,StopPreview()接收OnCameraPreviewClicked()的呼叫,停止预览。

public class CameraPreviewRenderer : ViewRenderer<Mobile.App.CameraPreview, CameraPreview>
{
CameraPreview cameraPreview;
public CameraPreviewRenderer(Context context) : base(context)
{
}
protected override void OnElementChanged(ElementChangedEventArgs<Mobile.App.CameraPreview> e)
{
base.OnElementChanged(e);
if (e.OldElement != null)
{
// Unsubscribe
cameraPreview.Click -= OnCameraPreviewClicked;
}
if (e.NewElement != null)
{
if (Control == null)
{
cameraPreview = new CameraPreview(Context);
SetNativeControl(cameraPreview);
}
e.NewElement.Subscribe += (sender, p) =>
{
Control.Preview = Camera.Open((int)e.NewElement.Camera);
Control.Subscribe();
};
e.NewElement.Unsubscribe += (sender, p) =>
{
Control.Preview.Release();
Control.Preview = null;
Control.Unsubscribe();
};
// Subscribe
cameraPreview.Click += OnCameraPreviewClicked;
}
}
void OnCameraPreviewClicked(object sender, EventArgs e)
{
if (cameraPreview.IsPreviewing)
{
cameraPreview.Preview.StopPreview();
cameraPreview.IsPreviewing = false;
}
else
{
cameraPreview.Preview.StartPreview();
cameraPreview.IsPreviewing = true;
}
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (Control.Preview != null)
{
Control.Preview.Release();
}
}
base.Dispose(disposing);
}
}

为了防止点击摄像头预览,您可以删除OnCameraPreviewClicked

您的CameraPreviewRender将像这样

public class CameraPreviewRenderer : ViewRenderer<CustomRenderer.CameraPreview, CustomRenderer.Droid.CameraPreview>
{
CameraPreview cameraPreview;
public CameraPreviewRenderer(Context context) : base(context)
{
}
protected override void OnElementChanged(ElementChangedEventArgs<CustomRenderer.CameraPreview> e)
{
base.OnElementChanged(e);
if (e.OldElement != null)
{
}
if (e.NewElement != null)
{
if (Control == null)
{
cameraPreview = new CameraPreview(Context);
SetNativeControl(cameraPreview);
}
e.NewElement.Subscribe += (sender, p) =>
{
Control.Preview = Camera.Open((int)e.NewElement.Camera);
Control.Subscribe();
};
e.NewElement.Unsubscribe += (sender, p) =>
{
Control.Preview.Release();
Control.Preview = null;
Control.Unsubscribe();
};
}
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
if (Control.Preview != null)
{
Control.Preview.Release();
}
}
base.Dispose(disposing);
}
}

最新更新