最近在做一个安卓项目,需要使用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上也有相似的问题:
问题的原因同样是TextureView给Camera做预览以后,又进行绘图。
最后采取的解决方法是,再建一个ImageView,把这个ImageView显示在TextureView的前面,然后重写ImageView的onDraw方法,最后在屏幕上看到的就是TextureView上“绘制”了ImagView,这样就是用两个图像叠加进行显示。