안드로이드 핀치 줌 구현 - 멀티 터치
안드로이드로 핀치 줌 (두 손가락으로 벌리고 좁힘으로써 화면을 확대, 축소 하는 기능)을 멀티 터치 이벤트로 구현하는 방법입니다.
먼저 변수 선언입니다. (클래스 내부입니다.)
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);
}
여기까지 안드로이드 핀치 줌을 멀티 터치 이벤트로 구현하는 방법이었습니다.
정보가 유익하셨다면 아래 공감버튼 눌러주시면 감사하겠습니다.
질문사항은 댓글로 달아주시면 성의껏 답변해드리겠습니다.
'Android' 카테고리의 다른 글
안드로이드 텍스트뷰 사용법 (0) | 2018.09.06 |
---|---|
안드로이드 findContours 오류 해결 (0) | 2018.09.05 |
안드로이드 OpenCV 관심영역(ROI) 추출 (3) | 2018.09.03 |
안드로이드 OpenCV 설치 (2) | 2018.09.03 |
안드로이드 이미지 뷰 여백 없애기 (0) | 2018.08.28 |
안드로이드 카메라 줌 기능 구현 (1) | 2018.08.27 |
[안드로이드] 비트맵 이진화 처리 (1) | 2018.08.25 |
[안드로이드] 실시간 SurfaceView 화면 캡쳐하기 (1) | 2018.08.24 |