【问题标题】:Put a ViewGroup inside a container将 ViewGroup 放入容器中
【发布时间】:2011-07-18 18:48:13
【问题描述】:

我正在尝试创建一个应用程序,在该应用程序中,屏幕底部基本上会有一个按钮,而相机预览会占据其余空间。我使用CameraPreview example code 作为起点。 CameraPreview 以编程方式创建一个 ViewGroup 并且它自己可以正常工作。我现在想要将此 ViewGroup 放入另一个“视图容器”中,该“视图容器”是我使用 XML 在布局中创建的。

所以基本上,我有一个布局和一个空间,我想在其中嵌入 CameraPreview ViewGroup。

谢谢。

【问题讨论】:

  • 这应该很简单,你试过遇到问题了吗?如果有,它们是什么?
  • 我尝试了类似citizen conn建议的东西,但没有预览,只有一个黑色的空白区域。

标签: android android-layout


【解决方案1】:

我认为不是这个:

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);

【讨论】:

  • 谢谢。我试过了,但没有预览显示,只有一个黑色的空白区域。
【解决方案2】:

这大大简化了错误检查和各种回调的删除,实际上我将我的相机代码放在一个单独的类中,以便我可以在不同的应用程序中使用它,但它应该让你朝着正确的方向前进。虽然我没有在这里展示它,但我在一个父容器中拥有预览和各种叠加层,除了基本的 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 相机应用程序版本(如果您获得更高版本,它将有不兼容的东西)并看看,他们做了一些有趣的事情(此处未显示)关于预览、捕获、性能等。

【讨论】:

  • 我仍然没有时间测试您的代码,但我对“基本的 android 相机故障”感兴趣。我在哪里可以获得有关它的更多信息?
  • @fromvega - 没有一个地方,最大的问题是纵向模式问题(它会在许多设备上扭曲输出),如果您想修改预览等,其他包括仅 YUV 格式的预览帧。 (我认为 2.3 已修复)等。
猜你喜欢
  • 2015-01-02
  • 1970-01-01
  • 2012-08-02
  • 1970-01-01
  • 2020-06-25
  • 1970-01-01
  • 1970-01-01
  • 2012-12-11
  • 1970-01-01
相关资源
最近更新 更多