Ідея полягає у створенні Runnable
для виконання тривалого клацання в майбутньому, але це виконання можна скасувати через клацання або переміщення.
Вам також потрібно знати, коли було витрачено тривалий клацання, а коли воно скасовано, оскільки палець рухався занадто сильно. Ми використовуємо initialTouchX
& initialTouchY
для перевірки, чи виходить користувач із квадрата площею 10 пікселів, по 5 з кожної сторони.
Ось мій повний код для делегування Click & LongClick з Cell
in ListView
to Activity
в OnTouchListener
:
ClickDelegate delegate;
boolean goneFlag = false;
float initialTouchX;
float initialTouchY;
final Handler handler = new Handler();
Runnable mLongPressed = new Runnable() {
public void run() {
Log.i("TOUCH_EVENT", "Long press!");
if (delegate != null) {
goneFlag = delegate.onItemLongClick(index);
} else {
goneFlag = true;
}
}
};
@OnTouch({R.id.layout})
public boolean onTouch (View view, MotionEvent motionEvent) {
switch (motionEvent.getAction()) {
case MotionEvent.ACTION_DOWN:
handler.postDelayed(mLongPressed, ViewConfiguration.getLongPressTimeout());
initialTouchX = motionEvent.getRawX();
initialTouchY = motionEvent.getRawY();
return true;
case MotionEvent.ACTION_MOVE:
case MotionEvent.ACTION_CANCEL:
if (Math.abs(motionEvent.getRawX() - initialTouchX) > 5 || Math.abs(motionEvent.getRawY() - initialTouchY) > 5) {
handler.removeCallbacks(mLongPressed);
return true;
}
return false;
case MotionEvent.ACTION_UP:
handler.removeCallbacks(mLongPressed);
if (goneFlag || Math.abs(motionEvent.getRawX() - initialTouchX) > 5 || Math.abs(motionEvent.getRawY() - initialTouchY) > 5) {
goneFlag = false;
return true;
}
break;
}
Log.i("TOUCH_EVENT", "Short press!");
if (delegate != null) {
if (delegate.onItemClick(index)) {
return false;
}
}
return false;
}
ClickDelegate
є interface
для надсилання подій кліків до класу обробника, якActivity
public interface ClickDelegate {
boolean onItemClick(int position);
boolean onItemLongClick(int position);
}
І все, що вам потрібно, це застосувати це у вашого Activity
або батьків, View
якщо вам потрібно делегувати поведінку:
public class MyActivity extends Activity implements ClickDelegate {
SomeArrayAdapter.delegate = this;
SomeViewHolder.delegate = this;
SomeCustomView.delegate = this;
@Override
public boolean onItemClick(int position) {
Object obj = list.get(position);
if (obj) {
return true;
} else {
return false;
}
}
@Override
public boolean onItemLongClick(int position) {
Object obj = list.get(position);
if (obj) {
return true;
} else {
return false;
}
}
}