Ошибка в реализации Android двойного нажатия
Я реализовал OnDoubleTapListener в своем классе Activity и переопределил три метода следующим образом.
@Override
public boolean onDoubleTap(MotionEvent e) {
// TODO Auto-generated method stub
return true;
}
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
// TODO Auto-generated method stub
if(e.getAction() == 1){
Toast.makeText(getApplicationContext(),"Double tap happened", Toast.LENGTH_SHORT).show();
}
return true;
}
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
// TODO Auto-generated method stub
return true;
}
Но когда я запускаю это на реальном устройстве, ничего не происходит. В чем ошибка? Кроме того, как я мог найти определенный записанный на пленку предмет (Двойной записанный на пленку предмет)?
Я видел некоторые учебные пособия, использующие метод onTouchEvent(MotionEvent e) и подсчитывающие разницу во времени между двумя касаниями. Как правильно сделать этот процесс?
2 ответа
Попробуйте это:
public class MyView extends View {
GestureDetector gestureDetector;
public MyView(Context context, AttributeSet attrs) {
super(context, attrs);
// creating new gesture detector
gestureDetector = new GestureDetector(context, new GestureListener());
}
// skipping measure calculation and drawing
// delegate the event to the gesture detector
@Override
public boolean onTouchEvent(MotionEvent e) {
return gestureDetector.onTouchEvent(e);
}
private class GestureListener extends GestureDetector.SimpleOnGestureListener {
@Override
public boolean onDown(MotionEvent e) {
return true;
}
// event when double tap occurs
@Override
public boolean onDoubleTap(MotionEvent e) {
float x = e.getX();
float y = e.getY();
Log.d("Double Tap", "Tapped at: (" + x + "," + y + ")");
return true;
}
}
}
Например, GestureDetector будет использовать события касания, которые у вас уже есть для детей. Если вы не хотите, чтобы вместо этого вы могли использовать следующий код, я не буду использовать ACTION_UP
поэтому мне не нужно использовать событие (будет использовано только второе нажатие)
public class DoubleTapDetector {
public interface OnDoubleTapListener {
boolean onDoubleTap(MotionEvent e);
boolean onDoubleTapEvent(MotionEvent e);
}
private int mDoubleTapSlopSquare;
private static final int DOUBLE_TAP_TIMEOUT = ViewConfiguration.getDoubleTapTimeout();
private static final int DOUBLE_TAP_MIN_TIME = 40;
private static final int DOUBLE_TAP_SLOP = 100;
private OnDoubleTapListener mDoubleTapListener;
private MotionEvent mCurrentDownEvent;
public DoubleTapDetector(Context context, OnDoubleTapListener listener) {
mDoubleTapListener = listener;
init(context);
}
private void init(Context context) {
if (mDoubleTapListener == null) {
throw new NullPointerException("OnDoubleTapListener must not be null");
}
int doubleTapSlop;
if (context == null) {
doubleTapSlop = DOUBLE_TAP_SLOP;
} else {
final ViewConfiguration configuration = ViewConfiguration.get(context);
doubleTapSlop = configuration.getScaledDoubleTapSlop();
}
mDoubleTapSlopSquare = doubleTapSlop * doubleTapSlop;
}
public boolean onTouchEvent(MotionEvent ev) {
final int action = ev.getAction();
boolean handled = false;
switch (action) {
case MotionEvent.ACTION_DOWN:
if ((mCurrentDownEvent != null) &&
isConsideredDoubleTap(mCurrentDownEvent, ev)) {
// This is a second tap
// Give a callback with the first tap of the double-tap
handled |= mDoubleTapListener.onDoubleTap(mCurrentDownEvent);
// Give a callback with down event of the double-tap
handled |= mDoubleTapListener.onDoubleTapEvent(ev);
} else {
// This is a first tap
}
if (mCurrentDownEvent != null) {
mCurrentDownEvent.recycle();
}
mCurrentDownEvent = MotionEvent.obtain(ev);
break;
}
return handled;
}
private boolean isConsideredDoubleTap(MotionEvent firstDown, MotionEvent secondDown) {
final long deltaTime = secondDown.getEventTime() - firstDown.getEventTime();
if (deltaTime > DOUBLE_TAP_TIMEOUT || deltaTime < DOUBLE_TAP_MIN_TIME) {
return false;
}
int deltaX = (int) firstDown.getX() - (int) secondDown.getX();
int deltaY = (int) firstDown.getY() - (int) secondDown.getY();
return (deltaX * deltaX + deltaY * deltaY < mDoubleTapSlopSquare);
}
}
Использование:
DoubleTapDetector doubleTapDetector = new DoubleTapDetector(conversationWindow, new DoubleTapDetector.OnDoubleTapListener() {
@Override
public boolean onDoubleTap(MotionEvent e) {
// Double tap detected.
return false;
}
@Override
public boolean onDoubleTapEvent(MotionEvent e) {
return false;
}
});
someView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View view, MotionEvent e) {
return doubleTapDetector.onTouchEvent(e);
}
});