본문 바로가기

안드로이드/부스트코스 안드로이드 기본편

[안드로이드 기본] 멀티 터치를 감지하는 방법

스마트폰 앱을 보면, 두손가락으로 줌인을 하거나 줌아웃을 하는 경우가 있다.

또한, 한손가락 뿐만아니라 여러손가락도 사용을 할 경우도 발생한다.

이때 포인터를 가져와서 작업해야하는데,  멀티 포인터를 가져오기 위해

가장 기본적인 멀티 터치를 감지하는 방법에 대해서 알아보려고한다.

 

코드 구현 진행순서

1. 텍스트 뷰가 두개 있는 activity_main.xml을 하나 만든다. (터치 했을 때 각 포인터의 X, Y의 값텍스트뷰에 보여줄것이다.)

2. 멀티 터치를 좌표값을 받아 올수 있는 터치 이벤트를 오버라이드 하는 MainActivity.kt를 만든다.

3. 포인터 값을 두개의 텍스트에 setText() 하여 UI로 나타낸다.

 

먼저 activity_main.xml을 만든다.

[activity_main.xml]

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/pointer1"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <TextView
        android:id="@+id/pointer2"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        app:layout_constraintLeft_toLeftOf="parent"
        app:layout_constraintRight_toRightOf="parent"
        app:layout_constraintTop_toBottomOf="@id/pointer1" />
</androidx.constraintlayout.widget.ConstraintLayout>

pointer1에는 0번째 포인터 값들을 나타낼것이고, pointer2에는 1번째 포인터 값들을 나타낼것이다.

 

다음으로는 멀티 터치를 좌표로 받아 올 수 있게 터치 이벤트를 오버라이딩 할 것이다.

[MainActivity.kt]

package com.practice.demomultitouch

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.view.MotionEvent
import kotlinx.android.synthetic.main.activity_main.*

class MainActivity : AppCompatActivity() {

    private val tagName = MainActivity::class.java.simpleName

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
    }

    override fun onTouchEvent(event: MotionEvent?): Boolean {
        //터치한 포인터 숫자
        val pointCount = event!!.pointerCount
        Log.d(tagName, "pointCount = $pointCount")

        if (event.action != MotionEvent.ACTION_UP) {
            when (pointCount) {

                //싱글 터치
                1 -> {
                    pointer1.text = ("(${event.getX(0)}, ${event.getY(0)})")
                    pointer2.text = ("")
                }

                //더블 터치
                2 -> {
                    pointer1.text = ("(${event.getX(0)}, ${event.getY(0)})")
                    pointer2.text = ("(${event.getX(1)}, ${event.getY(1)})")
                }
            }
        }
        return super.onTouchEvent(event)
    }
}

 

엑티비티에 onTouchEvent()를 오버라이딩한다.

그리고 파라미터로 넘어도 event의 pointerCount를 이용해서 포인터 갯수를 가져온다.

사용자의 액션은 터치를 화면으로 부터 띄었을 때까지 포인터를 텍스트뷰에 뿌려주게된다.

(MotionEvent.ACTION_UP : 터치스크린에서 손가락을 띄었을 경우)

 

[결과]

멀티 터치를 했을 때의 값이 텍스트 뷰에 나타남

 

위의 예제는 포인터 값만 가져올 수 있도록 하는 기본적인 방법을 다루었다.

 

앱에서 주로 사용자가 손가락을 팅기던지, 옆으로 넘기던지 등등은 이러한 포인터 값으로 계산을 해서 사용해야하는데, 계산해서 처리를 해주는 클래스 GestureDetector를 찾아보고 사용하면 될것이다.

 

멀티터치 감지 하는 전체 코드 보러가기