У меня есть класс CustomCanvasView
, расширяющий View
, и я реализовал щелчок, перетаскивание и масштабирование для класса. Теперь я хочу реализовать длинные клики.
Из того, что я читал в разных сообщениях, у всех есть разные способ сделать это, но, по общему мнению, я должен использовать либо OnLongClickListener
, либо GestureDetector
. Однако мне нужны точные координаты длинного клика, и я беспокоюсь, что эти подходы могут не сочетаться с тем, что у меня работает в моем методе onTouch()
.
Итак, какой подход действительно лучше всего подходит для этих конкретных потребностей?
ОБНОВЛЕНИЕ
Итак, я решил измерить время вручную, установив startTime = System.nanoTime();
в случае ACTION_DOWN
моего события onTouch(...)
, а затем найдя
estimatedTime = System.nanoTime() - startTime;
seconds = (double) estimatedTime / 1000000000.0;
в случае ACTION_UP
и проверить, превышает ли это значение 1. Это сработало, поэтому я хотел добавить тактильную обратную связь.
Поскольку все это обрабатывается внутри класса (а не действия), я решил передать информацию о щелчке связанному действию и заставить его вибрировать устройство с помощью Vibrator
в случае длинного щелчка. Это также работает, но, поскольку информация не передается до тех пор, пока не завершится длинный щелчок, то есть когда произойдет вибрация.
В приложениях, которые я использовал, тактильная обратная связь хорошо проявляется, когда ваш палец опущен, так что вы можете сказать, что преодолели порог времени для длинного щелчка, прежде чем поднять палец. Есть ли способ сделать это здесь, не переделывая всю логику моего приложения? То есть, могу ли я вибрировать телефон из внутреннего класса?
ОБНОВЛЕНИЕ
Я понял, как заставить тактильную обратную связь работать лучше, чем она была. Это все еще не идеально, но вот как я это сделал.
Вместо того, чтобы проверять значение estimatedTime
в случае ACTION_UP
для onTouch(...)
, я устанавливаю логическое значение timerStarted
равным true
в случае ACTION_DOWN
, а затем в начале onTouch(...)
просто проверяю, был ли запущен таймер, и если да, то проверяю значение estimatedTime
. Если оно превышает мое пороговое значение, я сообщаю связанному действию о тактильной обратной связи. Я также установил mode = LONG_CLICK
, чтобы у меня была эта информация в случае ACTION_UP
.
Вам просто нужно убедиться, что вы установили timerStarted = false
во всех нужных местах (т.е. если вы определили, что событие является событием масштабирования, событием перетаскивания или событием щелчка), и все должно быть хорошо.
Спасибо!