2013-02-28 45 views
4

即使調用活動的onPause,我的SurfaceView也不會被破壞。是否可以手動銷燬SurfaceView?

我照顧線程的

public void surfaceCreated(SurfaceHolder holder) { 
    if (mGameThread.getState() == Thread.State.TERMINATED) { 
     createGameThread(getHolder(), getContext()); 
    } 
    mGameThread.setRunning(true); 
    mGameThread.start(); 
} 


public void surfaceDestroyed(SurfaceHolder holder) { 
    boolean retry = true; 
    mGameThread.setRunning(false); 
    while (retry) { 
     try { 
      mGameThread.join(); 
      retry = false; 
     } catch (InterruptedException e) { 
     } 
    } 
} 

作爲一個黑客我必須檢查的onResume線程的狀態,如果線程已經結束,我會完成活動

protected void onResume() { 
    Log.d(mLogTag, "onResume()"); 
    super.onResume(); 
    if (mGameThread != null) { 
     if (mGameThread.getState() == Thread.State.TERMINATED) { 
      finish(); 
     } 
    } 

} 

不幸的是,不可能將線程處理從surfaceDestroyed和surfaceCreated移動到activity的onPause()和onResume()。是否有可能手動銷燬onPause()中的SurfaceView並在onResume()中重新創建它?

回答

3

您可以添加布局作爲surfaceview的父項,然後將佈局的可見性設置爲onPause(),並在activity的onResume()中設置VISIBLE。

+0

萬分感謝! – Flo354 2016-08-15 15:45:14

3

您可以在視圖上動態添加表面視圖。

實施例:layout.xml

<FrameLayout 
     android:id="@+id/fragment_file_videoplayer_surface_container" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 
    </FrameLayout> 

MainActivity.java

FrameLayout fl_surfaceview_container = 
       (FrameLayout)findViewById(R.id.fragment_file_videoplayer_surface_container); 

// Add surfaceView on Framelayout 

SurfaceView videoSurface = new SurfaceView(getActivity()); 
fl_surfaceview_container.addView(videoSurface); 

//if remove or destroy surfaceview 

fl_surfaceview_container.removeAllViews(); 
0

是可能的。 首先初始化大小

Size currentSurfaceSize; 

    cameraSurface.getHolder().addCallback(new SurfaceHolder.Callback() { 
       @Override 
       public void surfaceCreated(SurfaceHolder holder) { 
        if (ActivityCompat.checkSelfPermission(getApplicationContext(), Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { 
         ActivityCompat.requestPermissions(QR_Reader_Activity.this, 
           new String[]{Manifest.permission.CAMERA}, RequestCameraPermission); 
         permission = true; 
         return; 
        } 
        try { 
         cameraSource.start(cameraSurface.getHolder()); 
        } catch (IOException e) { 
         e.printStackTrace(); 
        } 
       } 
       @Override 
       public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
         currentSurfaceSize = new Size(width, height); 
        } 
       } 
       @Override 
       public void surfaceDestroyed(SurfaceHolder holder) { 
        onPause(); 
       } 
      }); 

要破壞面在哪裏,使用下面的代碼。

   if (currentSurfaceSize==null){ 
        cameraSurface = (SurfaceView) cameraSurface.getHolder(); 
        cameraSurface.removeCallbacks((Runnable) cameraSurface); 
       } 
相關問題