본문 바로가기
Development/Android

[안드로이드] 터치이벤트, 핀치 인 아웃 드래그 제어

by 푸민 2015. 8. 24.
반응형



안녕하세요 푸민입니다.

안드로이드 개발을 하다보면 TouchEvent를 아주 많이 사용합니다!

주로 Drag 와 Pinch 이벤트에서 사용하는데요.

한번 알아볼까요!


1. 먼저 해당 ViewTouchEvent를 추가합니다.


View.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View view, MotionEvent e) {
        ...
    }
}


이렇게 해도되고 OnTouchListener를 implements 로 받아서 onTouch()메소드를 구현해도되요!



2. 파라미터로 오는 View는 터치를 받고 있는 대상이고 MotionEvent가 바로 각종 모션정보를 가지고 있습니다. e.getAction()을 통해서 MotionEvent가 가지고 있는 정보를 사용할 수 있습니다.


switch (e.getAction()&MotionEvent.ACTION_MASK){
    case MotionEvent.ACTION_DOWN
//터치 다운 이벤트
    break;
    case MotionEvent.ACTION_MOVE
//터치 드래그 이벤트
    break;
    case MotionEvent.ACTION_UP
//터치 업 이벤트
    break;
    case MotionEvent.ACTION_POINTER_UP
//두번째 터치 입력 업 이벤트
    break;
    case MotionEvent.ACTION_POINTER_DOWN
//두번째 터치 입력 다운 이벤트
    break;
}


요런식으로 switch문을 사용하여 구분해줍니다.

기본적으로 ACTION_DOWN으로 시작해서 ACTION_MOVE, ACTION_UP으로 이어집니다.

순서대로 터치 다운이벤트 그리고 이동(드래그) 그리고 마지막으로 손을 땟을때 이벤트인 업이 됩니다.

주로 다운에서 이벤트에 관한 초기화를 하고 업에서 마무리해주면됩니다.



3. 좌표를 활용합니다.


e.getX();

e.getY();


해당 코드를 통해서 터치좌표를 얻어올수 있습니다.

보통 터치가 너무 정밀하기에 손을 살짝 찍었다가 때어도 다운, 무브, 업 이 불립니다.

그래서 무브 이벤트는 정말 사용자가 드래그이동할때만 인식하기 위해서 일정수의 보정치가 있습니다.


int mTouchSlop = ViewConfiguration.get(mContext).getScaledTouchSlop();


위의 mTouchSlop이 바로 보정치입니다.

그래서 무브에서 해당 수치보다 높을때 드래그로 판단하시면 됩니다!


4. 핀치 이벤트를 활용합니다.

핀치이벤트는 MotionEvent.ACTION_POINTER_DOWN 과 MotionEvent.ACTION_POINTER_UP 을 통해서 제어할 수 있습니다.

처음 손가락이 터치된 상태에서 두번째 손가락이 터치되면 ACTION_POINTER_DOWN 가 불려집니다.

즉 이것을 활용하면 이와 같이 코딩할수 있습니다.


case MotionEvent.ACTION_MOVE: //터치 드래그 이벤트
if(mode == 0){
    mode = 1;
}
if(mode == 1){
    //드래그 이벤트 처리
}
if(mode == 2){
    //핀치 수치 확인 
}
break;
case MotionEvent.ACTION_POINTER_DOWN: //두번째 터치 다운 이벤트
mode = 2;
break;
case MotionEvent.ACTION_POINTER_UP: //두번째 터치 업 이벤트
    //핀치 줌인 아웃 시 처리
break;


또한 터치 이벤트 리턴값을 true로 하면 하위에 있는 뷰들은 터치이벤트 및 클릭 이벤트를 받을 수 없게 됩니다.


즐코딩되세요~

반응형

댓글