Поместите ViewGroup в контейнер - PullRequest
0 голосов
/ 18 июля 2011

Я пытаюсь создать приложение, в котором у меня будет в основном кнопка внизу экрана и предварительный просмотр камеры, занимающий оставшееся пространство. Я использую пример кода CameraPreview в качестве отправной точки. CameraPreview создает ViewGroup программно, и она отлично работает сама по себе. Теперь я хочу поместить эту ViewGroup в другой «контейнер представления», который я создал в своем макете с использованием XML.

Итак, в основном у меня есть макет и пространство, в которое я хочу встроить группу CameraPreview ViewGroup.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 19 июля 2011

Это значительно упрощается благодаря проверке ошибок и удалению различных обратных вызовов, также у меня фактически есть код камеры в отдельном классе, так что я могу использовать его в разных приложениях, тем не менее он должен двигать вас в правильном направлении.Хотя я не показываю это здесь, у меня есть предварительный просмотр и различные наложения в одном родительском контейнере, никогда не было никаких проблем, кроме основных глюков камеры 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; 
}

Также, если вы действительно хотите покопаться в камере, скачайте версию приложения для Android-камеры для 2.1 (если вы получите более позднюю версию, у нее будут несовместимые вещи)и посмотрите, они делают некоторые интересные вещи (не показаны здесь) в отношении предварительного просмотра, захвата, производительности и т. д.

0 голосов
/ 18 июля 2011

Я думаю вместо этого:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...