SurfaceView中lockCanvas返回值为null

来源:互联网 发布:网店数据分析毕业论文 编辑:程序博客网 时间:2024/06/17 17:54

最近在做一个安卓项目,需要使用TextureView或者SurfaceView对相机进行预览,在预览的同时又想要在屏幕上进行绘图操作。

于是使用lockCanvas()获取Canvas对象,但是程序就会在运行时候报错:null reference,程序崩溃。检查一下lockCanvas返回的canvas的确是null。

花了很长时间查错,终于在Android开发官网上找到了原因:

http://developer.android.com/intl/zh-cn/reference/android/view/TextureView.html

在网页的最后一段:

It is important to note that only one producer can use the TextureView. For instance, if you use a TextureView to display the camera preview, you cannot use lockCanvas() to draw onto the TextureView at the same time.

也就是说,只能有一个用户使用TextureView,在提供camera preview的同时是不可以进行Canvas的绘制的,lockCanvas()的值就是null。

在StackOverFlow上也有相似的问题:

http://stackoverflow.com/questions/2933882/how-to-draw-an-overlay-on-a-surfaceview-used-by-camera-on-andrOid

问题的原因同样是TextureView给Camera做预览以后,又进行绘图。

最后采取的解决方法是,再建一个ImageView,把这个ImageView显示在TextureView的前面,然后重写ImageView的onDraw方法,最后在屏幕上看到的就是TextureView上“绘制”了ImagView,这样就是用两个图像叠加进行显示。

1 0