이번 예제는 지난번에 글로 설명한 멀티터치 이벤트에서 달라지는 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들은
아래에서 자세히 설명해놨으니 모르시는 분들은 보면 될 것 같다.
그럼 이제 한번 실행을 해서 한번 확인해보자.
세게 손가락 터치했을 때 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부터 채워지는 것을 볼 수가 있다.
'코딩일기 > android studio' 카테고리의 다른 글
안드로이드 독학 14일차 : 메뉴 아이템 선택 이벤트(Menu item select event) (0) | 2021.03.29 |
---|---|
안드로이드 독학 14일차 : 옵션 메뉴 생성하기(xml 편) (0) | 2021.03.29 |
안드로이드 독학 13일차 : 멀티 터치 이벤트(Multi Touch Event) (0) | 2021.03.25 |
안드로이드 독학 12일차 : 터치로 그림그리기 (0) | 2021.03.25 |
안드로이드 독학 11일차 : 터치 이벤트(Touch Event) (0) | 2021.03.24 |