본문 바로가기
코딩일기/android studio

안드로이드 독학 14일차 : 멀티 터치 이벤트(Multi Touch event) 자바소스 예제

by 욱파이어니어 2021. 3. 29.
728x90
반응형

이번 예제는 지난번에 글로 설명한 멀티터치 이벤트에서 달라지는 index에 대한 자바 소스 예제를 보여줄 예정이다.

 

일단 내가 만든것은 터치 이벤트가 이루어질 때마다 로그를 찍는 것이다. 

사실 좀 간지나게 만들어보고 싶었는데 그렇게 하면 쓸데없는 곳에 시간을 투자하는 거 같아 그냥 터치 이벤트가 이루어질 때마다 로그를 찍게 했다.

 

일단 xml 부터 보여주겠다.

<?xml version="1.0" encoding="utf-8"?>
<wook.co.kr.MultiTouch 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:orientation="vertical"
    tools:context=".MainActivity">
</wook.co.kr.MultiTouch>

뭐 그냥 커스텀 뷰를 만들어서 xml에 붙였다.

 

화면은 그냥 이렇다

멀티터치 이벤트는 핸드폰으로 해야 하기 때문에 핸드폰으로 직접 돌려봤다.

그럼 이제 MainActivity를 보여주겠다.

 

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(new MultiTouch(this));
    }
}

여기도 별거 없다 그냥 커스텀 뷰로 xml 화면으로 하겠다는 거다.

 

그럼 대망의 MultiTouch 커스텀뷰!

public class MultiTouch extends View {

    public MultiTouch(Context context) {
        super(context);
    }

    public MultiTouch(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
    }

    @RequiresApi(api = Build.VERSION_CODES.M)
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        //1. 터치를 하게 되면 터치된 부분을 ShowIndex로 보내줘서 처리해야한다.
        int index = event.getActionIndex(); //index 받는 부분
        int id = event.getPointerId(index); // id를 받는 부분 id를 받을때에는 index를 넘겨줘야 한다.
        switch(event.getAction() & MotionEvent.ACTION_MASK){ //MotionEvent.ACTION_MASK를 한 이유는 해당 이벤트와 새로운 이벤트를분리하기 위해서 이다.
            case MotionEvent.ACTION_DOWN: //첫 터치
                Log.v("이건 손꾸락 한개","y");
                getIndex(id, index);
                break;
            case MotionEvent.ACTION_POINTER_DOWN: //첫터치 이외의 터치
                Log.v("이건 손꾸락 여러개","y");
                getIndex(id, index);
                break;
            case MotionEvent.ACTION_POINTER_UP: //처음 눌려진거 말고 다른게 떼졌을때
                Log.v("처음거 말고 다른거 뗌","y");
                getIndex(id, index);
                break;
            case MotionEvent.ACTION_UP: //아예 모든게 떼졌을때
                Log.v("마지막 손꾸락 뗌","y");
                getIndex(id, index);
                break;

        }
        //2. 터치를 했을때 터치된 부분 동그랗게 해서 화면에 보여줘야 한다.
        return true;
    }
    public void getIndex(int id, int index){
        //index와 id 값을 받아서 View에서 출력해주는 부분
        Log.v("id & index","id: "+id+", "+"index: "+index);
    }
}

중요하게 볼 부분은 onTouchEvent이다

 

해당 부분에서는

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

라고 한 부분을 아마 처음 볼 것이다. 

 

해당 부분은 기존에 있는 이벤트와 새로 들어온 이벤트를 분리하기 위해서 

event.getAction()(기존 터치)& MotionEvent.ACTION_MASK(새로운 터치) 이렇게 한 것이다.

(아마 아닐 수도 있는데 보다가 제대로 아시는 분은 댓글로 알려주세요...)

 

그리고 그 밑에 있는 case들은 

wpioneer.tistory.com/33

 

안드로이드 독학 13일차 : 멀티 터치 이벤트(Multi Touch Event)

핸드폰을 사용하다 보면 멀티 터치가 일어날 때가 있는데 안드로이드에서는 멀티터치를 어떻게 감지하고 알아내는지 알아보자 일단 우리는 터치가 일어날 때 event는 터치가 되는 포인터를 인덱

wpioneer.tistory.com

아래에서 자세히 설명해놨으니 모르시는 분들은 보면 될 것 같다.

 

그럼 이제 한번 실행을 해서 한번 확인해보자.

세게 손가락 터치했을 때 0,1,2 이렇게 id와 index를 부여받은 것을 볼 수 있다.

근데 0번째(첫 터치)를 떼고 나서 2번째(마지막 터치)를 떴을 때 index를 보면 1로 변한 것을 볼 수가 있다.

 

이는 0번째가 떼지니 id 1번의 index는 0 id 2번의 index는 1로 수정이 된 것을 알 수 있다.

그래서 id 2번의 손을 떼니 index 1이 떼 졌다고 하는 것이다.

 

이처럼 index가 수정되는 것을 볼 수가 있다.

 

그리고 이번 멀티터치 예제를 해보면서 알게 된 것이 있는데 뭐냐면

아예 ACTION_UP(모든 터치 이벤트가 없어지는 상황)이 되지 않는 상황에서 

포인터가 두 개 이상 없어지고 나서 다시 새로운 터치가 이루어졌을 때 

새로운 터치는 이전에 없어진 포인터 중 index가 가장 낮은 순으로 

터치 이벤트에 index와 id를 부여해준다.

 

이것도 예제를 통해서 보자.

 

위처럼  0,1,2,3 터치를 하고 

1,3,2를 떼고 나서 새로운 터치를 했을 때 1부터 채워지는 것을 볼 수가 있다.

반응형