ฉันต้องการรับตำแหน่งเริ่มต้นการสัมผัส (X, Y), ตำแหน่งการเลื่อนแบบสัมผัสและตำแหน่งสิ้นสุดของหน้าจอใน Android
ฉันต้องการรับตำแหน่งเริ่มต้นการสัมผัส (X, Y), ตำแหน่งการเลื่อนแบบสัมผัสและตำแหน่งสิ้นสุดของหน้าจอใน Android
คำตอบ:
@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;
}
ทั้งสามกรณีเพื่อให้คุณสามารถตอบสนองต่อเหตุการณ์ประเภทต่างๆในตัวอย่างนี้การแตะหรือลากหรือยกนิ้วอีกครั้ง
ได้รับ 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มิฉะนั้นมันจะกินการสัมผัส
getRawX()และgetRawY()ควรส่งคืนพิกัดสัมบูรณ์ของตำแหน่งการสัมผัสในมุมมองใด ๆ ที่ผู้ฟังถูกเพิ่มเข้าไป แต่คุณพูดถูกหากมีมุมมองอื่นที่อยู่ด้านบนซึ่งส่งกลับtrueมาจะไม่มีการแจ้งยอดดูที่ต่ำกว่าถึงเหตุการณ์การสัมผัส
getX()และgetY()ทำงานได้ดี (ไม่จำเป็นสำหรับgetRawX/Y())
onInterceptTouchEventจากนั้นกลับมาfalseเพื่อให้เหตุการณ์ได้รับการประมวลผลตามปกติ
@Override
public boolean onTouch(View v, MotionEvent event) {
float x = event.getX();
float y = event.getY();
return true;
}
นี่คือสไตล์ 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
})