안드로이드로 핀치 줌 (두 손가락으로 벌리고 좁힘으로써 화면을 확대, 축소 하는 기능)을 멀티 터치 이벤트로 구현하는 방법입니다.

먼저 변수 선언입니다. (클래스 내부입니다.)


private double touch_interval_X = 0; // X 터치 간격

private double touch_interval_Y = 0; // Y 터치 간격

private int zoom_in_count = 0; // 줌 인 카운트

private int zoom_out_count = 0; // 줌 아웃 카운트

private int touch_zoom = 0; // 줌 크기


X, Y 터치 간격은 멀티 터치 이벤트에서 구현 한 두 손가락 사이의 X, Y값을 받아올 변수입니다.

이는 이전 값 저장 후 현재 값과 비교용으로 선언했습니다.

줌 인, 아웃 카운트는 터치이벤트가 너무 자주 발생하기 때문에 카운트를 세어서 확대 및 축소를 하기위한 변수입니다.

줌 크기는 실제로 확대 및 축소 된 값을 카메라에게 전달하기 위한 변수입니다.


Generate를 통해 Override Methods - onTouchEvent를 생성합니다.


* 만약 Layout에 클릭 리스너 이벤트가 존재한다면 제대로 실행 되지 않을 수 있습니다!


onTouchEvent 함수를 만들고 다음과 같이 작성합니다.


@Override

public boolean onTouchEvent(MotionEvent event) {

switch (event.getAction()  & MotionEvent.ACTION_MASK) {

case MotionEvent.ACTION_DOWN: // 싱글 터치

CameraPreview.mCamera.autoFocus(new Camera.AutoFocusCallback(){ // 오토 포커스 설정

@Override

public void onAutoFocus(boolean success, Camera camera) {

return;

}

});

break;


case MotionEvent.ACTION_MOVE: // 터치 후 이동 시

if(event.getPointerCount() == 2) { // 터치 손가락 2개일 때

double now_interval_X = (double) abs(event.getX(0) - event.getX(1)); // 두 손가락 X좌표 차이 절대값

double now_interval_Y = (double) abs(event.getY(0) - event.getY(1)); // 두 손가락 Y좌표 차이 절대값

if(touch_interval_X < now_interval_X && touch_interval_Y < now_interval_Y) { // 이전 값과 비교

// 여기에 확대기능에 대한 코드를 정의 하면됩니다. (두 손가락을 벌렸을 때 분기점입니다.)

zoom_in_count++;

if(zoom_in_count > 5) { // 카운트를 세는 이유 : 너무 많은 호출을 줄이기 위해

zoom_in_count = 0;


touch_zoom += 5;

ZoomseekBar.setProgress(touch_zoom/6);


if(CameraPreview.params.getMaxZoom() < touch_zoom)

touch_zoom = CameraPreview.params.getMaxZoom();


CameraPreview.params.setZoom(touch_zoom);

CameraPreview.mCamera.setParameters(CameraPreview.params);

}

}

if(touch_interval_X > now_interval_X && touch_interval_Y > now_interval_Y) {

// 여기에 축소기능에 대한 코드를 정의 하면됩니다. (두 손가락 사이를 좁혔을 때 분기점입니다.)

zoom_out_count++;

if(zoom_out_count > 5) {

zoom_out_count = 0;


touch_zoom -= 10;

ZoomseekBar.setProgress(touch_zoom/6);


if(0 > touch_zoom)

touch_zoom = 0;


CameraPreview.params.setZoom(touch_zoom);

CameraPreview.mCamera.setParameters(CameraPreview.params);

}

}

touch_interval_X = (double) abs(event.getX(0) - event.getX(1));

touch_interval_Y = (double)  abs(event.getY(0) - event.getY(1));

}

break;

//            case MotionEvent.ACTION_POINTER_DOWN : // 여러개 터치했을 때

//                Log.d(TAG, "멀티터치 : " + event.getX() + " , " + event.getY());

//                break;

//            case MotionEvent.ACTION_UP: // 터치 뗐을 때

//                break;

}

return super.onTouchEvent(event);

}


여기까지 안드로이드 핀치 줌을 멀티 터치 이벤트로 구현하는 방법이었습니다.






정보가 유익하셨다면 아래 공감버튼 눌러주시면 감사하겠습니다.

질문사항은 댓글로 달아주시면 성의껏 답변해드리겠습니다.


to Top