Как реализовать длинные клики в представлении, когда нужны точные координаты клика?

У меня есть класс 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 во всех нужных местах (т.е. если вы определили, что событие является событием масштабирования, событием перетаскивания или событием щелчка), и все должно быть хорошо.

Спасибо!


person Rookatu    schedule 20.07.2013    source источник


Ответы (1)


Для пользовательского обнаружения длинного касания вы можете использовать TimerTask,

Ниже приведен пример кода

public Timer mTIMERForLongTouch;
Handler mHandler = new Handler(){};
int mTIMEForLongTouch=0;
float longTouchX, longTouchY;

if(event.getAction()==MotionEvent.ACTION_DOWN)
{
// longTouchX & longTouchY is x-y coordinate of long touch
longTouchX = event.getX();
longTouchY = event.getY();
mTIMERForLongTouch = new Timer();
mTIMERForLongTouch.schedule(new TimerTask() {
        @Override
        public void run() {
            mTIMEForLongTouch+= 100;
            if(mTIMEForLongTouch>1500)
            {
                mHandler.post(new Runnable() 
                {
                    public void run() 
                    {
                        Toast.makeText(context, "Long Touch", Toast.LENGTH_SHORT).show();
                        mTIMERForLongTouch.cancel();
                        mTIMEForLongTouch=0;

                    }
                });
            }
        }
    }, 0,100);
}
else if(event.getAction()==MotionEvent.ACTION_UP)
{
    mTIMEForLongTouch=0;
    mTIMERForLongTouch.cancel();
}
person Niranj Patel    schedule 20.07.2013