วิธีรับตำแหน่ง Touch ใน Android


92

ฉันต้องการรับตำแหน่งเริ่มต้นการสัมผัส (X, Y), ตำแหน่งการเลื่อนแบบสัมผัสและตำแหน่งสิ้นสุดของหน้าจอใน Android

คำตอบ:


171
@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

1
ค่าที่ส่งคืนเป็นจริงหมายความว่ามีการจัดการเหตุการณ์การสัมผัสและจะป้องกันไม่ให้เหตุการณ์แพร่กระจายและในทางกลับกัน
Chaosifier

28

คำตอบเพิ่มเติม

ได้รับ 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


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.