在Android上启动SurfaceView相机预览时的消息
让我先从编码开始。 我的xml文件(相关部分)包含以下内容:在Android上启动SurfaceView相机预览时的消息,android,surfaceview,android-camera,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" an
<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>
在“曲面已更改”中启动摄影机预览,当曲面的可见性更改时将触发该选项
@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.setVisibility(View.Visible);
setText(“启动照相机”);
camera=camera.open();
如果(照相机!=null){
试一试{
摄像头。设置显示方向(90);
Camera.Parameters=Camera.getParameters();
列表大小=参数。getSupportedPreviewSizes();
大小=大小。获取(0);
parameters.setPreviewSize(size.width、size.height);
设置参数(参数);
摄像头。设置预览显示(支架);
camera.startPreview();
txtStatis.setVisibility(View.GONE);
}捕获(IOE异常){
}
}
}
那有什么问题?我只想在相机预览开始时显示文本。为此,我将txtStatus设置为可见并设置一个文本。当预览开始时,我只是将其隐藏。嗯,它不是这样工作的,当我按下按钮开始相机预览时,UI线程冻结等待预览,并且我的状态消息不显示。我怎样才能修好它?现在有一个解决办法,但我想也许有一个更简单的办法
谢谢您的时间。摄像机启动需要一些时间-外部过程将启动,一切都将设置好。我推测,surface changed回调直接从setVisibility()执行,并阻塞UI线程。解决方案非常简单-只需生成新线程并在那里执行camera init 在我的OCR应用程序中,我在onResume()中启动相机-因为我总是需要工作预览 您可能会发现我的OCR android演示非常有用: (摄影机预览,带覆盖)
@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) {
}
}
}