2017-10-05 10 views
0

내가하고 싶은 것은 SurfaceView으로 카메라를 열고 그 안에서 미리보기를하는 것입니다. 버튼을 클릭 한 후 SurfaceView 정지/보이지 않기 때문에 이미지 캡처는 해당 활동의 ImageView에 표시됩니다. 내가 클릭하면버튼을 클릭했을 때 SurfaceView를 숨기는 방법은 무엇입니까?

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:fitsSystemWindows="true"> 

<SurfaceView 
    android:id="@+id/surface_view" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" /> 

<ImageView 
    android:id="@+id/showImage" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:visibility="invisible" /> 

<FloatingActionButton 
    android:id="@+id/cameraButton" 
    android:layout_width="60dp" 
    android:layout_height="60dp" 
    android:layout_centerHorizontal="true" /> 

</FrameLayout> 

내가 뭘하고 싶어하는 것은,이다,

enter image description here

그래서 나는 다음과 같은 XML을 사용자 정의 카메라 활동이 있습니다

는 아래 그림과 같이인가 부동 단추에서 SurfaceView이 표시되면 ImageView이 표시되고 카메라로 촬영 한 이미지가 ImageView으로 표시됩니다.

그래서 시도 것을 지금까지

public class CameraActivity extends AppCompatActivity implements 
SurfaceHolder.Callback { 
    Camera mCamera; 
    Camera.PictureCallback jpegCallback; 

    ImageView showImage; 
    FloatingActionButton btnCamera; 
    SurfaceHolder surfaceHolder; 
    SurfaceView surfaceView; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity); 

     btnCamera = (FloatingActionButton) findViewById(R.id.cameraButton); 
     surfaceView = (SurfaceView)findViewById(R.id.surface_view); 
     showImage = (ImageView)findViewById(R.id.showImage); 

     surfaceHolder = surfaceView.getHolder(); 
     surfaceHolder.addCallback(this); 
     surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
     btnCamera.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       //here when click the camera button 
       //camera take photo 
       //surface view disappear 
       //preview image shown on image view 
       mCamera.takePicture(null,null,jpegCallback); 
       showImage.setVisibility(View.VISIBLE); 
       surfaceView.setVisibility(View.INVISIBLE); 

      } 
     }); 

     jpegCallback = new Camera.PictureCallback() { 
      @Override 
      public void onPictureTaken(byte[] data, Camera camera) { 
       FileOutputStream outputStream = null; 
       File file_image = getDirs(); 

       if(!file_image.exists() && !file_image.mkdirs()){ 
        Toast.makeText(getApplicationContext(),"Failed to save picture",Toast.LENGTH_LONG).show(); 
       } 

       SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); 
       String date = simpleDateFormat.format(new Date()); 
       String photofile = "myphotos" + date+ ".jpg"; 
       String file_name = file_image.getAbsolutePath() + "/" + photofile; 
       File picFile = new File(file_name); 
       Bitmap bitmap = null; 

       try{ 
        outputStream = new FileOutputStream(picFile); 
        outputStream.write(data); 
        outputStream.close(); 

        //here set the picture capture to the image view 
        //convert it to bitmap,setBitmap to the imageView 
        bitmap = decodeFile(picFile,10); 

        if(bitmap !=null){ 
         showImage.setImageBitmap(bitmap); 
         Toast.makeText(CameraActivity.this, 
           "Picture Captured Successfully:", Toast.LENGTH_LONG) 
           .show(); 
        }else { 
         Toast.makeText(CameraActivity.this, 
           "Failed to Capture the picture. kindly Try Again:", 
           Toast.LENGTH_LONG).show(); 
        } 


       } catch (IOException e){ 
        e.printStackTrace(); 
       } 
       Toast.makeText(getApplicationContext(),"Picture saved",Toast.LENGTH_LONG).show(); 
       refreshCamera(); 
      } 
     }; 
    } 

    private void refreshCamera() { 
     if(surfaceHolder.getSurface() == null){ 
      return; 
     } 

     //stop the camera preview 
     try{ 
      mCamera.stopPreview(); 
     }catch (Exception e){ 
      e.printStackTrace(); 
     } 
     //start camera again 
     try{ 
      mCamera.setPreviewDisplay(surfaceHolder); 
      mCamera.startPreview(); 
     }catch (Exception e){ 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void surfaceCreated(SurfaceHolder holder) { 
     //open camera 
     try{ 
      mCamera = Camera.open(); 
     }catch (RuntimeException ex){ 
      ex.printStackTrace(); 
     } 

     Camera.Parameters parameters; 
     parameters = mCamera.getParameters(); 
     parameters.setPreviewFrameRate(20); 
     parameters.setPreviewSize(352,288); 
     mCamera.setParameters(parameters); 
     mCamera.setDisplayOrientation(90); 

     try{ 
      mCamera.setPreviewDisplay(surfaceHolder); 
      mCamera.startPreview(); 
     }catch (Exception e){ 
      e.printStackTrace(); 
     } 


    } 

    @Override 
    public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { 
     refreshCamera(); 
    } 

    @Override 
    public void surfaceDestroyed(SurfaceHolder holder) { 
     mCamera.stopPreview(); 
     mCamera.release(); 
     mCamera= null; 
    } 
    } 

이 시도 후, 내가 지금 무엇을 가지고, 화면이 완전히 비어 있습니다. SurfaceView이 보이지 않으면 ImageView 카메라에서 가져온 이미지의 미리보기가 표시되지 않습니다. 그러나 로그에 값이있는 file_namebitmap을 확인했습니다. 나는 보이지 않는으로 표면보기를 설정 한 경우,

btnCamera.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      cameraImage(); 
      showImage.setVisibility(View.VISIBLE); 
      //surfaceView.setVisibility(View.INVISIBLE); 

     } 
    }); 

이미지는 다음과 같은면 뷰 상단에에 표시 할 수 있지만 :

그래서 나는 다음과 같은 눈에 보이지 않는에 SurfaceView를 설정하지 시도 전체 화면이 공백으로 표시됩니다.

enter image description here

는하지만 단지 이미지 뷰를 사용할 수, 표면보기가 사라합니다. onClick(View v) 방법에있어서 onPictureTaken(byte[] data, Camera camera) 행에서 다음 행으로 이동 (하는 표면도 보이지 않게하는)

답변

0

,

surfaceView.setVisibility(View.INVISIBLE); 

문제를 해결할 것이다.

하지만 카메라가 release이되고 다른 사진을 캡처하려면 다시 열어야합니다.

+0

surfaceView를 보이지 않게하면 화면이 공백이됩니다. 화면의 흰색 만 색이됩니다. – ken