스마트폰 앱을 보면, 두손가락으로 줌인을 하거나 줌아웃을 하는 경우가 있다.
또한, 한손가락 뿐만아니라 여러손가락도 사용을 할 경우도 발생한다.
이때 포인터를 가져와서 작업해야하는데, 멀티 포인터를 가져오기 위해
가장 기본적인 멀티 터치를 감지하는 방법에 대해서 알아보려고한다.
코드 구현 진행순서는
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를 찾아보고 사용하면 될것이다.
'안드로이드 > 부스트코스 안드로이드 기본편' 카테고리의 다른 글
[안드로이드 기본] 그리드뷰 사용방법 (0) | 2020.02.24 |
---|---|
[안드로이드 기본] 스크롤뷰 사용방법 (0) | 2020.02.24 |
[안드로이드 기본] 기본 다이얼로그 띄우기 (0) | 2020.01.29 |
[안드로이드 기본] 터치 이벤트 순서 알아보기 (0) | 2020.01.16 |
[안드로이드 기본] 클릭 이벤트 붙이는 방법 (0) | 2020.01.15 |