반응형
#1에서 MainActivity.java의 전체적인 소스코드를 봤습니다. 본 포스트에서부터 변수 선언 부분을 낱낱이 파헤쳐봅시다.
private SurfaceView mSurfaceView;
private SurfaceHolder mSurfaceViewHolder;
SurfaceView는 View를 상속하는 클래스입니다. 일반적인 View보다 화면에 그리는 시간이 빨라(스레드 사용) 애니메이션을 그리거나 본 포스트처럼 카메라 화면을 디스플레이할 때 사용하기 좋은 클래스입니다. 더블 버퍼링 기법을 이용하여 SurfaceHolder가 Surface에 미리 그리고 이 Surface가 SurfaceView에 반영되는 방식입니다.
SurfaceView로부터 상속받을 경우 디폴트로 구현해야 할 메소드가 있습니다.
- public void surfaceChanged() : 뷰가 변경될 때 호출됩니다..
- public void surfaceCreated() : 뷰가 생성될 때 호출됩니다.
- public void surfaceDestroyed() : 뷰가 종료될 때 호출됩니다.
MainActivity.java 에서 다음과 같이 구현되어 있습니다.
public void initSurfaceView() {
DisplayMetrics displayMetrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
mDSI_height = displayMetrics.heightPixels;
mDSI_width = displayMetrics.widthPixels;
mSurfaceViewHolder = mSurfaceView.getHolder();
mSurfaceViewHolder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
initCameraAndPreview();
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
if (mCameraDevice != null) {
mCameraDevice.close();
mCameraDevice = null;
}
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
});
DisplayMetrics 클래스는 현재 윈도우의 정보(가로, 세로 픽셀 개수)를 가져오는 클래스입니다. 위에서 언급하였듯 SurfaceViewHolder가 먼저 Surface에 그려야하므로 정의해줍니다.
surfaceCreated 메소드는 surface에 카메라 화면을 올릴 것이므로 카메라 프리뷰 메소드를 탑재해줍니다.
surfaceDestroyed 메소드는 surface가 종료되면 카메라 디바이스를 종료해야하므로 카메라 디바이스 체크 후 종료해줍니다.
반응형
'안드로이드' 카테고리의 다른 글
"Top 10 Android Apps for Boosting Productivity" (0) | 2023.05.03 |
---|---|
[안드로이드] 밑바닥부터 딥러닝 호환 카메라 앱 만들기 #3 onCreate() (1) | 2021.04.02 |
[안드로이드] 밑바닥부터 딥러닝 호환 카메라 앱 만들기 #2 액티비티 생명주기 (0) | 2021.03.31 |
[안드로이드] 밑바닥부터 딥러닝 호환 카메라 앱 만들기 #1-2 Camera2 (0) | 2021.03.31 |
[안드로이드] 밑바닥부터 딥러닝 호환 카메라앱 만들기 #1 MainActivity.java, activity_main.xml (0) | 2021.03.31 |