在Android上的SurfaceView上启动相机预览时的消息

时间:2011-12-07 18:24:41

标签: android surfaceview android-camera

首先让我从编码开始。 我的xml文件(相关部分)包含:

<FrameLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_weight="1"
        android:background="#ffffff">


        <SurfaceView
            android:id="@+id/cameraView"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:visibility="gone" />

        <LinearLayout
            android:id="@+id/layStatus"
            android:orientation="horizontal"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:visibility="gone">

            <TextView
                android:id="@+id/txtStatus"
                android:layout_width="fill_parent"
                android:layout_height="fill_parent"
                android:background="#90000000"
                android:paddingBottom="5dip"
                android:paddingTop="5dip"
                android:gravity="center_vertical|center_horizontal"
                android:textSize="20dip" />
        </LinearLayout>
</FrameLayout>

正如你所看到的,我有一个基本的设置,一个框架布局,其中包含一个surfaceview(其可见性已设置为已消失)和另一个带有简单TextView的布局。 以下是我在活动中的内容:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.mylayout);

        cameraView = (SurfaceView)findViewById(R.id.cameraView);

        surfaceHolder = cameraView.getHolder();
        surfaceHolder.addCallback(CompassActivity.this);
        surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}

public void btnCameraOnClick(View target) {

    cameraView.setVisibility(View.VISIBLE);

    }

启动相机预览是在Surface更改中完成的,当表面的可见性发生变化时会触发。

@Override
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
            txtStatus.setVisibility(View.Visible);
            txtStatus.setText("Starting camera");
camera = Camera.open();
if (camera != null){
                try {

                    camera.setDisplayOrientation(90);
                    Camera.Parameters parameters = camera.getParameters();

                    List<Size> sizes = parameters.getSupportedPreviewSizes();
                    Size size = sizes.get(0);
                    parameters.setPreviewSize(size.width, size.height);

                    camera.setParameters(parameters);

                    camera.setPreviewDisplay(holder);
                    camera.startPreview();

                     txtStatis.setVisibility(View.GONE);
                } catch (IOException e) {
                }
            }
}

那么问题是什么?我想在相机预览开始时简单地显示文本。为此,我使txtStatus可见并为其设置文本。预览开始时,我只是隐藏它。嗯,它不能像这样工作,当我按下按钮开始相机预览时,UI线程冻结等待预览,我的状态信息不会显示。我该如何解决?在HERE有一个解决方案,但我在想,也许有一个更简单的解决方案。

感谢您的时间。

1 个答案:

答案 0 :(得分:2)

相机启动需要一些时间 - 应启动外部过程并设置所有内容。我推测,表面更改的回调是直接从setVisibility()执行并阻止UI线程。解决方案非常简单 - 只需生成新线程并在那里进行相机初始化。

在我的OCR应用程序中,我在onResume()中启动摄像头 - 因为我总是需要工作预览

你可能会发现我的OCR android演示有用:

http://sourceforge.net/projects/javaocr/

(相机预览,带叠加层)