问题描述
|
我正在使用
SurfaceView
和SurfaceHolder
来开始在我的测试应用中进行摄像机预览。
public class TextLocatorActivity extends Activity {
private Preview pvw;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestwindowFeature(Window.FEATURE_NO_TITLE);
this.getwindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
pvw = new Preview(this);
setContentView(pvw);
}
我想使用CameraPreview(SDK版本7的SDK样本随附)。单击UI即可拍照。这是Preview
类:
public class Preview extends SurfaceView implements OnClickListener,SurfaceHolder.Callback {
SurfaceHolder holder;
Camera cam;
final static String TAG = \"TextLocator:Preview\";
Preview(Context context) {
super(context);
holder = getHolder();
holder.addCallback(this);
this.setonClickListener(this);
// seems to be required (although the docs state,this enum is deprecated,as the type will be chosen automatically...
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceCreated(SurfaceHolder holder) {
cam = Camera.open();
try {
Camera.Parameters params = cam.getParameters();
params.set(\"orientation\",\"landscape\");
Camera.Size bestSize = getBestPreviewSize(480,320);
params.setPreviewSize(bestSize.width,bestSize.height);
cam.setParameters(params);
// where to draw:
cam.setPreviewdisplay(holder);
} catch (IOException exception) {
cam.release();
cam = null;
// Todo: add more exception handling logic here
}
}
private Camera.Size getBestPreviewSize(int width,int height)
{
// checks for supported sizes close to the demanded values - implemented.
}
public void surfaceDestroyed(SurfaceHolder holder) {
cam.stopPreview();
cam.release();
cam = null;
}
public void surfaceChanged(SurfaceHolder holder,int format,int w,int h) {
Camera.Parameters parameters = cam.getParameters();
parameters.setPreviewSize(w,h);
cam.setParameters(parameters);
cam.startPreview();
}
Camera.PictureCallback picCallback = new Camera.PictureCallback() {
public void onPictureTaken(byte[] bytes,Camera arg1) {
synchronized(holder) {
Canvas c = null;
try {
c = holder.lockCanvas();
Paint paint = new Paint();
paint.setAntiAlias(false);
paint.setARGB(200,120,180,0);
c.drawLine(10,10,c.getWidth() - 10,c.getHeight() - 10,paint);
}
catch (Exception e) {
Log.d(TAG,\"Exception: \" + e.getMessage());
// IllegalArguementException Surface Type is SURFACE_TYPE_PUSH_BUFFERS
}
finally {
holder.unlockCanvasAndPost(c);
}
}
}
};
public void onClick(View v)
{
cam.takePicture(null,null,picCallback);
}
}
接下来,我尝试对ѭ1的对应ѭ5进行一些附加绘制。因此,我打电话给canvas = holder.lockCanvas()
。这将导致消息中出现“ 8”字样:
Surface type is SURFACE_TYPE_PUSH_BUFFERS
现在,文档指出不赞成使用这些Surface Type,这些值集将被忽略。但是,仅当我将类型设置为此特定值时,摄像机预览才有效。
如何在显示的照片的“ 0”的“ 5”上画图?还是应该将其放在其他图层/视图上?
解决方法
您不能同时显示相机预览和使用“画布”进行绘制。您必须做另一件事。