일반 동작 감지

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

터치 동작은 사용자가 터치 스크린과 앱은 이러한 터치 패턴을 동작으로 해석합니다. 거기 동작 감지의 두 단계입니다.

  1. 터치 이벤트 데이터를 수집하는 중입니다.
  2. 기준 충족 여부를 판단하기 위해 데이터를 해석하는 것은 동작을 지정해야 합니다.

AndroidX 클래스

이 문서의 예에서는 GestureDetectorCompatMotionEventCompat 있습니다. 이러한 클래스는 AndroidX Library로 구성됩니다. 가능하면 AndroidX 클래스를 사용하여 이전 기기에서 사용할 수 있습니다. MotionEventCompat 아닙니다 MotionEvent 클래스에 대해 자세히 알아보세요. 정적 유틸리티 메서드를 제공합니다. 이 메서드는 연결된 작업을 수신할 MotionEvent 객체 이벤트를 처리합니다.

데이터 수집

사용자가 화면에 손가락을 한 개 이상 올려놓으면 콜백 onTouchEvent() 터치 이벤트를 수신하는 뷰에서 발생합니다. 각 터치 순서에서 위치, 압력, 크기 및 다른 위치의 추가와 같은 손가락(onTouchEvent()는 동작으로 식별됨) 여러 번 실행되었습니다.

동작은 사용자가 화면을 처음 터치할 때 시작되어 시스템은 사용자의 손가락 위치를 추적하며 사용자가 화면을 떠나는 마지막 손가락의 마지막 이벤트를 캡처합니다. 이 상호작용 전반에 걸쳐 MotionEventonTouchEvent()는 모든 상호작용의 세부정보를 제공합니다. 내 앱 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_MOVEACTION_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;
        }
    }
}

추가 리소스