我正在开发一个项目,我需要创建一个类似于SnapChat的应用程序,我在Visual Studio上使用Xamarin,我想创建一个带有屏幕底部按钮的Camera Stream。一旦用户触摸该圈子,该应用程序将拍照!。
我是xamarin的新手,所以我有很多问题。
1。)我在xamarin页面上关注了这个例子:https://developer.xamarin.com/recipes/android/other_ux/textureview/display_a_stream_from_the_camera/
但是我不明白为什么相机流看起来很奇怪,如果手机处于垂直位置,所显示的图像是水平的,反之亦然,当我移动手机时,显示的图像移动得非常慢,就像它会做的一样任何类型的大小调整或其他什么。
我该如何解决这个问题?
2。)我需要向应用添加按钮,但代码中包含以下行:
SetContentView (_textureView);
所以我找到了这段代码:
public class Activity1 : Activity
{
bool _previewing;
Camera _camera;
TextureView _textureView;
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
SetContentView(Resource.Layout.CameraLayout);
Button button = FindViewById<Button>(Resource.Id.button1);
_textureView = FindViewById<TextureView>(Resource.Id.textureView1);
button.Click += delegate {
try
{
if (!_previewing)
{
_camera = Camera.Open();
_camera.SetPreviewTexture(_textureView.SurfaceTexture);
_camera.StartPreview();
}
else
{
_camera.StopPreview();
_camera.Release();
}
}
catch (Java.IO.IOException ex)
{
Console.WriteLine(ex.Message);
}
finally
{
_previewing = !_previewing;
}
};
}
关于这个问题:Xamarin Android Display a stream from the camera
但在该代码中,他们使用按钮来启用和禁用Stream,如何使用buttom将当前图像保存为位图?以及如何保持流始终运行? (当用户拍摄电影时执行)
3。)最后如何将按钮放在textureView上?你可以在我的快照聊天图片上看到。有可能实现吗?有可能在xamarin中做到吗?
感谢您的时间。
答案 0 :(得分:5)
但我不明白为什么相机流看起来很奇怪,如果手机处于垂直位置,所显示的图像是水平的,反之亦然。
要解决此问题,您可以设置摄像机的显示方向,例如:
_camera = Android.Hardware.Camera.Open();
try
{
_camera.SetPreviewTexture(surface);
_camera.SetDisplayOrientation(90);
_camera.StartPreview();
}
catch (Java.IO.IOException ex)
{
Console.WriteLine(ex.Message);
}
但在该代码中,他们使用按钮启用和禁用Stream,如何使用buttom将当前图像保存为位图?
您可以为相机设置PreviewCallback
,然后在OnPreviewFrame
中,您可以获得当前预览的YuvImage
。通常此处不需要Bitmap
,但如果您想将其转换为Bitmap
,则可以参考此案例中的答案:Converting preview frame to bitmap。
例如:
public class mPreviewCallback : Java.Lang.Object, IPreviewCallback
{
public void OnPreviewFrame(byte[] data, Camera camera)
{
var paras = camera.GetParameters();
var imageformat = paras.PreviewFormat;
if (imageformat == Android.Graphics.ImageFormatType.Nv21)
{
Android.Graphics.YuvImage img = new Android.Graphics.YuvImage(data,
imageformat, paras.PreviewSize.Width, paras.PreviewSize.Height, null);
}
}
}
并将此回调设置为您的相机,如下所示:
_camera.SetPreviewCallback(new mPreviewCallback());
最后如何将按钮放在textureView上?
很简单,您可以创建视图,例如:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextureView
android:id="@+id/textureView"
android:layout_height="match_parent"
android:layout_width="match_parent" />
<Button
android:id="@+id/saveimg"
android:layout_height="wrap_content"
android:layout_width="wrap_content"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:text="img" />
</RelativeLayout>