2011-12-07 18 views
1

让我先从编码开始。 我的XML文件(它的相关部分)包含此:在Android上使用SurfaceView进行摄像机预览时的消息

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

    } 

启动摄像头预览在表面做了改变,这触发时的表面变化的知名度。

@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有一个解决方案,但我想这也许是一个更简单的。

谢谢你的时间。

回答

2

摄像机启动需要一些时间 - 外部过程将启动,并设置一切。我会推测,表面变化的回调直接从setVisibility()执行并阻止UI线程。解决方案非常简单 - 只需生成新线程并在那里执行相机初始化。

在我的OCR applicatios我的onResume()启动相机 - 因为我总是需要工作预览

你会发现我的OCR机器人演示有所帮助:

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

(摄像头预览,以覆盖)

相关问题