Я использую метод onTouch
, чтобы поймать прикосновение ACTION_UP
и GestureDetector
, чтобы захватить двойной кран, моя проблема - двойное нажатие приводит к крану, затем к двойному нажатию, затем кран. Есть ли способ, чтобы блок двойного крана кран или что-то в этом роде? Я знаю логично, что это делает правильно, поэтому, если вы посоветуете, я нахожу другой способ просто комментировать, пожалуйста, не голосуйте. Благодаря!Android различает между краном и двойным краном
ответ
Я предлагаю вам перейти на SimpleGestureListener и использовать методы onDoubleTap() и onSingleTapConfirmed().
То, что я искал, хорошо, я буду смотреть на это сейчас! Благодаря! Я выглядел, хотя документы не могли поверить, что я этого не видел! – Osman
Чтобы быть точным, это GestureDetector, который выполняет всю работу, SimpleGestureListener - это просто реализация GestureListener, которая всегда возвращает false. –
Кроме того, что предлагает britzl, вы можете проверить свою логику там на секунду.
Я не думаю, что двойной кран приводит к множественному, это просто приводит к 4 событиям, например, вы несколько упоминаете. В то время как библиотеки Жест есть (я думаю) лучший выбор, вы должны учитывать, что:
- магазин временной метки в Motionevent (это один из его методов) на ACTION_UP, а затем сравнить его с очередным действием вверх. При наличии таймаута вы узнаете, когда это крана или двойной кран.
Вот что жест слушатели делают
Чтобы быть более точным, чем то, что сказано britzl, то GestureDetector
делает фактическую работу определить, когда что-то одно нажатие, двойное нажатие, долгое нажатие, и т.д. SimpleGestureListener
- это просто «слушатель», используемый GestureDetector
, чтобы указать, что он распознал. Он реализует OnGestureListener
и OnDoubleTapListener
, чтобы всегда возвращать false. Проверьте отрывок из onTouchEvent(MotionEvent)
в GestureDetector
:
case MotionEvent.ACTION_DOWN:
if (mDoubleTapListener != null) {
boolean hadTapMessage = mHandler.hasMessages(TAP);
if (hadTapMessage) mHandler.removeMessages(TAP);
if ((mCurrentDownEvent != null) && (mPreviousUpEvent != null) && hadTapMessage &&
isConsideredDoubleTap(mCurrentDownEvent, mPreviousUpEvent, ev)) {
// This is a second tap
mIsDoubleTapping = true;
// 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
mHandler.sendEmptyMessageDelayed(TAP, DOUBLE_TAP_TIMEOUT);
}
}
mDownFocusX = mLastFocusX = focusX;
mDownFocusY = mLastFocusY = focusY;
if (mCurrentDownEvent != null) {
mCurrentDownEvent.recycle();
}
mCurrentDownEvent = MotionEvent.obtain(ev);
mAlwaysInTapRegion = true;
mAlwaysInBiggerTapRegion = true;
mStillDown = true;
mInLongPress = false;
mDeferConfirmSingleTap = false;
if (mIsLongpressEnabled) {
mHandler.removeMessages(LONG_PRESS);
mHandler.sendEmptyMessageAtTime(LONG_PRESS, mCurrentDownEvent.getDownTime()
+ TAP_TIMEOUT + LONGPRESS_TIMEOUT);
}
mHandler.sendEmptyMessageAtTime(SHOW_PRESS, mCurrentDownEvent.getDownTime() + TAP_TIMEOUT);
handled |= mListener.onDown(ev);
break;
Затем желаемый результат может быть получен путем создания GestureDetector
с соответствующим слушателем:
final View.OnTouchListener touch_listener = new View.OnTouchListener() {
@Override public boolean onTouch(View view, MotionEvent event) {
return _gesture_detector.onTouchEvent(event);
}
private final GestureDetector _gesture_detector = new GestureDetector(getContext()
, new GestureDetector.SimpleOnGestureListener() {
@Override public boolean onSingleTapConfirmed(MotionEvent event) {
// TODO: implement single tap behavior
// NOTE: returning true indicates that the gesture was handled
return true;
}
@Override public boolean onDoubleTap(MotionEvent event) {
// TODO: implement double tap behavior
// NOTE: returning true indicates that the gesture was handled
return true;
}
});
};
И оттуда, это OnTouchListener
может быть установите на View
, который хочет поведения.
Он работает с использованием по умолчанию GestureHandler
(который является Handler
):
private class GestureHandler extends Handler {
GestureHandler() {
super();
}
GestureHandler(Handler handler) {
super(handler.getLooper());
}
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case SHOW_PRESS:
mListener.onShowPress(mCurrentDownEvent);
break;
case LONG_PRESS:
dispatchLongPress();
break;
case TAP:
// If the user's finger is still down, do not count it as a tap
if (mDoubleTapListener != null) {
if (!mStillDown) {
mDoubleTapListener.onSingleTapConfirmed(mCurrentDownEvent);
} else {
mDeferConfirmSingleTap = true;
}
}
break;
default:
throw new RuntimeException("Unknown message " + msg); //never
}
}
}
Напомним линия mHandler.sendEmptyMessageDelayed(TAP, DOUBLE_TAP_TIMEOUT);
от GestureDetector
. Он задерживает уведомление о кране тайм-аутом для действительного двойного жестов. И линия if (hadTapMessage) mHandler.removeMessages(TAP);
от GestureDetector
удаляет это уведомление по действующему двойному нажатию. GestureHandler
получает уведомление о разводе после задержки и использует обратный вызов для уведомления GestureListener
с mDoubleTapListener.onSingleTapConfirmed(mCurrentDownEvent);
. GestureHandler
задержит этот обратный вызов до MotionEvent.ACTION_UP
(обрабатывается GestureDetector
) в том случае, если палец пользователя не работает, когда получено уведомление о подключении.
- 1. UIPageViewController различное поведение между салфеткой и краном
- 2. Выберите UIImageView с краном
- 3. CKComponent жест управления краном
- 4. Настройка выбора UITextView под краном
- 5. Обращение с краном в Cocos2d
- 6. В чем разница между касанием и краном в iOS
- 7. UITableView реорганизовать с краном в таблице
- 8. Как справиться с фоновым краном в UICollectionView
- 9. Устранение неполадок с помощью жестов с краном
- 10. JQuery Mobile: Связывание, если заявление с краном
- 11. Как я могу спрятать линию под краном?
- 12. Программирование BlackBerry - Закрыть всплывающее окно с краном
- 13. Работа с кликом и краном, но не с прокруткой
- 14. Запретить анимацию на UIPopover, уволенную краном на улице?
- 15. Невозможно выбрать текстовое поле с одним краном (Swift)
- 16. Обращение с краном при осложнении под watchOS 2
- 17. Обращение с краном в представленииViewController для закрытия бокового меню
- 18. две строки отмечены одним краном в списке выбора UITableView
- 19. Перемещение строки в виде таблицы с краном - Swift
- 20. Как обращаться с краном кнопки на iOS в Xamarin.Forms?
- 21. UICollectionview: didSelectItemAtIndexPath не работает с одним краном. Работает с двумя пальцами и салфеткой только
- 22. Разграничение между поплавком и двойным
- 23. Выбор между поплавком и двойным
- 24. Flex Mobile List: Как избавиться от серого наложения на краном рендера?
- 25. Есть ли значимая разница между «Двойным» и «двойным» в .Net?
- 26. Разница между двойным и длинным двойным в C++
- 27. разница между двойным указателем и массивом указателей
- 28. Разница между двойным и DOUBLE в C++
- 29. Колба-кэш не различает между GET и POST
- 30. Android ViewPager с масштабируемой ImageView
Трудно сказать, что вы можете делать неправильно из просто описания. Пожалуйста, покажите свой код. –
это не проблема с кодом, так как работает крана ACTION_DOWN и ACTION_UP, поэтому с двойным нажатием вы получаете два бонуса вверх и вниз, поэтому он работает правильно, но мне было интересно, есть ли другой способ выделить сингл и двойные краны, которые не приводят к двум кранам и двойному крану в то же самое время. – Osman