所以,我正在尝试使用相机Feed作为背景进行登录活动。我已经在https://developer.xamarin.com/guides/android/user_interface/textureview/上测试了这个例子,并让它发挥作用,但我需要将它作为活动的一部分。所以,我试过这个:
protected override void OnCreate(Bundle savedInstanceState)
{
base.OnCreate(savedInstanceState);
// Create your application here
SetContentView(Resource.Layout.Login);
_textureView = this.FindViewById<TextureView>(Resource.Id.textureView);
_textureView.SurfaceTextureListener = this;
}
public void OnSurfaceTextureAvailable(
Android.Graphics.SurfaceTexture surface, int w, int h)
{
_cam = Camera.Open();
_textureView.LayoutParameters =
new FrameLayout.LayoutParams(w, h);
try
{
_cam.SetPreviewTexture(surface);
_cam.StartPreview();
}
catch (Java.IO.IOException ex)
{
Console.WriteLine(ex.Message);
}
}
axml文件看起来像这样:
<?xml version="1.0" encoding="utf-8"?>
<AbsoluteLayout 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_width="match_parent"
android:layout_height="match_parent"
AbsoluteLayout.LayoutBounds="0,0,1,1"
AbsoluteLayout.LayoutFlags="SizeProportional" />
<LinearLayout
android:id="@+id/linearLayout"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@android:color/transparent"
AbsoluteLayout.LayoutBounds="0,0,1,1"
AbsoluteLayout.LayoutFlags="SizeProportional">
<!-- Some other controls -->
</LinearLayout>
</AbsoluteLayout>
然而,应用程序现在在退出OnSurfaceTextureAvailable块后崩溃,给出了未处理的异常。突破异常不起作用,显然是在一个不再运行的线程中。 有谁知道为什么它会崩溃,更重要的是,如何解决它?
答案 0 :(得分:0)
问题在于此代码:
_textureView.LayoutParameters = new FrameLayout.LayoutParams(w, h);
我不确定为什么需要重置TextureView
的布局参数,在xml中你已经将它设置为匹配父级。这里的父级是AbsoluteLayout
,而不是FrameLayout
,这就是发生此错误的原因。
要解决此问题,由于AbsoluteLayout
现已过时,我建议在xml中使用RelativeLayout
作为root容器。然后你可以像这样编码:
_textureView.LayoutParameters = new RelativeLayout.LayoutParams(width, height);
当然,您也可以在xml中将AbsoluteLayout
更改为FrameLayout
,然后不再需要修改代码_textureView.LayoutParameters = new FrameLayout.LayoutParams(w, h);
。