读书人

mono for android surfaceHolder.AddC

发布时间: 2013-07-04 11:45:28 作者: rapoo

mono for android surfaceHolder.AddCallback()参数如何定义
我使用的SurfaceView 为camera显示图片,
其中代码:
定义了

SurfaceView sView;
ISurfaceHolder surfaceHolder;
OnCreate里面:
protected override void OnCreate(Bundle bundle)
{

base.OnCreate(bundle);
RequestWindowFeature(WindowFeatures.NoTitle);
Window.SetFlags(WindowManagerFlags.Fullscreen, WindowManagerFlags.Fullscreen);
SetContentView(Resource.Layout.layoutCameraMain);
// Create your application here
////获取ip地址
ipname = this.Intent.GetStringExtra("ipname");
//获取屏幕分辨率
DisplayMetrics dm = new DisplayMetrics();
Display display = WindowManager.DefaultDisplay;
display.GetMetrics(dm);
//screenWidth = dm.WidthPixels;
//screenHeight = dm.HeightPixels;

screenWidth = display.Width;
screenHeight = display.Height;
sView = FindViewById<SurfaceView>(Resource.Id.sView);//获取界面中的surface
surfaceHolder = sView.Holder;//获得SurfaceView的SurfaceHolder;

ISurfaceHolderCallback ish = new SurfaceHolderCallBack(this);
surfaceHolder.AddCallback(ish);
// 设置该SurfaceView自己不维护缓冲
surfaceHolder.SetType(SurfaceType.PushBuffers);
}


自己实现定义的类:
[code=csharp]
private void InintCamera()
{
if (!isPreview)
{
camera = Camera.Open();
}
if (camera != null && !isPreview)
{
try
{
Camera.Parameters parameters = camera.GetParameters();
parameters.SetPreviewSize(screenWidth, screenHeight);//设置大小
//parameters.setPreviewFpsRange(20, 30); // 每秒显示20~30帧
parameters.PictureFormat = Android.Graphics.ImageFormatType.Nv21;/// 设置图片格式
parameters.SetPictureSize(screenWidth, screenHeight);
//parameters.Set("orientation", "portrait");
//parameters.SetRotation(90);//旋转90度
parameters.PreviewFrameRate = 30; // 每秒显示30帧
camera.SetPreviewDisplay(surfaceHolder); // 通过SurfaceView显示取景画
camera.SetDisplayOrientation(90);//旋转90度
//camera.SetPreviewCallback(new StreamIt(ipname, camera));


camera.SetParameters(parameters);
camera.StartPreview(); // 开始预览

camera.AutoFocus(null); // 自动对焦
}
catch (Exception e)
{
string error = e.StackTrace;
}
}
}
class MyThread : Java.Lang.Thread
{

}
/// <summary>
/// 试映回掉
/// </summary>
class StreamIt : Camera.IPreviewCallback
{
string ipname;
Camera camera;
public StreamIt(string ipname, Camera camera)
: base()
{
this.camera = camera;
this.ipname = ipname;


}
public void OnPreviewFrame(byte[] data, Camera camera)
{
Camera.Size size = camera.GetParameters().PreviewSize;
try
{
//调用image.compressToJpeg()将YUV格式图像数据data转为jpg格式
Android.Graphics.YuvImage image = new Android.Graphics.YuvImage(data, Android.Graphics.ImageFormatType.Nv21, size.Width, size.Height, null);
if (image != null)
{
MemoryStream mstream = new MemoryStream();
image.CompressToJpeg(new Android.Graphics.Rect(0, 0, size.Width, size.Height), 80, mstream);
mstream.Flush();
//启用线程把图片发送出去

}
}
catch (Exception ex)
{
Log.Error("转换图片时出错", ex.Message);
}
//throw new NotImplementedException();


}

public void Dispose()
{
throw new NotImplementedException();
}

public IntPtr Handle
{
get { return camera.Handle; }
}
}
/// <summary>
/// 定义SurfaceHolder回掉
/// </summary>

public class SurfaceHolderCallBack : ISurfaceHolderCallback
{
ActivityCameraMain _main;
public SurfaceHolderCallBack(ActivityCameraMain main)
: base()
{
_main = main;
}
public void SurfaceChanged(ISurfaceHolder holder, Android.Graphics.Format format, int width, int height)
{
//throw new NotImplementedException();
}

public void SurfaceCreated(ISurfaceHolder holder)
{
//throw new NotImplementedException();
_main.InintCamera();


}

public void SurfaceDestroyed(ISurfaceHolder holder)
{
//throw new NotImplementedException();
if (_main.camera != null)
{
if (_main.isPreview)
{
_main.camera.StopPreview();
_main.camera.Release();
_main.camera = null;
}
//System.exit(0);
}

}
void IDisposable.Dispose()
{
;
}

IntPtr IJavaObject.Handle
{
get { return ((View)_main.sView).Handle; }
}
}
[/code=]
似乎是在
IntPtr IJavaObject.Handle
{
get { return ((View)_main.sView).Handle; }


}
出错了,但是没有确定找到是哪里出错了。。
求指教。。 Android Mono? IJavaObject.Handle monoforandroid AddCallback
[解决办法]
回复个屁啊,姐压根看不懂

读书人网 >C#

热点推荐