การรับพิกัด X, Y เมื่อผู้ใช้สัมผัสหน้าจอ
ตัวอย่างนี้แสดงวิธีใช้ OnTouchListener และ MotionEvent เพื่อดึงตำแหน่งการสัมผัส (Touch Coordinates) แสดงผลใน EditText
ขั้นตอนที่ 1: สร้างโปรเจกต์ใหม่
Android Studio → File → New Project → กรอกรายละเอียด → Finish
ขั้นตอนที่ 2: Layout - res/layout/activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
xmlns:tools="https://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="MainActivity">
<EditText
android:layout_width="400dp"
android:layout_height="wrap_content"
android:id="@+id/editText"
android:hint="พิกัดแกน X" />
<EditText
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:id="@+id/editText2"
android:layout_below="@+id/editText"
android:layout_alignLeft="@+id/editText"
android:layout_alignStart="@+id/editText"
android:hint="พิกัดแกน Y"
android:layout_alignRight="@+id/editText"
android:layout_alignEnd="@+id/editText" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="สัมผัสเพื่อดูพิกัด"
android:id="@+id/textview"
android:focusable="true"
android:clickable="true"
android:textSize="20dp"
android:layout_centerVertical="true"
android:layout_centerHorizontal="true" />
</RelativeLayout>
ขั้นตอนที่ 3: MainActivity.java
package app.com.sample;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
TextView T;
EditText E1, E2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
E1 = findViewById(R.id.editText);
E2 = findViewById(R.id.editText2);
T = findViewById(R.id.textview);
T.setOnTouchListener((v, event) -> {
float x = event.getX();
float y = event.getY();
E1.setText(String.valueOf(x));
E2.setText(String.valueOf(y));
return true; // รับ event นี้
});
}
}
ขั้นตอนที่ 4: AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="https://schemas.android.com/apk/res/android"
package="app.com.sample">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
ประเภท MotionEvent Action
| Action | คำอธิบาย |
|---|---|
| ACTION_DOWN | สัมผัสลงครั้งแรก |
| ACTION_MOVE | ลากนิ้วบนหน้าจอ |
| ACTION_UP | ยกนิ้วขึ้น |
| ACTION_CANCEL | ยกเลิก event (เช่น dialog ปิด) |
| ACTION_POINTER_DOWN/UP | มัลติทัช (นิ้วเพิ่ม/ลด) |
การใช้งานขั้นสูง
// ดึงพิกัดแบบ Multi-touch
int pointerCount = event.getPointerCount();
for (int i = 0; i < pointerCount; i++) {
float x = event.getX(i);
float y = event.getY(i);
int id = event.getPointerId(i);
// จัดการแต่ละนิ้ว
}
// ตรวจสอบ action type
int action = event.getActionMasked();
switch (action) {
case MotionEvent.ACTION_DOWN:
// เริ่มสัมผัส
break;
case MotionEvent.ACTION_MOVE:
// กำลังลาก
break;
case MotionEvent.ACTION_UP:
// จบการสัมผัส
break;
}
หมายเหตุ
- พิกัด (0,0) อยู่ที่มุมซ้ายบนของ View ที่ตั้ง Listener
- ใช้
getRawX(),getRawY()สำหรับพิกัดจอภาพเต็ม - return true ใน OnTouchListener = consume event (ไม่ส่งต่อ)