我正在尝试创建一个应用程序,我将在屏幕底部基本上有一个按钮,并在剩余的空间中进行摄像头预览。我使用CameraPreview example code作为起点。 CameraPreview以编程方式创建一个ViewGroup,它可以自己正常工作。我现在想要将这个ViewGroup放在我使用XML在我的布局中创建的另一个“视图容器”中。
基本上,我有一个布局和空间,我想嵌入CameraPreview ViewGroup。
谢谢。
答案 0 :(得分:0)
我认为不是这样:
mPreview = new Preview(this);
setContentView(mPreview);
您可能希望这样做:
mPreview = new Preview(this);
setContentView(R.layout.YOUR_XML_LAYOUT);
RelativeLayout yourLayoutContainer = (RelativeLayout) findViewById(R.id.YOUR_LAYOUT_CONTAINER_ID);
yourLayoutContainer.addView(mPreview);
答案 1 :(得分:0)
这大大简化了错误检查和删除了各种回调,我实际上将我的相机代码放在一个单独的类中,这样我就可以在不同的应用程序中使用它,但它应该让你朝着正确的方向移动。虽然我没有在这里展示,但我在一个父容器中有预览和各种叠加层,在基本的Android相机故障之外从来没有任何问题(总是必须在横向方向,总是必须设置正确的预览尺寸等。)
public class CameraActivity extends Activity {
private SurfaceView cameraSurface = null;
private myCamera camera = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.camerasurface);
cameraSurface = (SurfaceView) this.findViewById(R.id.cameraSurface);
camera = new bThereCamera(this,cameraSurface);
}
相机活动的XML
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >
<SurfaceView android:id="@+id/cameraSurface"
android:layout_height="fill_parent"
android:layout_width="fill_parent"/>
</RelativeLayout>
一个非常简化的相机类(相机类绑定到活动的生命周期,因此传递上下文应该没有问题),但这只是我的实现,没有理由你不能这样做一切都符合一个班级。除了最低限度的
之外,所有回调都被删除了public class myCamera implements SurfaceHolder.Callback {
private Camera cameraDevice = null;
private SurfaceView cameraSurface = null;
private SurfaceHolder cameraSurfaceHolder = null;
public myCamera(CameraActivity activity, SurfaceView surface)
{
parent = activity;
cameraSurface = surface;
cameraSurfaceHolder = cameraSurface.getHolder();
cameraSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
cameraSurfaceHolder.addCallback(this);
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h)
{
Camera.Parameters params = cameraDevice.getParameters();
Camera.Size size = getBestPreviewSize(params,w,h);
if (size != null)
params.setPreviewSize(size.width, size.height);
cameraDevice.setParameters(params);
cameraDevice.startPreview();
}
public void surfaceCreated(SurfaceHolder holder)
{
try {
// Get the device interface
cameraDevice = Camera.open(); // This is different for 2.2 and 2.3+ you will need
// a mediator class if you want to use both ...
cameraDevice.setPreviewDisplay(cameraSurfaceHolder);
} catch (IOException e) { }
}
public void surfaceDestroyed(SurfaceHolder holder)
{
if (null == cameraDevice)
return;
cameraDevice.stopPreview();
cameraDevice.release();
cameraDevice = null;
}
public Camera.Size getBestPreviewSize(Camera.Parameters parameters, int w, int h)
{
Camera.Size result = null;
for (Camera.Size size : parameters.getSupportedPreviewSizes())
{
if (size.width <= w && size.height <= h)
{
if (null == result)
result = size;
else
{
int resultDelta = w - result.width + h - result.height;
int newDelta = w - size.width + h - size.height;
if (newDelta < resultDelta)
result = size;
}
}
}
return result;
}
此外,如果你想深入了解相机,请下载2.1版的Android相机应用程序版本(如果你得到更高版本它将有不兼容的东西)并看一看,他们做了一些有趣的事情(这里没有显示)关于预览,捕捉,表演等。