멀티터치 동작 처리

Compose 방식 사용해 보기
Jetpack Compose는 Android에 권장되는 UI 도구 키트입니다. Compose에서 터치 및 입력을 사용하는 방법을 알아보세요.
<ph type="x-smartling-placeholder"></ph> 멀티 터치 동작 → 를 통해 개인정보처리방침을 정의할 수 있습니다.

멀티 터치 동작은 여러 포인터 (손가락)가 할 수 있습니다. 이 문서에서는 관련된 동작을 감지하는 방법을 설명합니다. 여러 개의 포인터가 있을 수 있습니다.

여러 포인터 추적하기

여러 포인터가 동시에 화면을 탭하면 시스템에서 다음과 같은 터치 이벤트가 필요합니다.

  • ACTION_DOWN: 첫 번째 포인터가 화면을 탭할 때 전송됩니다. 이 이벤트가 동작을 시작합니다. 이 이 포인터의 포인터 데이터는 항상0 MotionEvent입니다.
  • ACTION_POINTER_DOWN: 첫 번째 이후 추가 포인터가 화면에 들어올 때 전송됩니다. 새로운 방금 아래로 내려간 포인터의 인덱스를 나타냅니다. getActionIndex()
  • ACTION_MOVE: 동작에서 변경사항이 발생할 때 전송되며, 포인터를 찾을 수 있습니다.
  • ACTION_POINTER_UP: 기본이 아닌 포인터가 위로 올라갈 때 전송됩니다. 다음 명령어로 getActionIndex()를 사용하여 방금 위로 올라간 포인터입니다.
  • ACTION_UP: 마지막 포인터가 화면을 벗어날 때 전송됩니다.
  • ACTION_CANCEL: 는 모든 포인터를 포함한 전체 동작이 취소되었음을 나타냅니다.

시작 및 종료 동작

동작은 ACTION_DOWN로 시작하는 일련의 이벤트임 이벤트이며 ACTION_UP 또는 ACTION_CANCEL 이벤트 한 번에 하나의 활성 동작이 있습니다. 이 DOWN, MOVE, UP, CANCEL 작업이 전체 동작에 적용됩니다. 예를 들어 ACTION_MOVE가 있는 이벤트는 모든 포인터의 이동을 나타낼 수 있음 그 순간에는 아래로 스크롤해야 할 수 있습니다.

포인터 추적하기

포인터의 색인과 ID를 사용하여 개별 포인터 추적하기 MotionEvent 내 위치를 전달합니다.

  • 색인: MotionEvent 저장 포인터 정보를 배열합니다. 포인터의 색인은 포인터의 배열됩니다. 대부분의 MotionEvent 메서드는 포인터 인덱스를 다음과 같이 사용합니다. 매개변수를 사용해야 합니다.
  • ID: 각 포인터에는 유지되는 ID 매핑도 있습니다. 개별 포인터 추적이 가능하도록 터치 이벤트 전체에 지속 전체 동작에서 볼 수 있습니다.

개별 포인터는 모션 이벤트 내에서 정의되지 않은 순서로 나타납니다. 따라서 포인터의 인덱스는 한 이벤트에서 다음 이벤트로 바뀔 수 있지만, 포인터 ID는 포인터가 계속 유지되는 한 일정하게 유지되는 것이 보장됨 활성화됨. 사용 getPointerId() 메서드를 사용하여 포인터의 ID를 가져와 이후의 모든에서 포인터를 추적합니다. 모션 이벤트를 생성합니다. 그런 다음, 연속적인 모션 이벤트에 대해 findPointerIndex() 메서드를 사용하여 모션 이벤트에서 주어진 포인터 ID에 대한 포인터 인덱스를 얻을 수 있습니다. 예를 들면 다음과 같습니다.

Kotlin

private var mActivePointerId: Int = 0

override fun onTouchEvent(event: MotionEvent): Boolean {
    ...
    // Get the pointer ID.
    mActivePointerId = event.getPointerId(0)

    // ... Many touch events later...

    // Use the pointer ID to find the index of the active pointer
    // and fetch its position.
    val (x: Float, y: Float) = event.findPointerIndex(mActivePointerId).let { pointerIndex ->
        // Get the pointer's current position.
        event.getX(pointerIndex) to event.getY(pointerIndex)
    }
    ...
}

자바

private int mActivePointerId;

public boolean onTouchEvent(MotionEvent event) {
    ...
    // Get the pointer ID.
    mActivePointerId = event.getPointerId(0);

    // ... Many touch events later...

    // Use the pointer ID to find the index of the active pointer
    // and fetch its position.
    int pointerIndex = event.findPointerIndex(mActivePointerId);
    // Get the pointer's current position.
    float x = event.getX(pointerIndex);
    float y = event.getY(pointerIndex);
    ...
}

여러 터치 포인터를 지원하려면 개인 ACTION_POINTER_DOWNACTION_DOWN 이벤트 시간입니다. 다음 위치에서 캐시에서 포인터를 삭제합니다. ACTION_POINTER_UPACTION_UP 이벤트를 수신합니다. 이 이러한 캐시된 ID가 다른 작업 이벤트를 올바르게 처리하는 데 도움이 되는지 확인합니다. 대상 예를 들어 ACTION_MOVE 이벤트를 처리할 때 캐시된 각 활성 포인터 ID의 경우 getX() 및 <ph type="x-smartling-placeholder">getY()</ph> 이 좌표를 캐시된 좌표와 비교하여 어느 포인터가 움직였는지 알아낼 수 있어.

다음과 함께 getActionIndex() 함수 사용 ACTION_POINTER_UPACTION_POINTER_DOWN 이벤트 전용입니다. 이 함수를 ACTION_MOVE 이벤트에는 사용하지 마세요. 항상 0를 반환합니다.

MotionEvent 작업 가져오기

사용 getActionMasked() 메서드 또는 호환성 버전 MotionEventCompat.getActionMasked() MotionEvent의 작업을 검색합니다. 앞서 말씀드린 getAction() getActionMasked() 메서드를 사용하여 여러 포인터를 찾을 수 있습니다. 포인터 색인 없이 작업을 반환합니다. 유효한 포인터 색인, getActionIndex()를 사용하여 작업과 관련된 포인터를 전달합니다.

<ph type="x-smartling-placeholder">

Kotlin

val (xPos: Int, yPos: Int) = MotionEventCompat.getActionMasked(event).let { action ->
    Log.d(DEBUG_TAG, "The action is ${actionToString(action)}")
    // Get the index of the pointer associated with the action.
    MotionEventCompat.getActionIndex(event).let { index ->
        // The coordinates of the current screen contact, relative to
        // the responding View or Activity.
        MotionEventCompat.getX(event, index).toInt() to MotionEventCompat.getY(event, index).toInt()
    }
}

if (event.pointerCount > 1) {
    Log.d(DEBUG_TAG, "Multitouch event")

} else {
    // Single touch event.
    Log.d(DEBUG_TAG, "Single touch event")
}

...

// Given an action int, returns a string description.
fun actionToString(action: Int): String {
    return when (action) {
        MotionEvent.ACTION_DOWN -> "Down"
        MotionEvent.ACTION_MOVE -> "Move"
        MotionEvent.ACTION_POINTER_DOWN -> "Pointer Down"
        MotionEvent.ACTION_UP -> "Up"
        MotionEvent.ACTION_POINTER_UP -> "Pointer Up"
        MotionEvent.ACTION_OUTSIDE -> "Outside"
        MotionEvent.ACTION_CANCEL -> "Cancel"
        else -> ""
    }
}

자바

int action = MotionEventCompat.getActionMasked(event);
// Get the index of the pointer associated with the action.
int index = MotionEventCompat.getActionIndex(event);
int xPos = -1;
int yPos = -1;

Log.d(DEBUG_TAG,"The action is " + actionToString(action));

if (event.getPointerCount() > 1) {
    Log.d(DEBUG_TAG,"Multitouch event");
    // The coordinates of the current screen contact, relative to
    // the responding View or Activity.
    xPos = (int)MotionEventCompat.getX(event, index);
    yPos = (int)MotionEventCompat.getY(event, index);

} else {
    // Single touch event.
    Log.d(DEBUG_TAG,"Single touch event");
    xPos = (int)MotionEventCompat.getX(event, index);
    yPos = (int)MotionEventCompat.getY(event, index);
}
...

// Given an action int, returns a string description
public static String actionToString(int action) {
    switch (action) {

        case MotionEvent.ACTION_DOWN: return "Down";
	case MotionEvent.ACTION_MOVE: return "Move";
	case MotionEvent.ACTION_POINTER_DOWN: return "Pointer Down";
	case MotionEvent.ACTION_UP: return "Up";
	case MotionEvent.ACTION_POINTER_UP: return "Pointer Up";
	case MotionEvent.ACTION_OUTSIDE: return "Outside";
	case MotionEvent.ACTION_CANCEL: return "Cancel";
    }
    return "";
}
<ph type="x-smartling-placeholder">
</ph> <ph type="x-smartling-placeholder">
그림 1. 멀티터치 그리기 있습니다.

추가 리소스

입력 이벤트와 관련된 자세한 내용은 다음을 참고하세요. 참조: