터치 동작은 사용자가 터치 스크린과 앱은 이러한 터치 패턴을 동작으로 해석합니다. 거기 동작 감지의 두 단계입니다.
- 터치 이벤트 데이터를 수집하는 중입니다.
- 기준 충족 여부를 판단하기 위해 데이터를 해석하는 것은 동작을 지정해야 합니다.
AndroidX 클래스
이 문서의 예에서는
GestureDetectorCompat
및
MotionEventCompat
있습니다. 이러한 클래스는 AndroidX
Library로 구성됩니다. 가능하면 AndroidX 클래스를 사용하여
이전 기기에서 사용할 수 있습니다.
MotionEventCompat
아닙니다
MotionEvent
클래스에 대해 자세히 알아보세요. 정적 유틸리티 메서드를 제공합니다. 이 메서드는
연결된 작업을 수신할 MotionEvent
객체
이벤트를 처리합니다.
데이터 수집
사용자가 화면에 손가락을 한 개 이상 올려놓으면
콜백
onTouchEvent()
터치 이벤트를 수신하는 뷰에서 발생합니다. 각 터치 순서에서
위치, 압력, 크기 및 다른 위치의 추가와 같은
손가락(onTouchEvent()
는 동작으로 식별됨)
여러 번 실행되었습니다.
동작은 사용자가 화면을 처음 터치할 때 시작되어
시스템은 사용자의 손가락 위치를 추적하며
사용자가 화면을 떠나는 마지막 손가락의 마지막 이벤트를 캡처합니다.
이 상호작용 전반에 걸쳐 MotionEvent
는
onTouchEvent()
는 모든 상호작용의 세부정보를 제공합니다. 내 앱
MotionEvent
에서 제공하는 데이터를 사용하여
중요한 동작이 발생합니다
활동 또는 뷰의 터치 이벤트 캡처
Activity
또는
View
, onTouchEvent()
콜백을 재정의합니다.
다음 코드 스니펫은
getAction()
event
매개변수에서 사용자가 수행하는 작업을 추출합니다.
이를 통해 내게 중요한 동작이 있는지 여부를 판단하는 데 필요한 원시 데이터를 얻을 수 있습니다.
알 수 있습니다.
Kotlin
class MainActivity : Activity() { ... // This example shows an Activity. You can use the same approach if you are // subclassing a View. override fun onTouchEvent(event: MotionEvent): Boolean { return when (event.action) { MotionEvent.ACTION_DOWN -> { Log.d(DEBUG_TAG, "Action was DOWN") true } MotionEvent.ACTION_MOVE -> { Log.d(DEBUG_TAG, "Action was MOVE") true } MotionEvent.ACTION_UP -> { Log.d(DEBUG_TAG, "Action was UP") true } MotionEvent.ACTION_CANCEL -> { Log.d(DEBUG_TAG, "Action was CANCEL") true } MotionEvent.ACTION_OUTSIDE -> { Log.d(DEBUG_TAG, "Movement occurred outside bounds of current screen element") true } else -> super.onTouchEvent(event) } } }
자바
public class MainActivity extends Activity { ... // This example shows an Activity. You can use the same approach if you are // subclassing a View. @Override public boolean onTouchEvent(MotionEvent event){ switch(event.getAction()) { case (MotionEvent.ACTION_DOWN) : Log.d(DEBUG_TAG,"Action was DOWN"); return true; case (MotionEvent.ACTION_MOVE) : Log.d(DEBUG_TAG,"Action was MOVE"); return true; case (MotionEvent.ACTION_UP) : Log.d(DEBUG_TAG,"Action was UP"); return true; case (MotionEvent.ACTION_CANCEL) : Log.d(DEBUG_TAG,"Action was CANCEL"); return true; case (MotionEvent.ACTION_OUTSIDE) : Log.d(DEBUG_TAG,"Movement occurred outside bounds of current screen element"); return true; default : return super.onTouchEvent(event); } }
이 코드는 사용자가 탭할 때 Logcat에서 다음과 같은 메시지를 생성합니다. 터치 및 드래그:
GESTURES D Action was DOWN GESTURES D Action was UP GESTURES D Action was MOVE
맞춤 동작의 경우 이러한 이벤트를 자체적으로 처리하여
여러분이 처리해야 하는 동작을 나타내는지 여부를 판단합니다. 하지만
앱에서 일반적인 동작(예: 두 번 탭하기, 터치, 대기, 플링 등은
Google Cloud의
GestureDetector
클래스에 대해 자세히 알아보세요. GestureDetector
를 사용하면 자주 발생하는 문제를 더 쉽게 감지할 수 있습니다.
동작을 직접 처리할 필요가 없습니다. 이것은
동작 감지에서 자세히 설명합니다.
단일 뷰의 터치 이벤트 캡처
onTouchEvent()
의 대안으로
View.OnTouchListener
임의의 View
에 대한 객체
객체를 사용하여
setOnTouchListener()
메서드를 사용하여 축소하도록 요청합니다. 이렇게 하면 서브클래스를 생성하지 않고도 터치 이벤트를 수신할 수 있습니다.
기존 View
를 사용합니다.
Kotlin
findViewById<View>(R.id.my_view).setOnTouchListener { v, event -> // Respond to touch events. true }
자바
View myView = findViewById(R.id.my_view); myView.setOnTouchListener(new OnTouchListener() { public boolean onTouch(View v, MotionEvent event) { // Respond to touch events. return true; } });
false
를 반환하는 리스너를 만들지 마세요.
ACTION_DOWN
이벤트.
이렇게 하면 이후 콜백에 리스너가 호출되지 않습니다.
ACTION_MOVE
및
ACTION_UP
시퀀스
이벤트를 수신합니다. ACTION_DOWN
이(가) 모든 서비스의 시작점이기 때문입니다.
터치 이벤트입니다.
맞춤 뷰를 만드는 경우
onTouchEvent()
를 사용합니다.
동작 감지
Android는 일반적인 네트워크 감지를 위한 GestureDetector
클래스를 제공합니다.
동작입니다. 지원되는 동작은 다음과 같습니다.
onDown()
,
onLongPress()
,
및
onFling()
입니다.
GestureDetector
를 다음과 함께 사용할 수 있습니다.
onTouchEvent()
메서드를 사용할 수 있습니다.
지원되는 모든 동작 감지
GestureDetectorCompat
객체를 인스턴스화할 때
사용하는 매개변수는
GestureDetector.OnGestureListener
인터페이스에 추가되었습니다. GestureDetector.OnGestureListener
는
발생할 수 있습니다. 모바일 앱이
GestureDetector
객체를 사용하여 이벤트를 수신하고, 뷰를 재정의하거나,
활동의 onTouchEvent()
메서드를 호출하고 관찰된 모든 이벤트를 전달합니다.
감지기 인스턴스에 연결합니다
다음 스니펫에서 true
의 반환 값은
개별 on<TouchEvent>
메서드는
처리됩니다. 반환 값 false
는 이벤트를 아래로 전달합니다.
뷰 스택을 계속 탐색해야 합니다.
테스트 앱에서 다음 스니펫을 실행하면
터치 스크린과 상호작용할 때 트리거되는 액션과 사용자가
MotionEvent
의 콘텐츠는 각 터치 이벤트에 관한 것입니다. 그러면
얼마나 많은 데이터가 생성되는지를 보여줍니다.
Kotlin
private const val DEBUG_TAG = "Gestures" class MainActivity : Activity(), GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener { private lateinit var mDetector: GestureDetectorCompat // Called when the activity is first created. public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) // Instantiate the gesture detector with the // application context and an implementation of // GestureDetector.OnGestureListener. mDetector = GestureDetectorCompat(this, this) // Set the gesture detector as the double-tap // listener. mDetector.setOnDoubleTapListener(this) } override fun onTouchEvent(event: MotionEvent): Boolean { return if (mDetector.onTouchEvent(event)) { true } else { super.onTouchEvent(event) } } override fun onDown(event: MotionEvent): Boolean { Log.d(DEBUG_TAG, "onDown: $event") return true } override fun onFling( event1: MotionEvent, event2: MotionEvent, velocityX: Float, velocityY: Float ): Boolean { Log.d(DEBUG_TAG, "onFling: $event1 $event2") return true } override fun onLongPress(event: MotionEvent) { Log.d(DEBUG_TAG, "onLongPress: $event") } override fun onScroll( event1: MotionEvent, event2: MotionEvent, distanceX: Float, distanceY: Float ): Boolean { Log.d(DEBUG_TAG, "onScroll: $event1 $event2") return true } override fun onShowPress(event: MotionEvent) { Log.d(DEBUG_TAG, "onShowPress: $event") } override fun onSingleTapUp(event: MotionEvent): Boolean { Log.d(DEBUG_TAG, "onSingleTapUp: $event") return true } override fun onDoubleTap(event: MotionEvent): Boolean { Log.d(DEBUG_TAG, "onDoubleTap: $event") return true } override fun onDoubleTapEvent(event: MotionEvent): Boolean { Log.d(DEBUG_TAG, "onDoubleTapEvent: $event") return true } override fun onSingleTapConfirmed(event: MotionEvent): Boolean { Log.d(DEBUG_TAG, "onSingleTapConfirmed: $event") return true } }
자바
public class MainActivity extends Activity implements GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener{ private static final String DEBUG_TAG = "Gestures"; private GestureDetectorCompat mDetector; // Called when the activity is first created. @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // Instantiate the gesture detector with the // application context and an implementation of // GestureDetector.OnGestureListener. mDetector = new GestureDetectorCompat(this,this); // Set the gesture detector as the double-tap // listener. mDetector.setOnDoubleTapListener(this); } @Override public boolean onTouchEvent(MotionEvent event){ if (this.mDetector.onTouchEvent(event)) { return true; } return super.onTouchEvent(event); } @Override public boolean onDown(MotionEvent event) { Log.d(DEBUG_TAG,"onDown: " + event.toString()); return true; } @Override public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) { Log.d(DEBUG_TAG, "onFling: " + event1.toString() + event2.toString()); return true; } @Override public void onLongPress(MotionEvent event) { Log.d(DEBUG_TAG, "onLongPress: " + event.toString()); } @Override public boolean onScroll(MotionEvent event1, MotionEvent event2, float distanceX, float distanceY) { Log.d(DEBUG_TAG, "onScroll: " + event1.toString() + event2.toString()); return true; } @Override public void onShowPress(MotionEvent event) { Log.d(DEBUG_TAG, "onShowPress: " + event.toString()); } @Override public boolean onSingleTapUp(MotionEvent event) { Log.d(DEBUG_TAG, "onSingleTapUp: " + event.toString()); return true; } @Override public boolean onDoubleTap(MotionEvent event) { Log.d(DEBUG_TAG, "onDoubleTap: " + event.toString()); return true; } @Override public boolean onDoubleTapEvent(MotionEvent event) { Log.d(DEBUG_TAG, "onDoubleTapEvent: " + event.toString()); return true; } @Override public boolean onSingleTapConfirmed(MotionEvent event) { Log.d(DEBUG_TAG, "onSingleTapConfirmed: " + event.toString()); return true; } }
지원되는 동작 하위 집합 감지
몇 가지 동작만 처리하려면
GestureDetector.SimpleOnGestureListener
GestureDetector.OnGestureListener
를 구현하는 대신
인터페이스에 추가되었습니다.
GestureDetector.SimpleOnGestureListener
는
모든 네이티브 광고 형식을
on<TouchEvent>
메서드를
모두 false
입니다. 이렇게 하면 호출한 메서드만
신경 쓰지 않아도 됩니다 예를 들어 다음 코드 스니펫은
GestureDetector.SimpleOnGestureListener
및 재정의
onFling()
및 onDown()
.
GestureDetector.OnGestureListener
또는
GestureDetector.SimpleOnGestureListener
로 설정하는 경우
true
를 반환하는 onDown()
메서드를 구현합니다. 이
모든 동작이 onDown()
메시지로 시작하기 때문입니다. 만약
다음과 같이 onDown()
에서 false
를 반환합니다.
GestureDetector.SimpleOnGestureListener
는 기본적으로
동작의 나머지 부분은 무시하려는 것으로 가정합니다.
GestureDetector.OnGestureListener
가 호출되지 않습니다. 이로 인해
예기치 않은 문제가 발생할 수 있습니다. 다음에서 false
만 반품
전체 동작을 무시하려면 onDown()
입니다.
Kotlin
private const val DEBUG_TAG = "Gestures" class MainActivity : Activity() { private lateinit var mDetector: GestureDetectorCompat public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) mDetector = GestureDetectorCompat(this, MyGestureListener()) } override fun onTouchEvent(event: MotionEvent): Boolean { mDetector.onTouchEvent(event) return super.onTouchEvent(event) } private class MyGestureListener : GestureDetector.SimpleOnGestureListener() { override fun onDown(event: MotionEvent): Boolean { Log.d(DEBUG_TAG, "onDown: $event") return true } override fun onFling( event1: MotionEvent, event2: MotionEvent, velocityX: Float, velocityY: Float ): Boolean { Log.d(DEBUG_TAG, "onFling: $event1 $event2") return true } } }
Java
public class MainActivity extends Activity { private GestureDetectorCompat mDetector; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); mDetector = new GestureDetectorCompat(this, new MyGestureListener()); } @Override public boolean onTouchEvent(MotionEvent event){ if (this.mDetector.onTouchEvent(event)) { return true; } return super.onTouchEvent(event); } class MyGestureListener extends GestureDetector.SimpleOnGestureListener { private static final String DEBUG_TAG = "Gestures"; @Override public boolean onDown(MotionEvent event) { Log.d(DEBUG_TAG,"onDown: " + event.toString()); return true; } @Override public boolean onFling(MotionEvent event1, MotionEvent event2, float velocityX, float velocityY) { Log.d(DEBUG_TAG, "onFling: " + event1.toString() + event2.toString()); return true; } } }