首先让我从编码开始。 我的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有一个解决方案,但我在想,也许有一个更简单的解决方案。
感谢您的时间。
答案 0 :(得分:2)
相机启动需要一些时间 - 应启动外部过程并设置所有内容。我推测,表面更改的回调是直接从setVisibility()执行并阻止UI线程。解决方案非常简单 - 只需生成新线程并在那里进行相机初始化。
在我的OCR应用程序中,我在onResume()中启动摄像头 - 因为我总是需要工作预览
你可能会发现我的OCR android演示有用:
http://sourceforge.net/projects/javaocr/
(相机预览,带叠加层)