Android에서 터치 위치를 얻는 방법은 무엇입니까?


92

안드로이드에서 터치 시작 위치 (X, Y), 터치 이동 위치 및 터치 끝 위치를 가져와야합니다.

답변:


169
@Override
public boolean onTouchEvent(MotionEvent event)
{
    int x = (int)event.getX();
    int y = (int)event.getY();

    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
        case MotionEvent.ACTION_MOVE:
        case MotionEvent.ACTION_UP:
    }

    return false;
}

세 가지 경우는 서로 다른 유형의 이벤트에 반응 할 수 있도록하기위한 것입니다.이 예에서는 손가락을 다시 두드 리거나 끌거나 떼는 것입니다.


7
왜 거짓을 반환합니까?
Daniel Reyhanian 2019

1
true의 반환 값은 터치 이벤트가 처리되었으며 이벤트가 전파되지 않도록하고 그 반대의 경우도 마찬가지임을 의미합니다.
chaosifier

27

추가 답변

주어진 OnTouchListener

private View.OnTouchListener handleTouch = new View.OnTouchListener() {

    @Override
    public boolean onTouch(View v, MotionEvent event) {

        int x = (int) event.getX();
        int y = (int) event.getY();

        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
                Log.i("TAG", "touched down");
                break;
            case MotionEvent.ACTION_MOVE:
                Log.i("TAG", "moving: (" + x + ", " + y + ")");
                break;
            case MotionEvent.ACTION_UP:
                Log.i("TAG", "touched up");
                break;
        }

        return true;
    }
};

어떤 관점에서 설정 :

myView.setOnTouchListener(handleTouch);

이렇게하면 터치 리스너가 할당 된 뷰에 상대적인 터치 이벤트 좌표가 제공됩니다. 보기의 왼쪽 상단은입니다 (0, 0). 뷰 위로 손가락을 움직이면 y음수가됩니다. 손가락을 뷰의 왼쪽으로 움직이면 x음수가됩니다.

int x = (int)event.getX();
int y = (int)event.getY();

장치 화면의 왼쪽 상단 모서리를 기준으로 좌표를 원하는 경우 원시 값을 사용하십시오.

int x = (int)event.getRawX();
int y = (int)event.getRawY();

관련


이것은 작동하지만 내 테스트에서 리스너가 추가 된 뷰는 다른 뷰에서 다루지 않아야합니다. 화면에서 터치 된 위치의 절대 좌표 를 얻기 위해 프레임 레이아웃을 기본보기로 추가하고 그 위에 리스너가있는보기를 추가했습니다. return false그렇지 않으면 터치를 소비하는 것을 잊지 마십시오 .
lenooh

@lenooh, getRawX()그리고 getRawY()청취자가 추가되어있는 뷰에 상기 터치 위치의 절대 좌표를 반환한다. 그러나 당신이 맞습니다. 그 위에를 반환하는 다른 뷰가 있으면 true더 낮은 뷰에는 터치 이벤트에 대한 알림이 표시되지 않습니다.
Suragch

Suragch : 정확합니다. 나는 FrameLayout이를 사용하기 때문에, 그래서 "matchParent"을보기를 설정하지 getX()getY()잘 일 (대한 필요 getRawX/Y()).
lenooh

@Suragch 다른 뷰로 가려 지거나 버튼과 같은 자식이 있어도 터치를 기록 할 수 있습니까?
vignesh kumar

@vigneshkumar, 뷰는 아래에서 위로 터치 이벤트에 대한 알림을 받으므로 (내 답변 하단의 링크 참조) 이벤트를 기록한 onInterceptTouchEvent다음 반환 false하여 이벤트가 정상적으로 처리 되도록 할 수 있습니다.
Suragch

10
@Override
    public boolean onTouch(View v, MotionEvent event) {
       float x = event.getX();
       float y = event.getY();
       return true;
    }

0

다음은 Koltin 스타일입니다. 저는 이것을 제 프로젝트에서 사용하며 매우 잘 작동합니다.

this.yourview.setOnTouchListener(View.OnTouchListener { _, event ->
        val x = event.x
        val y = event.y

        when(event.action) {
            MotionEvent.ACTION_DOWN -> {
                Log.d(TAG, "ACTION_DOWN \nx: $x\ny: $y")
            }
            MotionEvent.ACTION_MOVE -> {
                Log.d(TAG, "ACTION_MOVE \nx: $x\ny: $y")
            }
            MotionEvent.ACTION_UP -> {
                Log.d(TAG, "ACTION_UP \nx: $x\ny: $y")
            }
        }
        return@OnTouchListener  true
    })
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.