Android uygulamasında dokunma izleme etkinlikleri gerektiren bir sorun var (parmağınızı aşağı/yukarı hareket ettirme, taşıma, yukarı, vb.). Mevcut dokunmanın koordinatlarını almak için event.getX()
ve event.getY()
işlevlerini kullanmalıyım. Bu yüzden son birkaç ay içinde öğrendiklerinizeAndroid MotionEvent Pointer Dizini Confusion
:
MotionEvent.ACTION_DOWN
MotionEvent.ACTION_UP
kadarMotionEvent.ACTION_POINTER_UP
son dokunuş izler aşağı aşağı
MotionEvent.ACTION_POINTER_DOWN
parça müteakip dokunuşlar ilk dokunuş izlerMotionEvent.ACTION_MOVE
yukarı giden izler herhangi bir dokunma hareketini izler
Uygulamamda, ilk dokunuşum yükseldiğinde önemli bir sorunla karşılaşıyorum. Cihazımın beş parmağımın dokunulduğuna inanıyorum (bu Touch'a 0, 1, 2, 3, 4'ü arayalım). Şimdi, Touch 0'ı kaldırdığımda, MotionEvent.ACTION_POINTER_UP
aldığım işlemdir. Tamamen anlaşılabilir; Bunu anladım. Ancak, şimdi bu iki şey olur:
-
Dokunuşlar 1-4 şey taşıyın
- : Bir
IllegalArgumentException
pointerIndex aralık dışında bana alın - yukarı kaldırın Dokunuşlar 1-4 kadar her şey: bilgileri geri tükürür farklı bir dokunuş (
event.getX()
veevent.getY()
bana farklı parmak bilgi verecektir)
düzgün bu bilgileri izlemek için nasıl benim Zekâ sonuna tür değilim. Bilgileri doğru bir şekilde izleyebilmeniz veya dokunmatik göstergelerinizi nasıl dengeleyeceğiniz hakkında ipuçları var mı?
benim kod ne olduğuna dair genel düzenini sağladı ama sıra dışı bir şey yapmıyorum gibi hissediyorum (ve bunu Android örnekler üzerinde örnek kod yakındır eminim?):@Override
public boolean onTouch(View v, MotionEvent event) {
int action = event.getActionMasked();
int ptr_idx = event.getPointerId(event.getActionIndex());
try {
switch (action) {
case MotionEvent.ACTION_MOVE:
handleActionPointerMove(event);
break;
// Order of touch downs doesn't matter to us
case MotionEvent.ACTION_DOWN:
case MotionEvent.ACTION_POINTER_DOWN:
handleActionPointerDown(event, ptr_idx);
break;
case MotionEvent.ACTION_UP:
case MotionEvent.ACTION_POINTER_UP:
handleActionPointerUp(event, ptr_idx);
break;
}
}
catch (IllegalArgumentException e) {
e.printStackTrace();
return false;
}
return true;
}
}
public void handleActionPointerMove(MotionEvent event) {
for (int i = 0; i < event.getPointerCount(); i++) {
handleInformation(event.getX(i), event.getY(i));
}
}
public void handleActionPointerDown(MotionEvent event, int ptr_idx) {
handleInformation(event.getX(ptr_idx), event.getY(ptr_idx));
}
public void handleActionPointerUp(MotionEvent event, int ptr_idx) {
handleInformation(event.getX(ptr_idx), event.getY(ptr_idx));
}
public void handleInformation(int x, int y) {
// Figures out what x+y means to us (are we in a certain box within the app? outside in clear zones? etc
}